Apache afferma che DocumentRoot non esiste quando esiste


12

Ho usato Webmin per creare il seguente host virtuale:

<VirtualHost *:80>
        DocumentRoot "/var/www/whatever"
        ServerName whatever.ourdomain
        <Directory "/var/www/whatever">
                allow from all
                Options +Indexes
        </Directory>
</VirtualHost>

E quando riavvio Apache ottengo

Starting httpd: Warning: DocumentRoot [/var/www/whatever] does not exist

Il fatto è che la directory esiste assolutamente. Lo sto fissando. pwdmi mostra che è la mia directory corrente, ecc. Non è difficile scriverlo nel modo giusto. Non riesco a trovare altri errori o avvisi nei registri httpd. apache: apache possiede la directory e tutte le sottodirectory / file. Non ci sono link simbolici o niente coinvolti qui. Cosa mi sto perdendo o cos'altro dovrei guardare per determinare perché questo è?

Il sistema operativo è CentOS 6.0


su all'utente Apache e vedere se può accedere a DocumentRoot, che potrebbe darti un'idea di ciò che sta vedendo il web server. Potresti anche voler controllare le altre directory lungo il percorso, anche se è davvero sotto /var/www/quelle non dovrebbe essere un problema
voretaq7

Risposte:


8

La prima cosa che mi è venuta in mente è che Apache ha il permesso di accedere a quella directory?

Inoltre, questo: /programming/3948038/apache-says-my-documentroot-directory-doesnt-exist


1
Come ho detto, sì, la directory è di proprietà di apache:apache, tuttavia ho seguito quel link (che è su SO per qualche motivo?) E in effetti SELinux era il problema. SELinux causa più problemi che fa bene imo.
Jake Wilson,

selinux all'inizio è fastidioso, ma se conosci i comandi per gestire l'accesso, in realtà non è così scoraggiante. È un buon strumento da usare una volta che ti ci abitui.
Rilindo,

Ho avuto lo stesso problema (non esiste su un collegamento simbolico), e in esecuzione setenforce 0risolto, ma guardando le autorizzazioni ls-laZ, il collegamento simbolico ha le stesse autorizzazioni di altri file a cui può accedere, a parte chmod. I file sono -rw-r - r-- e il collegamento simbolico è lrwxrwxrwx. Potrebbe essere questo il motivo per cui non funziona con setenforce 1?
TMH,

@JakeWilson SELinux è piuttosto frustrante quando ti abitui per la prima volta. Più impari a usarlo, ti prometto che lo apprezzerai molto di più.
Spencer Williams,

16

Ecco un approccio tutorial al caso SELinux:

Scopri se SELinux è attivo:

 $ sestatus
 SELinux status:                 enabled
 SELinuxfs mount:                /selinux
 Current mode:                   enforcing
 Mode from config file:          enforcing
 Policy version:                 24
 Policy from config file:        targeted

In tal caso, alcuni controlli comparativi potrebbero aiutare. Ad esempio, un server ha un DocumentRoot predefinito in /var/www/html, ma lo vogliamo da qualche altra parte come /path/to/document/root.

Se SELinux non sta attivamente scherzando con la risorsa, ls -dZnella directory mostrerà qualcosa del tipo:

$ ls -dZ /path/to/document/root
? /path/to/document/root/

D'altra parte, se si applicano i contesti SELinux, ls -dZè più simile a:

$ ls -dZ /path/to/document/root
drwxrws--x+ cfgadm cfgadmin system_u:object_r:file_t:s0 /path/to/document/root

Se confrontiamo con un DocumentRoot funzionante, sarebbe simile a:

$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

L' _re _triguardano -r( --rolee -t( --type) argomenti chconEcco un cut-down man page.:

NAME
   chcon - change file security context

SYNOPSIS
   chcon [OPTION]... CONTEXT FILE...
   chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
   chcon [OPTION]... --reference=RFILE FILE...

DESCRIPTION
   Change the security context of each FILE to CONTEXT.  With --reference,
   change the security context of each FILE to that of RFILE.

   --reference=RFILE
          use RFILE's security context rather than  specifying a CONTEXT value

   -R, --recursive
          operate on files and directories recursively

A prima vista, potrebbe sembrare che ciò che segue funzioni, ma potrebbe non funzionare.

$ sudo chcon -R -t httpd_sys_content_t /path/to/document/root

Se il server Web non riesce ancora a visualizzare DocumentRoot, tieni presente che il contesto è importante fino alla radice:

$ sudo chcon -R -t httpd_sys_content_t /path/to/document
$ sudo chcon -R -t httpd_sys_content_t /path/to
$ sudo chcon -R -t httpd_sys_content_t /path

A questo punto, il web server può vedere la directory.

Sì, stasera ho imparato a mie spese.

NOTA: L'uso di chcon ha concettualmente un aspetto negativo per la documentazione di RedHat ( 5.6.1. Modifiche temporanee: chcon ) che afferma:

The chcon command changes the SELinux context for files. However, changes
made with the chcon command do not survive a file system relabel, or the
execution of the restorecon command.

Usa semanage e restorecon per apportare modifiche permanenti. Un breve esempio:

 $ sudo semanage fcontext --add -t httpd_sys_content_t -s system_u \
     "/path/to/document/root(/.*)?"
 $ sudo restorecon -FR /path/to/document/root

Per quanto riguarda Restorecon , si noti che -F è necessario per influenzare l'intero contesto (utente e tipo). Inoltre, -R significa apportare modifiche in modo ricorsivo. Gli argomenti -v o -p possono mostrare i progressi in modo dettagliato o conciso. Usa -FRnv per vedere cosa succederebbe senza apportare modifiche.

Una volta utilizzata la semanage in questo modo, è possibile visualizzare le modifiche di sicurezza locali con un comando come:

$ sudo semanage export

L'output dell'esportazione di semanage può essere salvato e utilizzato dall'importazione di semanage per semplificare l'applicazione di una serie di modifiche a vari sistemi.

NOTA: questa risposta fornisce un contesto di tipo molto semplice per un sito. La sicurezza può essere molto più granulare. Ad esempio, vedere un elenco di tipi che possono essere applicati alle pagine del server Web con un comando come:

$ seinfo -t | grep http

NOTA: utilità come semanage e seinfo potrebbero non essere installate per impostazione predefinita. Almeno su alcune distribuzioni, i pacchetti richiesti possono essere chiamati in questo modo:

policycoreutils-python
setools-console

Dettagliato, funziona e fa risparmiare molto tempo - grazie!
NorthBridge,

6

Sembra SELinux, ti suggerirei di lavorare con esso. Cerca nella directory / var / log / audit per confermare.

Peggio ancora, puoi sempre disattivare selinux, come notato in precedenza, ma ti suggerisco di lavorare con esso invece. Ad esempio, se dovessi creare una directory da utilizzare con Apache, non avrà il contesto giusto, come indicato qui.

[root@amp23140 www]# ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 whatever

Quindi, se ciò accade, applico il contesto da un'altra directory, che in questo caso è html:

[root@amp23140 www]# chcon whatever --reference=html
[root@amp23140 www]# ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 whatever

0

Utilizzare questo comando in root per modificare il contesto di sicurezza di "httpd_sys_content_t" che consente l'esecuzione di Apache.

chcon -R -h -t httpd_sys_content_t /var/www/whatever

Utilizzare ls -dZ /var/www/whateverper visualizzare i ruoli di sicurezza dei dettagli

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.