Quali autorizzazioni dovrebbero avere i file / le cartelle del mio sito Web su un server Web Linux?


310

Questa è una domanda canonica sulle autorizzazioni dei file su un server Web Linux.

Ho un server Web Linux che esegue Apache2 che ospita diversi siti Web. Ogni sito Web ha la sua cartella in / var / www /.

/var/www/contoso.com/
/var/www/contoso.net/
/var/www/fabrikam.com/

La directory di base / var / www / è di proprietà di root: root. Apache funziona come www-data: www-data. Il sito Web di Fabrikam è gestito da due sviluppatori, Alice e Bob. Entrambi i siti Web di Contoso sono gestiti da uno sviluppatore, Eve. Tutti i siti Web consentono agli utenti di caricare immagini. Se un sito Web è compromesso, l'impatto dovrebbe essere il più limitato possibile.

Voglio conoscere il modo migliore per impostare le autorizzazioni in modo che Apache possa servire il contenuto, il sito Web sia protetto dagli attacchi e gli sviluppatori possano ancora apportare modifiche. Uno dei siti Web è strutturato in questo modo:

/var/www/fabrikam.com
    /cache
    /modules
    /styles
    /uploads
    /index.php

Come dovrebbero essere impostate le autorizzazioni su queste directory e file? Ho letto da qualche parte che non dovresti mai usare le autorizzazioni 777 su un sito web, ma non capisco quali problemi potrebbero causare. Durante periodi di grande affluenza, il sito Web memorizza automaticamente nella cache alcune pagine e memorizza i risultati nella cartella cache. Tutto il contenuto inviato dai visitatori del sito Web viene salvato nella cartella dei caricamenti.


6
Questa dovrebbe essere una risposta canonica a tutte le domande che riceviamo sulle autorizzazioni del sito Web.
Nic

"Ho letto da qualche parte che non dovresti mai usare 777 permessi su un sito web, ma non capisco ..." - allora il lettore sarà in grado di capire o almeno sarà in grado di confrontare i meriti delle risposte qui? Qualsiasi soluzione dovrebbe essere basata su requisiti specifici - i requisiti qui non sono abbastanza specifici (qual è il modello di minaccia)
symcbean

6
Adoro il fatto che tu stia chiedendo di Apache, ma stai usando i domini che Microsoft usa in genere come esempi.
gWaldo,


Puoi fare riferimento qui per i dettagli completi sull'autorizzazione che è richiesta per essere archiviata nei file e nelle cartelle del sito Web in linux serverfault.com/questions/124800/…

Risposte:


342

Quando decidi quali autorizzazioni utilizzare, devi sapere esattamente chi sono i tuoi utenti e di cosa hanno bisogno. Un server web interagisce con due tipi di utenti.

Gli utenti autenticati dispongono di un account utente sul server e possono disporre di privilegi specifici. Questo di solito include amministratori di sistema, sviluppatori e account di servizio. Solitamente apportano modifiche al sistema utilizzando SSH o SFTP.

Gli utenti anonimi sono i visitatori del tuo sito web. Sebbene non dispongano delle autorizzazioni per accedere direttamente ai file, possono richiedere una pagina Web e il server Web agisce per loro conto. È possibile limitare l'accesso degli utenti anonimi facendo attenzione alle autorizzazioni del processo del server Web. Su molte distribuzioni Linux, Apache viene eseguito come www-datautente ma può essere diverso. Usa ps aux | grep httpdo ps aux | grep apacheper vedere quale utente Apache sta usando sul tuo sistema.


Note sui permessi di Linux

Linux e altri sistemi conformi a POSIX utilizzano le autorizzazioni unix tradizionali. C'è un eccellente articolo su Wikipedia sulle autorizzazioni del filesystem, quindi non ripeterò tutto qui. Ma ci sono alcune cose di cui dovresti essere consapevole.

Il bit di esecuzione Gli
script interpretati (ad es. Ruby, PHP) funzionano bene senza il permesso di esecuzione. Solo i binari e gli script di shell richiedono il bit di esecuzione. Per attraversare (entrare) una directory, è necessario disporre dell'autorizzazione di esecuzione su quella directory. Il server web ha bisogno di questa autorizzazione per elencare una directory o servire tutti i file al suo interno.

