Tengo un servidor bastante estándar configurado con Apache y PHP. Una aplicación que estoy ejecutando crea archivos y estos son propiedad del usuario de Apache www-data
. Los archivos que subo a través de SFTP son propiedad de mi propio usuario charlesr
. Todos los archivos son parte del www-data
grupo. Mi problema es que no puedo modificar ni sobrescribir ninguno de los archivos a través de SFTP que son de su propiedad www-data
, aunque charlesr
sea parte del www-data
grupo. Puedo modificar los archivos sin problemas a través de una sesión SSH.
Así que no estoy seguro de qué hacer. ¿Cómo otorgo a mi sesión de SFTP permisos para modificar www-data
archivos de propiedad?
Para un poco de antecedentes, estas son las notas que escribí para mí al configurar el servidor:
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.
Y luego me explico a mí mismo qué significa establecer el bit SGID (es decir, todos los archivos creados se /var/www
vuelven parte del www-data
grupo automáticamente).
ACTUALIZAR
Parece que el problema fue causado por la propia aplicación o, más específicamente, por el marco de la aplicación ( Kohana ) que configura ciertos archivos que escribe en 0644 (rw-r - r--); es decir, no se puede escribir en grupo. Esto, junto con el hecho de que los archivos también son propiedad de www-data
significaba que no podía editar los archivos a través de SFTP cuando estaba conectado como charlesr
. No estoy seguro de por qué podría editar los archivos a través de SSH. Supongo que debo haber usado sudo.
Aquí está la estrategia de permisos que ahora uso gracias a la incansable ayuda de Marty Fried , quien señaló los defectos de mi estrategia anterior y también me ayudó a marinarme en el mundo de los permisos de Linux hasta que finalmente lo asimilé. Gracias Marty!
Visión general
- Los archivos y directorios
/var/www
deben ser propiedad deroot:webmasters
- Todos los desarrolladores deben ser miembros del
webmasters
grupo. - Todos los directorios
/var/www
deben establecerse en:2775
ou=rwx,g=rwxs,o=rx
(rwxrwx-rx) - Todos los archivos
/var/www
deben establecerse en:0664
oug=rw,o=r
(rw-rw-r--)
Los siguientes deben ser propiedad de www-data:webmasters
(es decir, estos son los directorios en los que Apache necesita poder escribir):
- aplicación / caché
- aplicación / registros
- subir
- client_helpers / upload
CÓMO
Para configurar permisos en /var/www
donde se sirven sus archivos de manera predeterminada:
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/
[etc ...]
Ahora cierre sesión y vuelva a iniciar sesión para que los cambios se hagan efectivos.
El conjunto de comandos anterior hace lo siguiente:
- Crea un nuevo grupo llamado
webmasters
; todos los usuarios que necesiten acceso de escritura a los archivos de la aplicación se agregarán a este grupo. - agrega el usuario actual (
$USER
) alwebmasters
grupo. - cambia el propietario de
/var/www
aroot
y el grupo awebmasters
grupo. - agrega 664 permisos (-rw-rw-r--) a todos los archivos en
/var/www
. - agrega 775 permisos (drwxrwxr-x) a todos los directorios en
/var/www
. - establece el bit SGID
/var/www
y todos los directorios en él; Este último punto merece una explicación. Tenga en cuenta también que también puede poner un 2 en la parte frontal de su chmod octal (por ejemplo, 2644) para hacer lo mismo. - establece el propietario en
www-data
(usuario de Apache) y el grupo del directorio proporcionado enwebmaster
. Esto garantiza que Apache y cualquier persona delwebmasters
grupo puedan escribir en el directorio . Haga lo mismo para todos los demás directorios que deben poder escribirse.
/var/www
sin agregarlo también a ese grupo?