Permiso SFTP denegado en archivos propiedad de www-data

23

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-datagrupo. 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 charlesrsea ​​parte del www-datagrupo. 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-dataarchivos 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/wwwvuelven parte del www-datagrupo 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-datasignificaba 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/wwwdeben ser propiedad deroot:webmasters
  • Todos los desarrolladores deben ser miembros del webmastersgrupo.
  • Todos los directorios /var/wwwdeben establecerse en: 2775o u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Todos los archivos /var/wwwdeben establecerse en: 0664o ug=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/wwwdonde se sirven sus archivos de manera predeterminada:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. 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:

  1. 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.
  2. agrega el usuario actual ( $USER) al webmastersgrupo.
  3. cambia el propietario de /var/wwwa rooty el grupo a webmastersgrupo.
  4. agrega 664 permisos (-rw-rw-r--) a todos los archivos en /var/www.
  5. agrega 775 permisos (drwxrwxr-x) a todos los directorios en /var/www.
  6. establece el bit SGID /var/wwwy 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.
  7. establece el propietario en www-data(usuario de Apache) y el grupo del directorio proporcionado en webmaster. Esto garantiza que Apache y cualquier persona del webmastersgrupo puedan escribir en el directorio . Haga lo mismo para todos los demás directorios que deben poder escribirse.
Charles Roper
fuente

Respuestas:

10

Ubuntu.com tiene guías de servidor bastante buenas, como la guía de Apache . ¿De dónde sacaste tus procedimientos que escribiste tan cuidadosamente? Nunca tuve que tener tantos problemas para ninguno de los servidores que configuré, aunque estoy abierto a la posibilidad de que no lo haya estado haciendo bien; además, en realidad no he instalado servidores para cualquier cosa que sea muy pública o muy grande, por lo que podría haber agujeros de seguridad que no conozco.

Sin embargo, nunca he necesitado ser miembro del grupo www-data, y ningún archivo fuente en www es propiedad de www-data. Tengo entendido que Apache lo usa solo para sus propios archivos, y no tendrá permisos de escritura para ninguno de los otros archivos, porque en teoría, ningún archivo importante permitirá que www-data tenga permiso de escritura. Supongo que los archivos propiedad de www-data darían permiso de solo lectura a todos los demás, y nadie debería tener permiso de escritura para sus archivos. Podría estar totalmente equivocado, por supuesto, y si lo estoy, espero que alguien me diga y me señale documentación real que explique de manera diferente (no a algún foro en el que un usuario aleatorio de Internet como yo haya producido instrucciones que funcionen para él).

Quizás me estoy perdiendo algo, pero su problema debería ser bastante sencillo. El usuario que ha iniciado sesión con sftp debe ser miembro del grupo www-data, y los archivos que está intentando modificar deben tener permisos de escritura para el grupo www-data. No tiene sentido para mí que pueda modificar los archivos usando ssh, pero no usando sftp; ¿estás seguro de que estás iniciando sesión en la misma cuenta para ambos? En sftp, puede ingresar comandos como !groupsenumerar sus grupos o !whoamiverificar qué nombre de inicio de sesión está utilizando. Los resultados deben coincidir con lo que ve usando ssh (con los mismos comandos menos el signo de exclamación).

También debe poder usar chmod, chown, chgrp de sftp si tiene permiso para hacerlo.

Por cierto, creo que su lista tiene al menos un comando bastante malo:

sudo chmod -R g+rw /var/www

Esto le da al mundo permiso de escritura para cada archivo y carpeta en / var / www. Esto suena como una mala idea. Normalmente, solo la raíz tiene permiso de escritura en estos directorios, a menos que los específicos necesiten más permiso, generalmente solo directorios únicos.

Nota: Esto fue un error de mi parte. Gracias a DonalLafferty por señalar esto, que especifica "g", no "a", por lo que solo cambia los permisos de grupo. Mis viejos ojos cansados ​​(o una mala fuente) deben haberlo leído como "a".

Ediciones para aclaraciones

Normalmente, los archivos creados por Apache son de solo lectura tanto para el grupo de datos www como para todos los demás usuarios, igual que los archivos propiedad de root en / var / www. Por lo tanto, no debería haber ninguna razón para hacer que alguien sea miembro de www-data. El problema es dar a todos acceso de escritura, que es un caso diferente. Esto debe hacerse poniendo a disposición directorios específicos dentro de su sitio, y esto se hace simplemente usando chmod, ya sea con sudo, ya que probablemente sea propiedad de root, o haciendo que el propietario sea usted mismo y no use sudo.

Si tiene más desarrolladores que necesitan acceso a todo el sitio, es cuando desea crear un grupo de usuarios + como "webmasters", convertirlo en el propietario del sitio, otorgar permisos de escritura a ese grupo y hacer que todos los desarrolladores sean miembros de ese grupo Entonces, el listado de los directorios del sitio sería algo como:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Más ediciones

Desde entonces me di cuenta de que realmente no necesitas crear un usuario "webmasters", solo un grupo. Entonces los archivos pueden ser propiedad de root: webmasters, es decir, root es el propietario, pero webmasters es el grupo.

