Ho un server abbastanza standard configurato con Apache e PHP. Un'app in esecuzione crea file e questi sono di proprietà dell'utente Apache www-data
. I file che carichi tramite SFTP sono di proprietà del mio stesso utente charlesr
. Tutti i file fanno parte del www-data
gruppo. Il mio problema è che non posso modificare o sovrascrivere nessuno dei file tramite SFTP di proprietà www-data
, anche se charlesr
fa parte del www-data
gruppo. Posso modificare i file senza problemi tramite una sessione SSH.
Quindi non sono sicuro di cosa fare. Come autorizzo la mia sessione SFTP a modificare i www-data
file di proprietà?
Per un po 'di background, queste sono le note che ho scritto per me stesso durante l'impostazione del server:
Now set up permissions on `/var/www` where your files are served from by
default:
$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www
Now log out and log in again to make the changes take hold.
The previous set of commands does the following:
1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.
E poi continuo a spiegarmi cosa significa impostare il bit SGID (cioè tutti i file creati /var/www
diventano automaticamente parte del www-data
gruppo).
AGGIORNARE
Sembra che il problema sia stato causato dall'app stessa o, più specificamente, dal framework dell'applicazione ( Kohana ) che imposta alcuni file che scrive su 0644 (rw-r - r--); cioè non scrivibile in gruppo. Questo, unito al fatto che anche i file sono di proprietà, www-data
significava che non potevo modificare i file tramite SFTP quando ho effettuato l'accesso come charlesr
. Non sono sicuro del motivo per cui ho potuto modificare i file tramite SSH. La mia ipotesi è che devo aver usato sudo.
Ecco la strategia dei permessi che ora uso grazie al instancabile aiuto di Marty Fried , che ha sottolineato i difetti della mia strategia precedente e mi ha anche aiutato a marinare nel mondo dei permessi di Linux fino a quando non l'ho finalmente criticato. Grazie Marty!
Panoramica
- I file e le directory in
/var/www
dovrebbero essere di proprietà diroot:webmasters
- Tutti gli sviluppatori dovrebbero essere membri del
webmasters
gruppo - Tutte le directory in
/var/www
devono essere impostate su:2775
ou=rwx,g=rwxs,o=rx
(rwxrwx-rx) - Tutti i file in
/var/www
devono essere impostati su:0664
oug=rw,o=r
(rw-rw-r--)
Di seguito dovrebbero essere di proprietà www-data:webmasters
(ovvero queste sono le directory su cui Apache deve poter scrivere):
- applicazione / cache
- applicazione / logs
- caricare
- client_helpers / upload
COME
Per impostare le autorizzazioni per /var/www
la provenienza dei file per impostazione predefinita:
sudo addgroup webmasters
sudo adduser $USER webmasters
sudo chown -R root:webmasters /var/www
sudo find /var/www -type f -exec chmod 664 {} \;
sudo find /var/www -type d -exec chmod 775 {} \;
sudo find /var/www -type d -exec chmod g+s {} \;
sudo chown -R www-data:webmasters application/cache/
[eccetera...]
Ora disconnettersi e accedere nuovamente per rendere effettive le modifiche.
La serie precedente di comandi esegue le seguenti operazioni:
- Crea un nuovo gruppo chiamato
webmasters
; tutti gli utenti che necessitano dell'accesso in scrittura ai file dell'app verranno aggiunti a questo gruppo. - aggiunge l'utente corrente (
$USER
) alwebmasters
gruppo. - cambia il proprietario di
/var/www
inroot
e il gruppo inwebmasters
gruppo. - aggiunge 664 autorizzazioni (-rw-rw-r--) a tutti i file in
/var/www
. - aggiunge 775 autorizzazioni (drwxrwxr-x) a tutte le directory in
/var/www
. - imposta il bit SGID
/var/www
e tutte le relative directory; questo ultimo punto porta alcune spiegazioni. Nota anche che puoi anche mettere un 2 nella parte anteriore del tuo chmod ottale (es. 2644) per fare la stessa cosa. - imposta il proprietario su
www-data
(utente di Apache) e il gruppo della directory fornita suwebmaster
. Questo assicura che la directory sia scrivibile da Apache e da chiunque nelwebmasters
gruppo. Fai lo stesso per tutte le altre directory che devono essere scrivibili.
/var/www
senza aggiungerlo anche a quel gruppo?