2010-01-06 15 views
13

Ho uno script php che deve connettersi a un database. Le credenziali per il database sono memorizzate in un altro script php.Autorizzazioni Unix, read vs. execute (contesto PHP)

Se si impostano le autorizzazioni per il file delle credenziali su 661 in modo che Pubblico disponga dell'autorizzazione di esecuzione ma non dell'autorizzazione di lettura, questo consente allo script principale di accedere alle credenziali e connettersi al DB impedendo a qualcuno con un account utente sul server dalla visualizzazione del contenuto del file delle credenziali?

Immagino di essere confuso sulla distinzione tra lettura ed esecuzione. Uno script php (che funziona come www o qualcosa di simile) ha bisogno del permesso di lettura per includere un altro script php e utilizzare qualsiasi contenuto all'interno? O ha solo bisogno di essere eseguito? Il permesso di lettura fornisce implicitamente il permesso di esecuzione?

Sub-Question: Se imposto che tutti i miei script abbiano solo il permesso di esecuzione e non vengano letti, ci sono delle insidie ​​che dovrei aspettarmi? Ciò presuppone che lascerò qualsiasi file che ho bisogno dell'autorizzazione di lettura esplicita (file di dati) impostato per la lettura.

risposta

9

Per quanto riguarda i file, l'autorizzazione di esecuzione è irrilevante per voi: l'account utente sul quale è in esecuzione il server Web deve essere autorizzato ad accedere e leggere i file in questione. Per poter attraversare una directory, l'utente richiederà anche il permesso di esecuzione su quella directory.

Se si sta tentando di rendere i propri script leggibili dal server Web (diciamo che si sta eseguendo come account "www" che appartiene al gruppo "www"), e non da altri utenti nel sistema, ecco cosa farei (presuppone che il conto è "myuser"):

# Change owner to "myuser" and group to "www" for file(s) in question 
chown myuser:www config.php 

# 640: myuser has rw-, www has r--, world has --- 
chmod 640 config.php 

Se si vuole impedire al mondo di lettura di qualsiasi file in una directory "segreti", basta disabilitare il bit di esecuzione:

# 750: myuser has rwx, www has r-x, world has --- 
chmod 750 secrets 

Se si imposta su tutti gli script il permesso di esecuzione ma non il permesso di lettura, nessuno può eseguire cosa utile con loro (incluso il webserver) ;-)

+0

Nota che se altri utenti hanno accesso per eseguire il proprio codice PHP attraverso il server web, questo non li fermerà. In tal caso, guarda a open_basedir o a una soluzione che ti consente di eseguire diversi vhost/app come utenti diversi. – oops

+0

Sì, a un esame più attento, ho scoperto che www era un membro del gruppo per la directory su cui stavo basando la mia confusione. Non stavo cercando di hackerarlo, volevo solo emulare ciò che avevano fatto, ma senza semplicemente rispecchiarlo. – Anthony

12

Gli script vengono letti, non eseguiti. Esegui il permesso per gli script dice al loader o al kernel di leggere la riga shebang e passare lo script all'interprete nominato.

+0

Quindi, se ho uno script in una cartella chiamata "segreti" e ho dei segreti impostati per l'esecuzione solo, può qualcuno che una volta aveva accesso in lettura ai segreti (ma ora no) inserisci un nome di file direttamente su qualcosa di simile a nano e vedi ancora i contenuti? Questa è la mia vera preoccupazione, immagino. – Anthony

+0

Se "segreti" è uno script, non può essere eseguito se l'utente che esegue l'interprete non ha accesso in lettura allo script. Qualunque sia il permesso che ha avuto è irrilevante; l'unica volta che le autorizzazioni sono importanti quando il file viene aperto, sia per la lettura che per l'esecuzione. –