En respuesta a las preguntas a continuación, los archivos que escribe Apache serán propiedad de www-data y del grupo www-data. Normalmente, estos archivos no son algo en lo que escribe, por lo que los no miembros de www-data pueden tener acceso de solo lectura; creo que depende de los permisos del directorio. Si necesita más que un acceso de escritura ocasional, puede ser útil agregarse al grupo. Por lo general, crea directorios específicos en todo el mundo para el contenido guardado por Apache. Considere también que el alojamiento web más compartido que ejecuta Apache sin acceso a shell ni siquiera tendría una forma de configurar grupos.

Pero, Apache puede leer archivos incluso propiedad de root. Casi todos los archivos tienen acceso legible en todo el mundo, solo que no se pueden escribir. Entonces, a menos que desee cambiar esto, Apache no necesita estar en el grupo de webmasters.

Esta es toda la configuración básica de Linux, no realmente Apache. Apache solo se preocupa por el acceso desde el servidor web, y eso lo establecen los archivos de configuración. Por esta razón, el enlace de documentación de Ubuntu que incluí en mi publicación debería considerarse una mejor fuente que una wiki pública.

Por cierto, el O'Reilly Apache Cookbook dice que "los directorios de documentos, como htdocs, cgi-bin e íconos, deberán tener permisos establecidos de la manera que tenga más sentido para el modelo de desarrollo de su sitio web en particular, pero en ningún caso el usuario del servidor web podrá escribir ninguno de estos directorios o archivos contenidos en ellos ".

Finalmente, usar ACL es una buena forma de establecer permisos de archivo si necesita más control. Incluso puede ser una buena manera de configurarlos todo el tiempo, y es algo que debería investigar.

Marty Fried
fuente
Hola @ marty-fried, gracias por la respuesta, me da mucho para probar. Re. tus preguntas. Reuní la información de varias fuentes (de ahí por qué la escribí en mi guía de uso propio) y no recuerdo la fuente exacta. Aunque no utilicé esta fuente en particular (solución 1) (solo la encontré), da una buena razón para mi decisión. En la guía de Apache que mencionas, recomienda crear un grupo llamado 'webmasters', pero si lo hiciera, ¿cómo escribiría Apache al /var/wwwsin agregarlo también a ese grupo?
Charles Roper
Y yo no necesito dar a otros usuarios el acceso a /var/wwwpor lo que pensé que da acceso al grupo www-datay haciendo cada uno un miembro de ese grupo sería una buena solución. Sin embargo, ahora puedo ver el problema de que Apache pueda sobrescribir cualquier archivo allí. Dado que solo 2 desarrolladores (que me incluyen a mí) tienen acceso al código, es relativamente seguro a corto plazo.
Charles Roper
1
Gracias Marty Esta parte del libro de cocina de Apache me hizo reír: "Debe tener en cuenta que si le pregunta a 12 personas las formas correctas de configurar los permisos de archivo en su servidor Apache, obtendrá una docena de respuestas diferentes". Me has dado casi todo lo que necesito para progresar ahora. Muchísimas gracias por su tiempo. :-)
Charles Roper
1
También he aprendido un poco, por lo que disfruto de las discusiones en profundidad: por lo general, ayuda a aclarar algunas de las partes confusas. Principalmente soy un programador al que se le pide que solucione problemas y configure sitios web, por lo que siempre estoy aprendiendo mejores formas de hacer las cosas. No dude en preguntar si hay alguna otra pregunta.
Marty Fried
1
AFAIK, sudo chmod -R g + rw / var / www da acceso a 'grupo'. Use 'a + rw' para acceder al mundo.
Donal Lafferty
7

Me di cuenta de que no lo habías usado chown.

Para configurar correctamente la propiedad de los archivos / carpetas, puede configurar todo el directorio de esta manera: chown -R www-data:www-data

Esto establece la propiedad de grupo www-datay usuariowww-data

Además, puede hacer esto como una solución temporal:

chmod 777 /var/data/<filename> o chmod 777 /var/data/<foldername>

edite los archivos según sea necesario, luego

chmod 644 /var/data/<filename> o chmod 755 /var/data/<foldername>

Tenga cuidado de usar el interruptor "-R", ya que también cambia los permisos de todos los subarchivos y carpetas.

664 son los permisos de archivo estándar de Apache y 755 los permisos de carpeta estándar.

Espero que esto ayude :)

Estrella

Bendita estrella
fuente
Hola, gracias por tomarte el tiempo de responder, es muy apreciado. Sin embargo, realmente no ayuda. Al compartir los archivos, TODOS no se pueden modificar cuando se usa SFTP (¡lo contrario de lo que busco!). Realmente no puedo usar la solución alternativa de chmod porque a) no tengo permisos para chmod en SFTP; b) Realmente no quiero iniciar sesión a través de SSH, cambiar permisos, hacer mi SFTP, cambiar de nuevo, etc .; yc) algunos archivos tienen permisos diferentes por razones de seguridad, por lo que no puedo modificarlos en masa de todos modos.
Charles Roper el
¿Qué es /var/data? Además, ¿qué directorio le sugiere que use el comando chown -R www-data:www-data? Ojalá no /var/www.
Marty Fried