Autorizzazione negata nonostante le autorizzazioni appropriate che utilizzano PHP

Sto cercando di leggere un file in PHP e ottengo un errore di authorization negato anche se tutti hanno accesso in lettura al file.

Il codice PHP:

$config=file_get_contents('/opt/jenkins/home/config.xml'); 

L’errore:

 Warning: file_get_contents(/opt/jenkins/home/config.xml): failed to open stream: Permission denied in [...] 

Il permesso del filesystem:

C’è un collegamento simbolico che punta /opt/jenkins/home/ a /var/lib/jenkins e tutti hanno il permesso di lettura sul link simbolico, sulla cartella attuale e sul file.

 $ ls -lh /opt/jenkins/ lrwxrwxrwx 1 sysadmin sysadmin 16 2011-08-04 08:12 home -> /var/lib/jenkins $ ls -lh /var/lib/ | grep jenkins drwxr-xr-- 6 jenkins adm 4.0K 2011-08-04 10:04 jenkins $ ls -lh /var/lib/jenkins/config.xml -rwxr-xr-- 1 jenkins adm 3.9K 2011-08-04 10:05 /var/lib/jenkins/config.xml 

Configurazione Apache

Configurato per seguire i collegamenti simbolici ( Options All ). L’aggiunta di una direttiva di Directory per /var/lib/jenkins/ non fa alcuna differenza.

  Options All AllowOverride All Order Allow,Deny Allow from All  

informazioni addizionali

Se utilizzo il percorso attraverso il link simbolico ( "/opt/jenkins/home/config.xml" ) o il percorso reale ( "/var/lib/jenkins/config.xml" ) ho lo stesso problema.

 apache2 version=2.2.14-5ubuntu8.4 php version=5.3.2-1ubuntu4.9 

Qualche idea sul motivo per cui sto ricevendo l’errore?

La tua directory necessita dell’authorization execute perché funzioni. Non sembra avere esecuzione mondiale, e poiché jenkins è probabilmente l’utente apache, e l’utente apache non è nel gruppo adm , non funzionerebbe:

 $ ls -lh /var/lib/ | grep jenkins drwxr-xr-- 6 jenkins adm 4.0K 2011-08-04 10:04 jenkins 

Ad esempio:

 [email protected]:~$ mkdir foo [email protected]:~$ echo hello > foo/bar [email protected]:~$ chmod 777 foo/bar [email protected]:~$ ls -lsah foo/bar 4.0K -rwxrwxrwx 1 netcoder netcoder 6 2011-08-04 08:22 foo/bar [email protected]:~$ chmod 444 foo/ [email protected]:~$ ls -lsah | grep foo 4.0K dr--r--r-- 2 netcoder netcoder 4.0K 2011-08-04 08:22 foo [email protected]:~$ cat foo/bar cat: foo/bar: Permission denied 

Anche se foo/bar ha il permesso 0777 , se la directory non ha il permesso di esecuzione, la lettura dei suoi contenuti è negata.

Avrai bisogno dell’authorization per essere impostato sia per la directory di destinazione che per il collegamento simbolico.

È necessario il bit di esecuzione impostato su tutte le directory nella gerarchia fino a quel file.

 chmod o+x /var/lib/jenkins 

dovrebbe fare il trucco

(Nota: ls -lhd /var/lib/jenkins è un po ‘meglio di ls -lh ...|grep jenkins )

Un sacco di scatole moderne (oceano digitale, rackspace, ecc.) Vengono fornite con SELinux (Security Enhanced Linux) per sistemi operativi compatibili con RedHat (come CentOS). Questo getta un’altra chiave nelle opere che è necessario tenere a mente. È ansible impostare le autorizzazioni perfettamente impostate e verrà comunque negata l’authorization. È necessario definire un contesto scrivibile per SELinux:

sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite -R

Molto probabilmente il tuo utente apache non è autorizzato a leggere o accedere ai file web

  1. Controlla quale utente è in esecuzione Apache come:

     $ ps aux | grep [a]pache root 40283 0.0 0.2 472548 21116 ? Ss 14:38 0:00 /usr/sbin/apache2 -k start www-data 40287 0.0 0.1 472760 8800 ? S 14:38 0:00 /usr/sbin/apache2 -k start www-data 40288 0.0 0.1 472760 8540 ? S 14:38 0:00 /usr/sbin/apache2 -k start www-data 40289 0.0 0.1 472776 8540 ? S 14:38 0:00 /usr/sbin/apache2 -k start 
  2. Verifica la proprietà del percorso dei tuoi file web:

     $ namei -mol /home/john/app2/ f: /home/john/app2/ drwxr-xr-x root root / drwxr-xr-x root root home drwx------ john john john # <== Ahaa, no access for apache user! drwxr-xr-x john john john app2 
  3. Adeguare le autorizzazioni di conseguenza:

Bene, in questo passaggio lo lascerò a te , puoi (a) rendere l'utente apache 'john' in questo esempio . Oppure potresti (b) spostare la cartella web in un luogo fuori casa. Dove l'accesso eseguito può essere dato al gruppo o anche ad altri senza interrompere le buone pratiche di sicurezza.

un. Crea john utente apache (SOLO PER SITI DEV o se sai cosa stai facendo)

 sudo vi /etc/apache2/envars # replace export APACHE_RUN_USER=www-data export APACHE_RUN_GROUP=www-data # with export APACHE_RUN_USER=john export APACHE_RUN_GROUP=john 

b. Sposta quella cartella fuori casa ... cosa ci fa comunque?

 sudo mv /home/john/app2 /var/www/ 

Ricordarsi di cambiare il sito in modo che corrisponda a questa directory e di riavviare il server Apache.

Ecco alcuni riferimenti:

https://wiki.apache.org/httpd/13PermissionDenied

http://wiki.apache.org/httpd/FileSystemPermissions