¿Cuál es la mejor forma de manejar los permisos para el usuario www-data de Apache 2 en / var / www?

215

¿Alguien tiene una buena solución para manejar archivos /var/www? Estamos ejecutando hosts virtuales basados ​​en nombres y el usuario de Apache 2 es www-data .

Tenemos dos usuarios regulares y root. Entonces, cuando juegas con archivos /var/www, en lugar de tener que ...

chown -R www-data:www-data

... todo el tiempo, ¿cuál es una buena forma de manejar esto?

Pregunta complementaria: ¿Qué tan duro entonces tienes permisos?

Este siempre ha sido un problema en entornos de desarrollo colaborativo.

Gareth
fuente

Respuestas:

206

Intentando ampliar la respuesta de @ Zoredache , mientras lo intento yo mismo:

  • Cree un nuevo grupo (www-pub) y agregue los usuarios a ese grupo

    groupadd www-pub

    usermod -a -G www-pub usera ## debe usar -a para agregar a grupos existentes

    usermod -a -G www-pub userb

    groups usera ## grupos de visualización para usuario

  • Cambie la propiedad de todo en / var / www a root: www-pub

    chown -R root:www-pub /var/www ## -R para recursivo

  • Cambia los permisos de todas las carpetas a 2775

    chmod 2775 /var/www ## 2 = establecer id del grupo, 7 = rwx para el propietario (root), 7 = rwx para el grupo (www-pub), 5 = rx para el mundo (incluido el usuario de apache www-data)

    El bit Establecer ID de grupo ( SETGID ) (2) hace que el grupo (www-pub) se copie en todos los archivos / carpetas nuevos creados en esa carpeta. Otras opciones son SETUID (4) para copiar la identificación del usuario y STICKY (1), que creo que solo permite que el propietario elimine los archivos.

    Hay una -Ropción recursiva, pero que no discriminará entre archivos y carpetas, por lo que debe usar find , así:

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

  • Cambiar todos los archivos a 0664

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

  • Cambie la máscara de usuario para sus usuarios a 0002

    La umask controla los permisos de creación de archivos predeterminados, 0002 significa que los archivos tendrán 664 y los directorios 775. Establecer esto (editando la umasklínea en la parte inferior de /etc/profilemi caso) significa que los archivos creados por un usuario podrán ser escritos por otros usuarios en www- grupo sin necesidad de chmodellos.

Pruebe todo esto creando un archivo y directorio y verificando el propietario, el grupo y los permisos con ls -l.

Nota: ¡Deberá cerrar sesión / iniciar sesión para que los cambios en sus grupos surtan efecto!

Tom
fuente
66
@Tom Genial para ver que recomiendas usar el findcomando para esto. Un pequeño consejo de rendimiento que daría si tiene muchos archivos / directorios y está utilizando GNU find es usar en +lugar de \;para que el comando opere en varios archivos porque "es más rápido ejecutar un comando en la mayor cantidad de archivos posible a la vez, en lugar de una vez por archivo. Hacer esto ahorra el tiempo que lleva iniciar el comando cada vez ". Además, es más fácil de escribir ya que no necesita barra invertida.
aculich
2
Actualizado con la sugerencia de @ aculich de usar + not \;
Tom
1
@SunnyJ. intente esto (sin las comillas externas): "find / var / www -type f -exec chmod 0664 '{}' \ +" Inténtelo. Hay un espacio entre el '{}' y el \ +.
Buttle Butkus
1
por qué necesitamos dar permiso a otros para ver y ejecutar.
Kevin Parker
1
@ Tom- way para descomponerlo, gracias. Solo una nota: creo que "SETUID (4) para copiar el ID de usuario" como se incluye en su respuesta es incorrecto: SETUID se ignora cuando se aplica a directorios en Linux / Unix - Ref
Yarin
60