Autorizzazioni predefinite per i nuovi file
Quando viene creato, un file eredita normalmente l'ID di gruppo di chiunque lo abbia creato. Ma a volte vuoi che i nuovi file ereditino l'id di gruppo della cartella in cui vengono creati, quindi abiliterai il bit SGID sulla cartella principale.

I valori di autorizzazione predefiniti dipendono dal tuo umask. Umask sottrae le autorizzazioni dai file appena creati, quindi il valore comune di 022 determina la creazione di file con 755. Quando si collabora con un gruppo, è utile cambiare umask in 002 in modo che i file creati possano essere modificati dai membri del gruppo. E se si desidera personalizzare le autorizzazioni dei file caricati, è necessario modificare umask per apache o eseguire chmod dopo che il file è stato caricato.


Il problema con 777

Quando sei sul chmod 777tuo sito web, non hai alcuna sicurezza. Qualsiasi utente sul sistema può modificare o eliminare qualsiasi file nel tuo sito Web. Ma più seriamente, ricorda che il server Web agisce per conto dei visitatori del tuo sito Web e ora il server Web è in grado di modificare gli stessi file che sta eseguendo. Se ci sono vulnerabilità di programmazione nel tuo sito Web, possono essere sfruttate per sfigurare il tuo sito Web, inserire attacchi di phishing o rubare informazioni dal tuo server senza che tu lo sappia.

Inoltre, se il tuo server gira su una porta ben nota (che dovrebbe impedire agli utenti non root di generare servizi di ascolto accessibili in tutto il mondo), ciò significa che il tuo server deve essere avviato da root (sebbene qualsiasi server sano cadrà immediatamente a un account meno privilegiato una volta che la porta è vincolata). In altre parole, se stai eseguendo un server web in cui l'eseguibile principale fa parte del controllo versione (ad esempio un'app CGI), lasciando le sue autorizzazioni (o, in tal caso, le autorizzazioni della directory contenente, poiché l'utente potrebbe rinominare l'eseguibile) a 777 consente a qualsiasi utente di eseguire qualsiasi eseguibile come root.


Definire i requisiti

  • Gli sviluppatori hanno bisogno dell'accesso in lettura / scrittura ai file per poter aggiornare il sito Web
  • Gli sviluppatori hanno bisogno di leggere / scrivere / eseguire su directory per poter navigare
  • Apache necessita dell'accesso in lettura ai file e agli script interpretati
  • Apache necessita dell'accesso in lettura / esecuzione a directory gestibili
  • Apache necessita dell'accesso in lettura / scrittura / esecuzione alle directory per il contenuto caricato

Gestito da un singolo utente

Se solo un utente è responsabile della manutenzione del sito, impostalo come proprietario dell'utente nella directory del sito Web e concedi all'utente tutte le autorizzazioni rwx. Apache ha ancora bisogno dell'accesso per poter servire i file, quindi imposta www-data come proprietario del gruppo e dai al gruppo le autorizzazioni rx.

Nel tuo caso, Eva, il cui nome utente potrebbe essere eve, è l'unico utente che mantiene contoso.com:

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

Se hai cartelle che devono essere scrivibili da Apache, puoi semplicemente modificare i valori di autorizzazione per il proprietario del gruppo in modo che www-data abbia accesso in scrittura.

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

Il vantaggio di questa configurazione è che diventa più difficile (ma non impossibile *) per gli altri utenti del sistema curiosare, poiché solo i proprietari di utenti e gruppi possono navigare nella directory del tuo sito web. Ciò è utile se si hanno dati segreti nei file di configurazione. Fai attenzione alla tua umask! Se si crea un nuovo file qui, i valori di autorizzazione saranno probabilmente impostati su 755. È possibile eseguire in umask 027modo che i nuovi file siano impostati su 640 ( rw- r-- ---).


Gestito da un gruppo di utenti

Se più di un utente è responsabile della manutenzione del sito, sarà necessario creare un gruppo da utilizzare per assegnare le autorizzazioni. È buona norma creare un gruppo separato per ciascun sito Web e denominare il gruppo come tale sito Web.

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

