Come impostare i permessi linux per la cartella WWW?


69

Riepilogo aggiornato

La directory / var / www è di proprietà del root:rootche significa che nessuno può usarla ed è completamente inutile. Dal momento che tutti noi desideriamo un server web che funzioni davvero (e nessuno dovrebbe accedere come "root"), allora dobbiamo risolvere questo problema.

Solo due entità hanno bisogno di accesso.

  1. PHP / Perl / Ruby / Python necessitano tutti dell'accesso alle cartelle e ai file poiché ne creano molti (ad es /uploads/.). Questi linguaggi di scripting dovrebbero essere eseguiti con nginx o apache (o anche con altre cose come FastCGI per PHP).

  2. Gli sviluppatori

Come ottengono l'accesso? So che qualcuno, da qualche parte, l' ha già fatto. Con comunque molti miliardi di siti web là fuori penseresti che ci sarebbero più informazioni su questo argomento.


So che 777 è pieno permesso di lettura / scrittura / esecuzione per il proprietario / gruppo / altro. Quindi questo non sembra essere necessario in quanto offre agli utenti casuali le autorizzazioni complete.

Quali autorizzazioni sono necessarie per utilizzare in /var/wwwmodo che:

  1. Controllo del codice sorgente come git o svn
  2. Utenti di un gruppo come "siti Web" ( o persino aggiunti a "dati www" )
  3. Server come apache o lighthttpd
  4. E PHP / Perl / Ruby

tutti possono leggere, creare ed eseguire file (e directory) lì?

Se ho ragione, gli script di Ruby e PHP non vengono "eseguiti" direttamente, ma passati a un interprete. Quindi non è necessario eseguire l'autorizzazione per i file in /var/www...? Pertanto, sembra che l'autorizzazione corretta sarebbe quella chmod -R 1660che renderebbe

  1. tutti i file condivisibili da queste quattro entità
  2. tutti i file non eseguibili per errore
  3. bloccare tutti gli altri dalla directory interamente
  4. impostare la modalità di autorizzazione su "sticky" per tutti i file futuri

È corretto?

Aggiornamento 1: ho appena capito che i file e le directory potrebbero aver bisogno di autorizzazioni diverse - Stavo parlando dei file sopra, quindi non sono sicuro di quali dovrebbero essere le autorizzazioni della directory.

Aggiornamento 2: la struttura delle cartelle /var/wwwcambia drasticamente poiché una delle quattro entità sopra aggiunge sempre (e talvolta rimuove) cartelle e sottocartelle a molti livelli di profondità. Inoltre, creano e rimuovono i file a cui le altre 3 entità potrebbero aver bisogno di accesso in lettura / scrittura. Pertanto, le autorizzazioni devono eseguire le quattro operazioni sopra riportate sia per i file che per le directory. Dal momento che nessuno di loro dovrebbe aver bisogno di eseguire l'autorizzazione (vedi la domanda su ruby ​​/ php sopra), suppongo che l' rw-rw-r--autorizzazione sarebbe tutto ciò che è necessario e completamente sicuro poiché queste quattro entità sono gestite da personale fidato (vedi # 2) e tutti gli altri utenti su il sistema ha solo accesso in lettura.

Aggiornamento 3: si tratta di macchine per lo sviluppo personale e server di società private. Nessun "cliente web" casuale come un host condiviso.

Aggiornamento 4: questo articolo di slicehost sembra essere il migliore per spiegare cosa è necessario per impostare le autorizzazioni per la cartella www. Tuttavia, non sono sicuro di quale utente o gruppo apache / nginx con PHP OR svn / git vengano eseguiti come e come modificarli.

Aggiornamento 5: ho (penso) finalmente trovato un modo per far funzionare tutto questo (risposta sotto). Tuttavia, non so se questo è il modo corretto e SICURO per farlo. Pertanto ho iniziato una taglia. Vince la persona che ha il metodo migliore per proteggere e gestire la directory www.

Risposte:


47

Dopo ulteriori ricerche sembra un altro (forse un modo migliore) per rispondere a questo sarebbe quello di impostare la cartella www in questo modo.

  1. sudo usermod -a -G developer user1 (aggiungi ogni utente al gruppo di sviluppatori)
  2. sudo chgrp -R developer /var/www/site.com/ in modo che gli sviluppatori possano lavorare lì
  3. sudo chmod -R 2774 /var/www/site.com/ in modo che solo gli sviluppatori possano creare / modificare file (altri / world possono leggere)
  4. sudo chgrp -R www-data /var/www/site.com/uploads in modo che i dati www (apache / nginx) possano creare upload.

Poiché gitviene eseguito come viene chiamato da qualsiasi utente, finché l'utente si trova nel gruppo "sviluppatore" dovrebbe essere in grado di creare cartelle, modificare file PHP e gestire il repository git.

Nota: nel passaggio (3): "2" in 2774 significa "impostare l'ID gruppo" per la directory. Questo fa sì che i nuovi file e le sottodirectory create al suo interno ereditino l'ID gruppo della directory principale (anziché il gruppo primario dell'utente). Riferimento: http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories


Mi sembra ragionevole.
Wazoox,

