2015-03-04 39 views
12

Prima di gridare DUPLICATO! e bandiscimi nell'abisso, ascoltami. :)Centos 7/Apache/PHP - mkdir(): Autorizzazione negata

Ho sviluppato un sito intranet per la società con cui lavoro e in origine lo stavo sviluppando direttamente dalla mia workstation con Windows 7/IIS. Poiché mi sono avvicinato al completamento del sito/applicazioni, mi è stata data una casella Centos 7 in esecuzione Apache, quindi ho iniziato il processo di migrazione su tale sistema. Ho risolto la maggior parte dei problemi minori e ho avviato il sito ora. Tuttavia, esiste una parte del sito che interagisce con il nostro database e crea una directory/file di registro in base alla persona che ha effettuato l'accesso. Questa parte utilizza la funzione mkdir(), ma sto riscontrando problemi di autorizzazione.

mkdir(): Permission denied 

Ecco quello che ho già fatto:

  • Dal momento che sto usando CentOS 7, l'utente/gruppo Apache è apache: apache. Ho usato chown e cambiato il proprietario di/var/www/html/e la cartella Logs per l'utente/gruppo di apache. Per sicurezza, ho ricontrollato httpd.conf e controllato i processi in esecuzione per assicurarmi di avere l'utente/gruppo corretto.
  • Ho tentato, solo a scopo di test, di modificare i permessi di tutte quelle cartelle su chmod 777, ma ottenendo lo stesso errore.
  • Stackfile cercatoOverflow dall'alto verso il basso e solo ottenere risposte per le cose che ho già provato, ma senza risultato.

Quindi, se io uso chmod o chown per modificare le autorizzazioni per le cartelle a cui si accede, sto ricevendo lo stesso tipo di errore. Per sicurezza, ho controllato anche l'utente PHP, e sta usando anche l'utente apache.

Se qualcuno può avere ulteriori informazioni sul motivo per cui non funziona, anche con le autorizzazioni cambiate, quindi per favore mi illumini. Se mi è capitato di perdere l'unico articolo che spiegava questa particolare situazione, allora urla duplicati e bandiscimi nell'abisso. lol :)


EDIT Okay, dopo ulteriori test, ho scoperto 2 problemi che sembrano causare questo problema globale.

  1. PHP sta cercando di impostare le autorizzazioni per la cartella quando viene creato dallo script, e sembra che il server non piace che anche se apache è il proprietario. Dopo aver rimosso quella parte del codice, l'errore delle autorizzazioni scompare e viene visualizzato un errore con "nessun file o directory di questo tipo".
  2. Durante il test di creazione di directory con l'utente Apache tramite sudo, è stato in grado di creare una directory senza problemi. Tuttavia, il mio script PHP sta creando 2 directory e quindi un file di registro nell'ultimo creato. Sembra che non sia possibile creare due directory contemporaneamente ?? Ad esempio, esiste già una cartella Logs creata e PHP sta cercando di creare due directory sotto di essa, una per l'ID dell'utente e quindi un'altra cartella all'interno di quella con la data.Quindi, una volta eseguito lo script PHP, dovrebbe creare qualcosa come "Logs/5235/3-3-2015 /"

Giusto per notare, ho provato a impostare il valore ricorsivo su true su mkdir in PHP, ma è in quel momento che ho notato i problemi dell'autorizzazione. Quando la modalità ricorsiva/viene rimossa, non ottiene il problema del permesso, ma non è in grado di creare directory annidate.


EDIT2

Per testare le mie teorie, ho rimosso la nidificazione e cercato di fare mkdir creare solo 1 directory, e sta generando gli stessi errori di prima. Sebbene sia di proprietà di Apache, e anche se l'ho impostato su 777, restituisce i problemi di autorizzazione.

+3

Hai controllato tutti i registri? ad esempio: registri SElinux. prova tail -f/var/log/* per vedere se c'è qualcos'altro là fuori. usa anche sudo per i test. ad esempio: sudo -H -u apache bash -c 'mkdir/tmp/testapache' – risyasin

+0

@Risyasin Ho già controllato tutti i registri e ottenuto lo stesso tipo di errori di registro. Ho provato a creare la directory con Apache tramite sudo, e crea la directory senza alcun problema. Forse ho scoperto la fonte del problema, aggiornerò il mio post originale con le nuove informazioni. – Fata1Err0r

+0

@Risyasin Ho aggiornato il mio post originale con le nuove informazioni. Fondamentalmente quando mkdir sta cercando di impostare le autorizzazioni ricorsive e predefinite, viene negato. Quando rimuovo la modalità ricorsiva /, non ottiene il problema del permesso, ma non crea le directory nidificate perché non pensa che la posizione esista poiché ricorsiva è falsa di default. Come già detto, ho dato la proprietà delle cartelle ad Apache e ho persino provato a impostarle su 777 per il test. – Fata1Err0r

risposta

25

Potrebbe essere che, sebbene si dispongano di autorizzazioni 755/777, SELinux blocca httpd dalla scrittura/creazione di directory.

Prova:

chcon -R -t httpd_sys_content_t /path/to/www 
chcon -R -t httpd_sys_content_rw_t /path/to/www/dir/for/rw 

Ulteriori informazioni: http://wiki.centos.org/TipsAndTricks/SelinuxBooleans

+0

Ho provato questo, e sto ancora ricevendo gli stessi errori. Mi sto istruendo su SELinux, e sto andando a curiosare ancora. Ti farò sapere cosa mi viene in mente. Grazie per la tua risposta, ottima idea da considerare. – Fata1Err0r

+0

È stato un mio errore, ho inserito il primo comando su/var/www/html e il secondo comando su/var/www/html/Logs, quando avrei dovuto farlo prima una cartella per entrambi. In ogni modo .... GRAZIE !!!!! : D Questo ha fatto il trucco per me. SELinux è piuttosto interessante e presterò più attenzione in futuro. – Fata1Err0r

+2

Il contesto corretto è httpd_sys_rw_content_t, non httpd_sys_content_rw_t – CpnCrunch

1

Non sono sicuro, ma i binari PHP del Centos potrebbero aver rotto i permessi dei file. Ci sono due modi per risolvere il problema.

  • Compilazione di PHP da zero. Preferirei questo poiché tutto il controllo sarà tuo.
  • Oppure Modifica dello script php per utilizzare la funzione Umask() di PHP. Documentation link
+0

Grazie per l'ulteriore assistenza. Ho intenzione di fare un tentativo e ti farò sapere come va. – Fata1Err0r

+1

Non ho avuto la possibilità di testarlo, ma grazie per i consigli/suggerimenti che mi hai fornito oggi. Ho imparato alcune cose belle da te, e sono sicuro che sarà utile in fondo alla strada. Inoltre, non avrei trovato la mia strada per la conclusione senza il tuo aiuto. Finì per essere un problema con il modo in cui SELinux stava gestendo il mio HTTPD. – Fata1Err0r

-1

Secondo DRU risposta

Questa questione è causa di SELinux. Utilizzare il comando muggito

chcon -R -t httpd_sys_content_rw_t/path/to/www/dir/a/rw

+1

Come è diverso da @Dru? – afxentios

Problemi correlati