Nell'esempio precedente, abbiamo usato il proprietario del gruppo per dare privilegi ad Apache, ma ora viene usato per il gruppo di sviluppatori. Dato che il proprietario dell'utente non ci è più utile, impostarlo su root è un modo semplice per garantire che non vi siano privilegi. Apache ha ancora bisogno di accesso, quindi diamo accesso in lettura al resto del mondo.

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Se hai cartelle che devono essere scrivibili da Apache, puoi impostare Apache come proprietario dell'utente o proprietario del gruppo. Ad ogni modo, avrà tutto l'accesso di cui ha bisogno. Personalmente, preferisco renderlo il proprietario dell'utente in modo che gli sviluppatori possano comunque navigare e modificare il contenuto delle cartelle di caricamento.

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

Sebbene questo sia un approccio comune, c'è un aspetto negativo. Dal momento che ogni altro utente sul sistema ha gli stessi privilegi sul tuo sito Web di Apache, è facile per gli altri utenti navigare nel tuo sito e leggere file che possono contenere dati segreti, come i file di configurazione.

Puoi avere la tua torta e mangiarla anche tu

Questo può essere ulteriormente migliorato. È perfettamente legale per il proprietario avere meno privilegi rispetto al gruppo, quindi invece di sprecare il proprietario dell'utente assegnandolo a root, possiamo rendere Apache il proprietario dell'utente nelle directory e nei file del tuo sito web. Questa è un'inversione dello scenario del singolo manutentore, ma funziona ugualmente bene.

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Se hai cartelle che devono essere scrivibili da Apache, puoi semplicemente modificare i valori di autorizzazione per il proprietario dell'utente in modo che www-data abbia accesso in scrittura.

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Una cosa a cui prestare attenzione con questa soluzione è che l'utente proprietario di nuovi file corrisponderà al creatore invece di essere impostato su www-data. Quindi tutti i nuovi file che crei non saranno leggibili da Apache finché non li chown.


* Separazione dei privilegi di Apache

Ho accennato in precedenza che è effettivamente possibile che altri utenti curiosino nel tuo sito Web, indipendentemente dal tipo di privilegi che stai utilizzando. Per impostazione predefinita, tutti i processi Apache vengono eseguiti come lo stesso utente www-data, quindi qualsiasi processo Apache può leggere file da tutti gli altri siti Web configurati sullo stesso server e talvolta persino apportare modifiche. Qualsiasi utente in grado di far eseguire ad Apache uno script può ottenere lo stesso accesso di cui dispone Apache stesso.

Per combattere questo problema, ci sono vari approcci per privilegiare la separazione in Apache. Tuttavia, ogni approccio presenta vari svantaggi in termini di prestazioni e sicurezza. A mio avviso, qualsiasi sito con requisiti di sicurezza più elevati dovrebbe essere eseguito su un server dedicato anziché utilizzare VirtualHosts su un server condiviso.


Ulteriori considerazioni

Non ne ho parlato prima, ma di solito è una cattiva pratica avere sviluppatori che modificano direttamente il sito web. Per i siti più grandi, è molto meglio avere un qualche tipo di sistema di rilascio che aggiorna il server web dal contenuto di un sistema di controllo della versione. L'approccio del manutentore singolo è probabilmente l'ideale, ma al posto di una persona hai un software automatizzato.

Se il tuo sito Web consente caricamenti che non devono essere pubblicati, tali caricamenti devono essere archiviati in un luogo esterno alla radice Web. Altrimenti, potresti scoprire che le persone stanno scaricando file che erano destinati a essere segreti. Ad esempio, se si consente agli studenti di inviare compiti, questi devono essere salvati in una directory che non è servita da Apache. Questo è anche un buon approccio per i file di configurazione che contengono segreti.

Per un sito Web con requisiti più complessi, è possibile esaminare l'utilizzo degli elenchi di controllo di accesso . Ciò consente un controllo molto più sofisticato dei privilegi.

Se il tuo sito Web ha requisiti complessi, potresti voler scrivere uno script che configuri tutte le autorizzazioni. Provalo accuratamente, quindi tienilo al sicuro. Potrebbe valere la pena il suo peso in oro se mai ti ritrovassi a dover ricostruire il tuo sito Web per qualche motivo.


10
"chmod -R 775 fabrikam.com". Pochissimi file all'interno della maggior parte dei siti Web devono essere eseguibili; ad esempio, lo script php può essere 0640 purché il server Web li possa leggere. chmod -R a + X fabrikam.com darebbe diritti eseguibili a tutti solo nelle directory.

7
Nota bene che Apache funziona come utente apachesu sistemi derivati ​​Red Hat.
Michael Hampton