Buono. Forse se posso confermare questo con un altro paio di persone userò questo approccio. Sembra essere la migliore risposta che sono stato in grado di spremere dalla gente.
Xeoncross,

Non stai specificando chi sarebbe il proprietario dei file. Lo lasceresti come root? Quindi solo i sudoer possono modificare la cartella dei caricamenti (probabilmente non quella che volevi).
Nic

Sì, root rimarrebbe il proprietario. Tuttavia, poiché il proprietario del gruppo è ora "sviluppatore" (e dispone dell'autorizzazione wrx), anche tutti gli sviluppatori (e apache / nginx) potrebbero leggere. Non c'è bisogno di sudo.
Xeoncross,

7
Un'altra cosa da tenere d'occhio è umask. Molti sistemi hanno un umask predefinito di 022 che rimuoverà le autorizzazioni di scrittura sia per il gruppo che per il pubblico su nuovi file. Ho il sospetto che tu voglia 002 (nessuna scrittura per il pubblico) o 007 (nessun accesso per il pubblico). È possibile impostare umask nella configurazione di Apache e / o negli script di avvio per qualsiasi processo che richiede l'accesso alla directory. Non dimenticare di aggiungere questo a / etc / profile o / etc / bashrc in modo che sia impostato di default anche per i tuoi sviluppatori
Mark Porter

8

Non sono sicuro che sia "giusto", ma ecco cosa faccio sul mio server:

  • / var / www contiene una cartella per ciascun sito Web.
  • Ogni sito Web ha un proprietario designato, impostato come proprietario di tutti i file e le cartelle nella directory del sito Web.
  • Tutti gli utenti che gestiscono il sito Web vengono inseriti in un gruppo per il sito Web.
  • Questo gruppo è impostato come proprietario del gruppo di tutti i file e le cartelle nella directory.
  • Tutti i file o le cartelle che devono essere scritti dal server web (ad es. PHP) hanno il loro proprietario cambiato in www-data, l'utente con cui viene eseguito apache.

Tieni presente che dovresti avere il bit di esecuzione abilitato nelle directory in modo da poter elencare i contenuti.


In che modo git / svn o PHP creano quindi nuove cartelle?
Xeoncross,

2
PHP viene eseguito nello stesso contesto utente del server web, quindi può creare file e cartelle in qualsiasi directory di proprietà del server web. In genere ci sono solo poche cartelle come questa (/ uploads / per esempio). Non sono sicuro di git / svn - potresti aggiungerli all'account di gruppo che controlla il sito Web?
Nic

apparentemente git gira come l'utente che lo esegue, proprio come qualsiasi altro strumento.
Xeoncross,

Quindi aggiungi l'utente git al gruppo apache e concedi le autorizzazioni di scrittura al gruppo di cartelle.
David Rickman,

Ho appena detto, git non ha un utente - funziona come l'utente corrente che lo utilizza.
Xeoncross,

7

Dopo aver fatto ulteriori ricerche sembra che Git / svn TOOLS NON sia un problema poiché funzionano come qualsiasi utente li stia utilizzando. (Tuttavia, i demoni git / svn sono una questione diversa!) Tutto ciò che ho creato / clonato con git aveva i miei permessi e lo strumento git era elencato in modo /usr/binda adattarsi a questa tesi.

Autorizzazioni Git risolte.

I permessi degli utenti sembrano essere risolvibili aggiungendo tutti gli utenti che hanno bisogno di accedere alla directory www al www-datagruppo che eseguono apache (e nginx).

Quindi sembra che una risposta a questa domanda sia la seguente:

Di default /var/wwwè di proprietà root:roote nessuno può aggiungere o modificare file lì.

1) Cambia proprietario del gruppo

Per prima cosa dobbiamo cambiare il gruppo di directory www in modo che appartenga al gruppo "www-data" anziché al gruppo "root"

sudo chgrp -R www-data /var/www

2) Aggiungi utenti ai dati www

Quindi dobbiamo aggiungere l'utente corrente (e chiunque altro) al gruppo www-data

sudo usermod -a -G www-data demousername

3) Directory www CHMOD

Modificare le autorizzazioni in modo che SOLO il proprietario (root) e tutti gli utenti del gruppo "www-data" possano rwx (leggere / scrivere / eseguire) file e directory ( nessun altro dovrebbe essere in grado di accedervi ).

sudo chmod -R 2770 /var/www

Ora tutti i file e le directory creati da qualsiasi utente che ha accesso (vale a dire nel gruppo "www-data") saranno leggibili / scrivibili da apache e quindi php.

È corretto? Che dire dei file creati da PHP / Ruby: gli utenti dei dati www possono accedervi?


6
Non mi piace l'idea di avere tutti i file web scrivibili da PHP, aumenta la tua possibile esposizione in caso di vulnerabilità degli script.
Nic

