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
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
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
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: