sviluppo-web-qa.it

Qual è il modo migliore di gestire le autorizzazioni per i dati www degli utenti di Apache 2 in / var / www?

Qualcuno ha una buona soluzione per la gestione dei file in /var/www? Stiamo eseguendo host virtuali basati sul nome e l'utente Apache 2 è www-data.

Abbiamo due utenti regolari e root. Quindi, quando si scherza con i file in /var/www, piuttosto che dover ...

chown -R www-data:www-data

... tutto il tempo, qual è un buon modo di gestirlo?

Domanda supplementare: in che misura si procurano le autorizzazioni?

Questo è sempre stato un problema negli ambienti di sviluppo collaborativo.

218
Gareth

Tentativo di espandere su risposta di @ Zoredache, dato che ci provo anch'io:

  • Crea un nuovo gruppo (www-pub) e aggiungi gli utenti a quel gruppo

    groupadd www-pub

    usermod -a -G www-pub usera ## deve usare -a per aggiungere a gruppi esistenti

    usermod -a -G www-pub userb

    groups usera ## gruppi di visualizzazione per l'utente

  • Cambia la proprietà di tutto in/var/www in root: www-pub

    chown -R root:www-pub /var/www ## -R per ricorsivo

  • Modifica le autorizzazioni di tutte le cartelle su 2775

    chmod 2775 /var/www ## 2 = imposta ID gruppo, 7 = rwx per il proprietario (root), 7 = rwx per il gruppo (www-pub), 5 = rx per il mondo (compresi i dati www di Apache utente)

    Imposta ID gruppo ( SETGID ) bit (2) fa sì che il gruppo (www-pub) venga copiato in tutti i nuovi file/cartelle creati in quella cartella. Altre opzioni sono SETUID (4) per copiare l'id utente e STICKY (1) che a mio avviso consente solo al proprietario di eliminare i file.

    C'è un -R opzione ricorsiva, ma ciò non discrimina tra file e cartelle, quindi devi sa find , in questo modo:

    find /var/www -type d -exec chmod 2775 {} +

  • Cambia tutti i file in 0664

    find /var/www -type f -exec chmod 0664 {} +

  • Cambia umask per i tuoi utenti in 0002

    Umask controlla le autorizzazioni predefinite per la creazione di file, 0002 significa che i file avranno 664 e directory 775. Impostando questo (modificando la riga umask nella parte inferiore di /etc/profile nel mio caso) significa che i file creati da un utente saranno scrivibili da altri utenti nel gruppo www senza la necessità di chmod.

Prova tutto ciò creando un file e una directory e verificando il proprietario, il gruppo e le autorizzazioni con ls -l.

Nota: è necessario disconnettersi/accedere per rendere effettive le modifiche ai gruppi!

209
Tom

Non sono del tutto sicuro di come si desidera configurare le autorizzazioni, ma questo potrebbe darti un punto di partenza. Probabilmente ci sono modi migliori. Suppongo che desideri che entrambi gli utenti siano in grado di modificare qualsiasi cosa in/var/www /

  • Crea un nuovo gruppo (www-pub) e aggiungi gli utenti a quel gruppo.
  • Cambia la proprietà di tutto in/var/www in root: www-pub.
  • Modificare le autorizzazioni di tutte le cartelle su 2775
  • Cambia tutti i file in 0664.
  • Cambia umask per i tuoi utenti in 0002

Ciò significa che qualsiasi nuovo file creato da uno dei tuoi utenti dovrebbe essere un nome utente: www-pub 0664 e qualsiasi directory che verrà creata sarà un nome utente: www-pub 2775. Apache avrà accesso in lettura a tutto tramite il componente "altri utenti". Il bit SETGID sulle directory forzerà la proprietà di tutti i file creati dal gruppo proprietario della cartella. È necessario regolare umask per assicurarsi che il bit di scrittura sia impostato in modo tale che chiunque nel gruppo sia in grado di modificare i file.

Per quanto riguarda quanto hardcore vado sui permessi. Dipende completamente dal sito/server. Se ci sono solo 1-2 editor e ho solo bisogno di impedire loro di rompere le cose troppo male, allora andrò facile. Se l'azienda avesse richiesto qualcosa di più complesso, avrei creato qualcosa di più complesso.

62
Zoredache

Penso che potresti trovare POSIX ACL (liste di controllo degli accessi) utili. Consentono un modello di autorizzazione più preciso rispetto all'utente: gruppo: altro modello. Ho scoperto che sono più facili da tenere dritti nella mia testa poiché posso essere più esplicito e anche impostare il comportamento "predefinito" per un ramo del file system.

Ad esempio, è possibile specificare esplicitamente le autorizzazioni di ciascun utente:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Oppure puoi farlo in base a un gruppo condiviso:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

E forse vuoi mantenere il tuo utente Apache in sola lettura

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Pagine man:

Tutorial

39
Joe Holloway

Questa domanda era posta di nuovo , e come discussa su meta, le migliori pratiche attuali forniscono approcci migliori di quelli disponibili nel 2009, quando è stato chiesto. Questa risposta cerca di fornire alcune soluzioni attuali per gestire in modo sicuro ambienti di sviluppo web collaborativo .


Per un server Web sicuro e uno sviluppo collaborativo ci sono molto di più delle semplici autorizzazioni per i file:

  • Avere un utente separato per ogni sito cioè non servire tutti i siti usando www-data. Questo è importante, dato che al giorno d'oggi Apache raramente serve solo statico file di contenuti, ma esegue dinamico siti web. Questa risposta si concentra su PHP in quanto è la lingua più comune del sito del server, ma gli stessi principi si applicano anche agli altri.

    Se si riscontra un problema di sicurezza in un singolo sito, può diffondersi su tutti i siti in esecuzione come lo stesso utente. Un utente malintenzionato può visualizzare tutto ciò che l'utente vede, comprese le informazioni di accesso al database e modificare ogni sito a cui l'utente dispone delle autorizzazioni di scrittura.

  • Usa Protocollo di trasferimento file SSH (SFTP). Durante l'utilizzo di FTP dovrebbe essere abbandonato per motivi di sicurezza (poiché invia sia il password e il contenuto in testo semplice), è un sostituto sicuro SFTP ha anche una funzione che è una soluzione perfetta per lo sviluppo web collaborativo.

    Dopo aver isolato i siti e un utente per sito, devi dare accesso ai tuoi sviluppatori web, di cosa tratta questa domanda. Invece di dare loro le password per questi utenti del sito - o accedere ai file del sito usando i loro account utente personali come suggerito originariamente - puoi usare chiavi SSH per il login.

    Ogni sviluppatore può generare la coppia di chiavi e mantenere segreta la chiave privata. Quindi, la chiave pubblica viene aggiunta a ~/.ssh/authorized_keys file per ogni account utente del sito Web su cui sta lavorando lo sviluppatore. Questo ha molti vantaggi per la gestione di password e accessi:

    • Ogni sviluppatore può avere accesso a qualsiasi numero di siti Web senza l'onere di ricordare o archiviare tutte le password coinvolte nell'accordo utente per sito.

    • Non è necessario modificare e condividere le password ogni volta che qualcuno lascia l'azienda.

    • È possibile utilizzare password molto potenti o disabilitare del tutto l'accesso basato su password.

  • Usa PHP-FPM . È l'approccio attuale per l'esecuzione PHP come utente. Crea un nuovo pool per ogni utente, ovvero un pool per ogni sito. Questo è il migliore sia per la sicurezza che per le prestazioni, in quanto puoi anche specificare quante risorse può consumare un singolo sito.

    Vedi ad es. NeverEndingSecurity's Esegui php-fpm con utente/uid separato e gruppo su linux . Esistono tutorial come HowtoForge tilizzo di PHP-FPM con Apache su Ubuntu 16.04 che non utilizza PHP-FPM per aumentare la sicurezza attraverso la separazione degli utenti, guidando l'uso di un singolo socket FPM sul server.

11
Esa Jokinen