Conceder permisos de usuario en www-data own / var / www

36

Tengo una configuración de servidor web simple para algunos sitios web, con un diseño similar a:

sitio1: /var/www/site1/public_html/

sitio2: /var/www/site2/public_html/

Anteriormente utilicé el usuario raíz para administrar archivos, y luego los devolví a www-datacuando terminé (sitios de WordPress, necesarios para que las cargas de WP funcionen). Probablemente esta no sea la mejor manera.

Estoy tratando de encontrar una manera de crear otro usuario (llamémoslo usuario1) que tenga permiso para editar archivos en el sitio1, pero no en el sitio2, y que no detenga la propiedad de los archivos www-data. ¿Hay alguna forma de hacer esto?

George Pearce
fuente

Respuestas:

70

Si verificamos la propiedad del sitio1, encontraremos algo como esto,

ls -ld /var/www/site1/
drwxr-xr-x 2 root root 4096 Oct 24 21:06 site1/

Esto significa que el directorio es propiedad del usuario root, root del grupo. Mientras que la raíz del usuario tiene permiso de escritura (más permisos de lectura y ejecución) en el directorio, la raíz del grupo solo tiene permisos de lectura y ejecución.

Queremos cambiar la propiedad del grupo a otro (nuevo) grupo y agregar user1 a ese grupo en particular. También daremos permiso de escritura a ese grupo en particular.

Crea un nuevo grupo,

sudo addgroup site1

Agregue user1 al grupo recién creado,

sudo adduser user1 site1

Comprueba que user1 está realmente en ese grupo,

groups user1

El resultado debería ser una lista como,

user1 : <other-groups> site1

Ahora podemos cambiar la propiedad del grupo de su directorio previsto.

sudo chown -vR :site1 /var/www/site1/
changed ownership of `/var/www/site1/' from root:root to :site1

Otorgue permiso de escritura a este nuevo propietario del grupo,

sudo chmod -vR g+w /var/www/site1/
mode of `/var/www/site1/' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)

Comprueba que todos los cambios están ahí,

ls -ld /var/www/site1/
drwxrwxr-x 2 root site1 4096 Oct 24 21:06 /var/www/site1/

Entonces, el directorio ahora es propiedad del usuario root, grupo site1. Tanto el usuario root como el sitio de grupo1 tienen permiso de escritura (más permisos de lectura y ejecución) en el directorio. Cualquier usuario que pertenezca al grupo site1 disfrutará de todos los privilegios otorgados a ese grupo.

Ahora inicie sesión como usuario1, vaya al directorio del sitio1 e intente crear un archivo en ese directorio,

echo "My User1 Site" > index.html 
bash: index.html: Permission denied

Esto falló ya que lo más probable es que el grupo principal de usuario1 no sea sitio1. Entonces, cambia a ese grupo.

newgrp - site1

Intente volver a crear el archivo (tenga en cuenta que ha sido trasladado al directorio de inicio del usuario1 después de cambiar el grupo), esto debería funcionar ahora. Dado que los archivos creados tendrán permiso de lectura mundial, apache (o su servidor web) no debería tener ningún problema para acceder a ellos.

EDITAR

Además, como señaló dan08 en el comentario, debe agregar www-data al sitio1 grupo.

sudo adduser www-data site1

En muchas (no todas) distribuciones, www-data es el usuario bajo el cual se ejecuta el servidor web Apache. Esto también significa que todo lo que haga Apache (especialmente los scripts PHP) se realizará con los permisos del usuario www-data (y también el grupo www-data) de forma predeterminada. WordPress utiliza el usuario www-data para escribir archivos.

Si desea ver cómo se está ejecutando el servidor web Apache, emita el comando,

ps aux | grep apache2 | less
Masroor
fuente
1
También debe agregar www-data al sitio1 grupo. Al cargar y cambiar archivos en la interfaz web de Wordpress. Apache realiza los cambios utilizando el usuario www-data. así que los privilegios de lectura no son suficientes la mayor parte del tiempo.
Dan
3
El Permission deniedmensaje no se debe al "grupo primario", sino al usuario que aún no está en ese grupo (en lo que respecta al sistema operativo). Si cierra sesión y vuelve a iniciarla, funcionará como se esperaba (sin ejecutarse newgrp - site1).
0b10011
¿Cómo sería exactamente diferente de otorgar www-datapermisos de escritura grupales si www-datade site1todos modos tiene que agregar ?
Matt
@MattBorja Su consulta no es muy clara. ¿Se pregunta qué tiene de malo dar al grupo llamado www-data' write permissions? If that is the question, www-data 'no es un grupo, es un usuario? Avíseme si entendí mal su pregunta.
Masroor
Creo que esta no es una configuración segura porque los usuarios pueden acceder a los sitios de los demás a través del script php, por ejemplo, un administrador de archivos php.
qdinar
7