Questo è eccellente, ma c'era una cosa che non capivo: non capisco l'obiettivo o il vantaggio della strategia di rendere apache l'utente / proprietario di una directory di file se ha già la proprietà del gruppo sul file.
idiota programmatore

Questa risposta, sebbene completa, riguarda solo le autorizzazioni DAC. Penso che anche le autorizzazioni MAC dovrebbero essere prese in considerazione.
dawud,

1
Questo è un post eccellente. Ecco il mio contributo: il rovescio della medaglia dell'utilizzo dei dati www come proprietario e dev-fabrikam come gruppo (menzionato in Puoi avere la tua torta e mangiarla anche si applica (al contrario) allo scenario offerto in Gestito da un singolo utente . ogni volta che Apache crea una cartella o un file, l'utente non avrà accesso ad esso, quindi i file devono essere ricondotti all'utente originale. Non ho aggiornato la risposta in quanto non sono sicuro al 100% della mia affermazione Preferirei che altri lo confermassero prima di correggere la risposta.

14

Mi chiedo perché così tante persone usano (o raccomandano) l '"altra" (o) parte dei diritti di Linux per controllare cosa può fare Apache (e / o PHP). Impostando questa parte giusta su qualcosa di diverso da "0", si consente al mondo intero di fare qualcosa sul file / directory.