No estoy completamente seguro de cómo desea configurar los permisos, pero esto puede darle un punto de partida. Probablemente hay mejores formas. Supongo que desea que ambos usuarios puedan cambiar cualquier cosa en / var / www /

  • Cree un nuevo grupo (www-pub) y agregue los usuarios a ese grupo.
  • Cambie la propiedad de todo en / var / www a root: www-pub.
  • Cambia los permisos de todas las carpetas a 2775
  • Cambia todos los archivos a 0664.
  • Cambie la máscara de usuario para sus usuarios a 0002

Esto significa que cualquier archivo nuevo creado por cualquiera de sus usuarios debe ser nombre de usuario: www-pub 0664 y cualquier directorio que se cree será nombre de usuario: www-pub 2775. Apache obtendrá acceso de lectura a todo a través del componente 'otros usuarios'. El bit SETGID en los directorios forzará que todos los archivos creados sean propiedad del grupo propietario de la carpeta. Es necesario ajustar la umask para asegurarse de que el bit de escritura esté configurado para que cualquier persona del grupo pueda editar los archivos.

En cuanto a qué tan duro voy con permisos. Depende completamente del sitio / servidor. Si solo hay 1-2 editores y solo necesito evitar que rompan las cosas demasiado, entonces lo haré fácil. Si el negocio requería algo más complejo, entonces establecería algo más complejo.

Zoredache
fuente
1
Posible adición: configure los directorios de caché / carga que el servidor web debe escribir en www-data: www-data y 775.
gacrux
¿Funcionaría bien agregar a los usuarios al grupo apache en lugar de depender de 'otros' permisos? Si todo lo que está haciendo es cargar archivos y apache debe leer esos archivos, un tercer grupo solo parece ser útil si necesita editar esos archivos.
Simurr
1
¿Hay alguna posibilidad de que pueda expandir esto un poco @Zoredache? Compruebo el uso básico de bits rwx, chmod, chown, adduser, usermod, pero me has perdido con el primer dígito adicional en los permisos octales, umasks y todo eso. Algunos comandos de muestra que ilustran su enfoque esbozado serían muy apreciados.
Tom
1
¡De esta manera, cada usuario puede acceder a todos los demás archivos de usuario! Esto significa que el usuario A puede leer config.php del usuario B ... sofocando su credencial mysql, por ejemplo
drAlberT
1
Usando acl puedes manejar tanto la seguridad como la colaboración :)
drAlberT
39

Creo que puede encontrar útil POSIX ACL (listas de control de acceso). Permiten un modelo de permisos más fino en comparación con el usuario: grupo: otro modelo. He descubierto que es más fácil mantenerlos en mi cabeza ya que puedo ser más explícito y también puedo establecer el comportamiento "predeterminado" para una rama del sistema de archivos.

Por ejemplo, puede especificar los permisos de cada usuario explícitamente:

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

O puede hacerlo en función de algún grupo compartido:

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

Y quizás desee mantener a su usuario de Apache como de solo lectura

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

Páginas man:

Tutorial

Joe Holloway
fuente
2
Ese es el camino ! +1
drAlberT
ACL para ganar +1 ... Para más información, visite serverfault.com/a/360120/41823
Yarin
1
Me pregunto si hay algún inconveniente en el rendimiento de ACL frente a los permisos básicos.
Buttle Butkus
2
Desafortunadamente, ACL falta con demasiada frecuencia en instalaciones / distribuciones estándar. Es difícil compilar el núcleo en cada servidor que administro, o peor aún, cambiar el sistema de archivos a veces. Además, debe tener mucho cuidado al hacer una copia de seguridad de los archivos, especialmente si está cambiando de servidor. ACL es excelente, pero su soporte actual es tan bajo que recomendaría no usarlo para cualquiera que no tenga control total sobre todo en el servidor y sus alrededores. ¡Pero +1 por señalar ACL donde realmente tiene sentido!
Ninj
Buena respuesta +1; Una nota sobre cómo cambiar los permisos de lectura / escritura del proceso Apache ( www-datapor ejemplo) a solo lectura para todo el sitio (a través de setfacl o chmod - o ambos) -> Esto obviamente bloqueará todas las escrituras (carga / actualización del complemento / módulo desde el lado del navegador en la mayoría de los CMS, por ejemplo). Creo que muchos populares también solo prueban el acceso de escritura en el nivel permanente del usuario, no en el nivel grupal. Todavía puede actualizar, pero las actualizaciones deben aplicarse manualmente y cualquier permiso personalizado para las carpetas de escritura (registros / temp / uploads / etc.). Solo lectura es una gran seguridad si su sitio funciona con él ... en general, la mayoría no lo hace.
bshea
11