Crea dos grupos: site1grpysite2grp

sudo groupadd site1grp && sudo groupadd site2grp

Añadir www-dataa ambos grupos.

sudo adduser www-data site1grp && sudo adduser www-data site2grp

Agregue user1 y user2 a los grupos apropiados

sudo adduser user1 site1grp && sudo adduser user2 site2grp

Cambie el permiso de las carpetas de su sitio para que el propietario del usuario sea www-data y el propietario del grupo sea el grupo apropiado

sudo chown -R www-data:site1grp /var/www/site1  && sudo chown -R www-data:site2grp /var/www/site2

Ahora www-datatiene los permisos de usuario y grupo en ambos sitios y cada usuario tiene los permisos de grupo para su sitio respectivo.

Dan
fuente
4

Para aquellos que tienen su carpeta raíz de WordPress debajo de su carpeta de inicio:

Ubuntu / apache

  1. Agregue su usuario al grupo www-data:

    CRÉDITO Otorgar permisos de escritura al grupo www-data

    Quiere llamar usermoda su usuario. Entonces eso sería:

    sudo usermod -aG www-data yourUserName
    

    Asumiendo que el www-datagrupo existe

  2. Comprueba que tu usuario está en el www-datagrupo:

    groups yourUserName
    

    Deberías obtener algo como:

    yourUserName : yourUserGroupName www-data
    

    yourUserGroupName suele ser similar a su nombre de usuario

  3. Cambie recursivamente la propiedad grupal de la carpeta manteniendo la propiedad de su usuario

    chown yourUserName:www-data -R yourWebSiteFolder/*
    
  4. Cambiar el directorio a yourWebSiteFolder

    cd yourWebSiteFolder
    
  5. Cambie recursivamente los permisos de grupo de las carpetas y subcarpetas para habilitar los permisos de escritura:

    find . -type d -exec chmod -R 775 {} \;
    

    modo de /home/yourUserName/yourWebSiteFolder/'cambio de 0755 (rwxr-xr-x)a0775 (rwxrwxr-x)

  6. Cambie recursivamente los permisos de grupo de los archivos y subarchivos para habilitar los permisos de escritura:

    find . -type f -exec chmod -R 664 {} \;
    

    El resultado debería ser similar a:

    WAS:
    -rw-r--r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    CHANGED TO:
    -rw-rw-r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    

    Equivalente a:

    chmod -R ug+rw foldername
    

    Los permisos serán como 664 o 775.

Jadeye
fuente
3

Debe crear un nuevo grupo, para el llamado "nuevo usuario", y luego agregar los datos de www y el "nuevo usuario" a ese grupo:

sudo gpasswd -a new_user new_group

Luego puede cambiar el propietario new_usery el grupo a new_group:

sudo chown -R new_user:new_group /var/www/site1

Luego deberá dar acceso a nivel de grupo al sitio1. www-data aún podrá acceder al sitio, porque pertenece al nuevo grupo, mientras que new_user no podrá acceder al sitio2, porque no pertenecerá al grupo de datos www, que posee el sitio2.

errikos
fuente
Su respuesta es confusa, al "dar acceso a nivel de grupo al sitio1", ¿quiso decir "cambiar el grupo del sitio1 a nuevo_grupo" o cambiar el modo ( chmod)? Su respuesta no menciona el modo en ningún lugar que pueda marcar la diferencia de ser seguro (o romper cosas).
Lekensteyn
Me refería a cambiar el modo ( chmod) al revocar todos los permisos para OTROS.
errikos
1

Suponiendo que todos los archivos ya pertenecen al www-datausuario (puede verificarlo con el ls -slahcomando) que pertenece al www-datagrupo (siguiente columna después del nombre de usuario en la lista de archivos), simplemente puede agregar su usuario al mismo www-datagrupo para permitir la edición de estos archivos

# usermod -aG www-data username

para usuario existente, o

# adduser username www-data

para uno recién creado

vladkras
fuente