Il mio approccio è il seguente:

  • Creo due utenti separati. Uno per l'accesso SSH / SFTP (se necessario), che sarà proprietario di tutti i file e uno per l'utente PHP FastCGI (l'utente con cui verrà eseguito il sito Web). Chiamiamo questi utenti rispettivamente bob e bob-www .
  • bob avrà tutti i diritti ( rwx su cartelle, rw- su file), in modo che lui / lei possa leggere e modificare l'intero sito web.
  • Il processo PHP FastCGI richiede diritti rx su cartelle e diritti r-- su file, ad eccezione di cartelle molto specifiche come cache/o uploads/, in cui è necessaria anche l'autorizzazione "scrittura". Per dare a PHP FastCGI questa capacità, verrà eseguito come bob-www e bob-www verrà aggiunto al gruppo bob creato automaticamente .
  • Ora assicuriamo che il proprietario e il gruppo di tutte le directory e i file siano bob bob .
  • Manca qualcosa: anche noi usiamo FastCGI, ma Apache ha ancora bisogno dell'accesso in lettura, per contenuti statici o file .htaccess che proverà a leggere se AllowOverrideè impostato su qualcosa di diverso None. Per evitare di usare la parte o dei diritti, aggiungo l'utente www-data al gruppo bob .

Adesso:

  • Per controllare cosa può fare lo sviluppatore, possiamo giocare con la parte u dei diritti (ma questa è la nota sotto).
  • Per controllare cosa possono fare Apache e PHP, possiamo giocare con la parte g dei diritti.
  • La parte o è sempre impostata su 0, quindi nessun altro sul server può leggere o modificare il sito Web.
  • Non ci sono problemi quando l' utente bob crea nuovi file, poiché apparterrà automaticamente al suo gruppo principale ( bob ).

Questo è un riepilogo, ma in questa situazione, Bob è autorizzato a SSH. Se non ci dovrebbe essere nessun utente autorizzato a modificare il sito Web (ad es. Il cliente modifica il sito Web solo attraverso un pannello di amministrazione CMS e non ha conoscenza di Linux), crea comunque due utenti, ma fornisci /bin/falseanche shell per bob , e disabilita il suo login.

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

Nota: le persone tendono a dimenticare che limitare i diritti di u (proprietario) è spesso inutile e insicuro, poiché il proprietario di un file può eseguire il chmodcomando, anche i diritti sono 000.

Dimmi se il mio approccio ha alcuni problemi di sicurezza, perché non sono sicuro al 100%, ma è quello che sto usando.

Penso che questa configurazione abbia un problema: quando PHP / Apache crea un nuovo file (es. Upload), apparterrà a bob-www: bob , e bob sarà solo in grado di leggerlo. Forse setuid nella directory può risolvere il problema.


Linux ignora setuid. I nuovi file sono sempre di proprietà del creatore.
Paolo

Non capisco qualcosa Ciò non sembra incorporare la situazione in cui più sviluppatori lavorano contemporaneamente sul sito Web, poiché l'unico utente è bob. Come lo affronti? Per esempio. tramite ssh, entrambi gli utenti accedono come bob. bob (1) sente di non ricordare la password e la cambia in un'altra, ma è comunque sicuro. bob (2) prova ad accedere la prossima volta e non ci riesce.
n611x007,

2
@naxa Qualsiasi sistema marginalmente buono non dovrebbe mai avere nessuno degli sviluppatori che modifica direttamente il sito web. Idealmente, il sito Web è sotto il controllo della versione in modo tale che l'account utente "bob" tira e distribuisce automaticamente ogni versione (stabile). Pertanto, gli sviluppatori eseguono lo sviluppo fuori sede e le modifiche vengono implementate dopo essere state inviate al server di distribuzione. 'bob' è un utente di sistema che dovrebbe avere autorizzazioni di rete molto limitate, che non includono l'accesso remoto; iptables in realtà ti consente di filtrare per UID per cose come questa.
Parthian Shot,

"Mi chiedo perché così tante persone usano (o raccomandano) l '" altra "(o) parte" - quindi forse avresti dovuto pubblicare questo come una domanda piuttosto che come una risposta. Non è raro eseguire deliberatamente il webserver (come la parte più esposta del sistema) con il livello più basso di privilegi mentre supporto, sviluppo, account di amministrazione richiedono anche un accesso diverso
symcbean

@ParthianShot non puoi forzarlo a terzi (quando il sito non è gestito da te, ma la cartella esiste nel tuo server). A volte l'unica cosa che sanno cosa fare è usare ftp.
Peregring-lk,

9

Dato il rango di Google sulla risposta eccellente sopra, penso che ci sia una cosa da notare e non riesco a lasciare una nota dopo la risposta.

Continuando con l'esempio, se si prevede di utilizzare www-data come proprietario e dev-fabrikam come gruppo con 570 autorizzazioni per la directory (o il file), è importante notare che Linux ignora setuid , quindi tutti i nuovi file saranno di proprietà di utente che li ha creati. Ciò significa che dopo aver creato nuove directory e file dovrai usare qualcosa di simile a:

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

In Ubuntu 12.04 per Rackspace OpenStack, avevo un problema strano in cui non riuscivo a ottenere le autorizzazioni 570 per funzionare fino a quando non riavviavo il server, il che risolveva magicamente il problema. Stavo perdendo i capelli a un ritmo crescente per quel problema apparentemente semplice ...


Per favore lascia che sia googled: in Raspbian (aka su un lampone pi, se vuoi cambiare la proprietà di / var / www sotto lighttpd (o un altro browser web), DEVI riavviare.
gbronner

@gbronner Se questo è un problema difficile da trovare per la risoluzione, potresti considerare di pubblicarla come una domanda e fornire una risposta alla domanda. Tuttavia, è probabilmente più appropriato in un diverso sito di domande e risposte SE. La mia ipotesi è che Unix e Linux potrebbero essere un buon posto per farlo.
Paul

1
C'è anche raspberrypi.stackexchange.com; sembra che i siti SE stiano frammentando un po 'la conoscenza.
Gbronner,

@gbronner lol. Non lo sapevo! Il tag Raspbian su U&L ha qualcosa come 120 domande.
Paul

3

Vado con questa configurazione:

  1. Tutte le directory tranne caricano una serie per proprietario roote gruppo root, autorizzazioni per 0755.
  2. Tutti i file impostati su proprietario roote gruppo root, autorizzazioni su 0644.
  3. Carica la directory impostata su proprietario root, gruppo www-data, autorizzazioni su 1770. Il bit appiccicoso non consente al proprietario del gruppo di rimuovere o rinominare la directory e i file all'interno.
  4. All'interno di upload cartella una nuova directory con www-datautente e gruppo proprietario e 0700autorizzazioni per ogni www-datautente che carica file.
  5. Configurazione di Apache:

Nega AllowOverridee Indexnella directory dei caricamenti, in modo che Apache non legga i .htaccessfile e l'utente Apache non possa indicizzare il contenuto della cartella dei caricamenti:

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6. php.iniconfigurazione:

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

Con questa configurazione, l' www-datautente non sarà in grado di accedere a directory diverse da siteDir/ /tmpe /usr/share/phpmyadmin. Inoltre puoi controllare la dimensione massima del file, la dimensione massima del post e il numero massimo di file da caricare nella stessa richiesta.


3

Quando hai un utente FTP chiamato "leo" devi caricare i file nella directory web di esempio.com e hai anche bisogno che il tuo utente "apache" sia in grado di creare file uploa / sessioni / file cache nella directory cache, quindi fai come segue:

Questo comando assegna leo come proprietario e gruppo come apache a example.com, l'utente apache fa parte del gruppo apache quindi erediterà le autorizzazioni del gruppo apache

chown -R leo: apache example.com

Un altro comando che assicura il giusto permesso e soddisfa anche i problemi di sicurezza.

chmod -R 2774 example.com

Qui il primo numero 2 è per directory e assicura che ogni nuovo file creato rimarrà nello stesso gruppo e permessi del proprietario. 77 è per proprietario e gruppo significa che hanno pieno accesso. 4 è per gli altri significa che possono solo leggere attraverso.

di seguito è utile per comprendere i numeri di autorizzazione

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

1

IMO uno deve prendere in considerazione:

  • ti fidi di un processo che legge i tuoi file? per esempio. PHP?

Supponiamo che tu abbia un server che vari dati sotto "testano" l'utente.

L'utente 'test' ha lì:

  • i suoi dati in $HOMEDIR
  • la sua posta dentro $MAIL
  • i suoi dati per il web in /var/www/test

Ora pensiamo a:

  • un'app Web funziona sotto l' testutente (PHP-FPM) - può eliminare qualsiasi suo file!
  • un'app Web funziona sotto il testgruppo (PHP-FPM) - può eliminare qualsiasi suo file in cui la directory ha 'w' per il gruppo e può modificare qualsiasi file che ha 'r' per il gruppo; e potrebbe ancora leggerli, ad esempio i tuoi tasti ssh!

Supponiamo che PHP sia difettoso, e lo sei, ti fidi del suo open_basedir? Sei il chroottuo processo PHP? Che cosa non fai, vuoi che striscia su tutto il filesystem?

Il processo della tua app web, ad es. PHP-FPM, quindi dovrebbe:

  • essere limitato al percorso specifico tramite chroot
  • non deve essere eseguito con l'autorizzazione dell'utente principale o del gruppo primario del proprietario dei dati

Quindi puoi fare:

  • l'utente di prova è: test:test
  • l'utente di prova fa parte di un gruppo secondario, ad es. test-www
  • un'app Web (PHP-FPM) funziona sotto test-www:test-www
  • testare l'utente se desidera che l'app Web possa leggere i suoi file farà: chmod u=rwX,g=rX,o= /var/www/test/public
  • testare l'utente se desidera che l'app Web sia in grado di scrivere nel suo percorso di dati Web: chmod u=rwX,g=rwXs,o= /var/www/test/public/upload (quindi l'app creerà nuovi file come: test-www:test-www- avrà un gruppo test-www a causa di setgid nella directory!)

Pertanto, se il processo dell'app Web fosse falso, leggerebbe solo file specifici che avrebbero letto il gruppo e sarebbe in grado di scrivere uploadsolo in dir. Consiglio vivamente di avere quella directory uploadsu un filesystem con noexec,nodev,nosuid mountopzioni e di avere un monitoraggio costante per qualsiasi nuovo file bizzare in quella directory, oltre a monitorare anche tutti i nuovi processi sotto test-wwwuid.

Su Linux è possibile utilizzare ACL per ottimizzare le autorizzazioni. Se più di un essere umano dovesse caricare dati Web, sarebbe meglio dividere l'account umano dall'account utilizzato per caricare file di dati Web, ad es. per creare un nuovo account, ad es. test-uploade l'utente di prova gestirà le chiavi ssh per limitare quale essere umano potrebbe ssh / sftp lì. sshd_configconosce le ExposeAuthInfoopzioni quindi può essere configurato per registrare quale chiave ssh è stata usata per caricare i dati.

Dubito davvero che la maggior parte dei servizi di web hosting si preoccupi della separazione dei privilegi, quando scrivono "sicuri" senza informazioni su ciò che ottieni, direi che mentono.


php-fpm consente chroote user, groupper essere impostato per un pool. ma non mi fiderei php_admin_value[open_basedir]dell'opzione. Ho anche letto che è meglio avere un master PHP-FPM separato per utente, vedere ma.ttias.be/a-better-way-to-run-php-fpm Creare un'istanza di un demone è facile sulla maggior parte delle distribuzioni Linux e * BSD.
Jiri B,
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.