Ok, lo so che uso PHP per creare molti file di testo, tar, log e di immagine (oltre alle cartelle), quindi stavo solo supponendo che tutto dovrebbe essere scrivibile. Tuttavia, forse il tuo diritto e PHP dovrebbero essere in grado di cambiare solo i file che crea, il che sarebbe innocuo poiché il 99% di tutte le app PHP non crea mai file di script. L'altra scelta sembra essere quella di consentire solo determinate directory PHP in scrittura (/ uploads /) che non fanno da allora perché allora PHP potrebbe ancora essere usato per creare qualcosa di brutto lì. Qualche idea?
Xeoncross,

2
Cerca di mantenere separati script e dati. Anche se un attaccante riesce a rilasciare qualcosa in / uploads /, non dovrebbe essere eseguibile. La sicurezza nei livelli è la chiave.
Nic,

6

La viscosità non è eredità delle autorizzazioni. Appiccicosità su una directory significa che solo il proprietario di un file, o il proprietario della directory, può rinominare o eliminare quel file nella directory, nonostante le autorizzazioni diano diversamente. Quindi 1777 su / tmp /.

In Unix classico, non vi è ereditarietà di autorizzazioni basata sul file system, solo sull'umask del processo corrente. Su * BSD, o Linux con setgid nella directory, il campo di gruppo dei file appena creati verrà impostato come quello della directory principale. Per di più, è necessario esaminare gli ACL, con l'ACL "predefinito" nelle directory, che consente di avere le autorizzazioni ereditate.

Dovresti iniziare definendo: * quali utenti hanno accesso al sistema * qual è il tuo modello di minaccia

Ad esempio, se stai facendo web hosting con più clienti e non vuoi che vedano i file degli altri, allora potresti usare un gruppo comune "webcusts" per tutti quegli utenti e una modalità directory di 0705. Quindi i file serviti da il processo webserver ( non in "webcusts") vedrà gli altri permanenti e sarà permesso; i clienti non possono vedere i file degli altri e gli utenti possono pasticciare con i propri file. Tuttavia, questo non significa che il momento si consente CGI o PHP si deve fare in modo che i processi eseguiti come utente specifico (buona pratica comunque, per più utenti-contro-uno-host, per la responsabilità). Altrimenti, i clienti potrebbero fare confusione con i file degli altri facendo in modo che un CGI lo faccia.

Tuttavia, se l'utente di runtime di un sito Web è uguale al proprietario del sito Web, si verificano problemi con la mancata protezione del contenuto dagli utenti abusi nel caso di una falla nella sicurezza dello script. È qui che vincono gli host dedicati, in modo da poter avere un utente di runtime distinto dal proprietario del contenuto statico e non doversi preoccupare così tanto dell'interazione con altri utenti.


Buona risposta. Su MacOS X, il sistema si comporta come se il bit SGID fosse automaticamente nelle directory. Il bit appiccicoso di solito significa che puoi rimuovere il file solo se puoi scriverlo. Cioè, chiunque può rimuovere un file scrivibile pubblicamente in / tmp. Su MacOS X, / tmp è un collegamento simbolico a una directory privata per l'utente, quindi dopo tutto non c'è condivisione.
Jonathan Leffler il

Grazie per la risposta, ho aggiornato la domanda con ulteriori informazioni.
Xeoncross,

Jonathan: il bit appiccicoso significa che solo il proprietario della directory, o il proprietario del file, può rinominarlo o eliminarlo (cioè agire sulla sua voce nella directory 'file'). Le autorizzazioni per il singolo file non entrano in gioco per queste operazioni di directory ( rename(), unlink()), ma solo per le azioni sul file stesso ( open()). Questo è il comportamento "solito".
Phil P

2

Credo che il modo migliore per farlo sia usare gli ACL Posix. Sono comodi da lavorare e offrono tutte le funzionalità di cui hai bisogno.

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs


+1 per le informazioni utili sugli ACL. Tuttavia, non voglio spazzatura extra che blocca il sistema solo per gestire un semplice server con un paio di sviluppatori. Inoltre, non mi sento a mio agio nel ricompilare il kernel per usare gli ACL.
Xeoncross,

@Xeoncross: gli ACL non impantanano nulla. Sono solo metainformazioni come normali autorizzazioni per i file. Non è poi così "extra" e complicato, credo che sia il modo più semplice e migliore per gestire le autorizzazioni piuttosto che una soluzione confusa appiccicosa / di gruppo / qualunque. Non aver paura, rimonta con acl e provalo!
Tie-fighter

1

Il proprietario del file dovrebbe essere la persona che lo crea, mentre il gruppo dovrebbe essere www-data. La modalità per directory / file è quindi in generale 755/644. Mentre per directory e file il gruppo necessita dell'accesso in scrittura la mod è 775/664. Supponiamo che Paddy sia lo sviluppatore. Complessivamente questo rende:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;

0

Aggiungendo alla risposta di @ Xeoncross, penso che sarebbe bene configurare le autorizzazioni su file e directory separatamente.

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

Ciò consentirà agli sviluppatori di creare e modificare directory all'interno di / var / www. Il che sembra importante perché, gli sviluppatori potrebbero dover creare directory aggiuntive o rimuovere una directory che non è più necessaria.

Permetterà inoltre agli sviluppatori di creare e modificare file di codice (leggi HTML, file PHP e simili). Tuttavia, consentirà comunque l'accesso in sola lettura a tutti gli altri.

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.