Esta pregunta se hizo nuevamente , y como se discutió en meta, las mejores prácticas actuales ofrecen mejores enfoques que los disponibles en 2009, cuando se hizo esto. Esta respuesta intenta ofrecer algunas soluciones actuales para manejar entornos de desarrollo web colaborativo de forma segura .


Para un servidor web seguro y desarrollo colaborativo, hay más que solo los permisos de archivo:

  • Tener un usuario separado para cada sitio, es decir, no servir a todos los sitios que usan www-data. Esto es importante, ya que hoy en día Apache rara vez sirve únicamente archivos de contenido estático , sino que ejecuta sitios web dinámicos . Esta respuesta se concentra en PHP, ya que es el lenguaje de sitio de servidor más común , pero los mismos principios también se aplican a los demás.

    Si tiene un problema de seguridad en un solo sitio, puede extenderse a todos los sitios que se ejecutan como el mismo usuario. Un atacante puede ver todo lo que ve el usuario, incluida la información de inicio de sesión de la base de datos, y modificar todos los sitios en los que el usuario tiene permisos de escritura.

  • Utilice el protocolo de transferencia de archivos SSH (SFTP). Si bien el uso de FTP debe abandonarse por seguridad (ya que envía las contraseñas y el contenido en texto sin formato), su sustituto seguro SFTP también tiene una característica que es una solución perfecta para el desarrollo web colaborativo.

    Una vez que haya aislado los sitios y un usuario por sitio, debe dar acceso a sus desarrolladores web, de qué se trata esta pregunta. En lugar de darles las contraseñas para estos usuarios del sitio, o acceder a los archivos del sitio usando sus cuentas de usuario personales como se sugirió originalmente, puede usar las claves SSH para iniciar sesión.

    Cada desarrollador puede generar pares de claves y mantener la clave privada en secreto. Luego, la clave pública se agrega al ~/.ssh/authorized_keysarchivo para cada cuenta de usuario del sitio web en la que el desarrollador está trabajando. Esto tiene muchas ventajas para administrar las contraseñas y los inicios de sesión:

    • Cada desarrollador puede tener acceso a cualquier número de sitios web sin la carga de recordar o almacenar todas las contraseñas involucradas con el acuerdo de usuario por sitio.

    • No es necesario cambiar y compartir las contraseñas cada vez que alguien abandona la empresa.

    • Puede usar contraseñas muy seguras o deshabilitar por completo el inicio de sesión basado en contraseña.

  • Usa PHP-FPM . Es el enfoque actual para ejecutar PHP como usuario. Cree un nuevo grupo para cada usuario, es decir, un grupo por cada sitio. Esto es lo mejor para la seguridad y el rendimiento, ya que también puede especificar cuántos recursos puede consumir un solo sitio.

    Vea, por ejemplo, NeverEndingSecurity's Run php-fpm con usuario / uid y grupo separados en Linux . Hay tutoriales como HowtoForge's Usando PHP-FPM con Apache en Ubuntu 16.04 que no usa PHP-FPM para aumentar la seguridad a través de la separación del usuario, guiando el uso de un solo socket FPM en el servidor.

Esa Jokinen
fuente