entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Dilema de permisos entre Apache y usuario local (XFCE)

Buenas, me encuentro con el siguiente escenario.

He instalado una Xubuntu y he empezado a usarla en mis desarrollos webs. He instalado Apache2, PHP y Mysql (junto a phpmyadmin). Me di cuenta que tenía problemas con los permisos de usuarios pues el usuario de Apache es www-data por lo que cogi la carpeta /var/www/html y le dí cambié el usuario y el grupo a www-data.

Para no tener problemas con Thunar y mi usuario, añadí mi usuario (con el que inicio session en XFCE) al grupo de www-data y le di los permisos 775 a los directorios y 664 a los ficheros para no tener problemas sobre todo con los permisos del grupo.

El problema que tengo es que, al añadir nuevos ficheros obviamente mi usuario aparece en la creación de dichos ficheros y tengo que estar cambiando recursivamente los ficheros de dueño. Así mismo si uso programas como Koala (para escribir los less a css de forma automática) o el mismo git o svn, el usuario de los archivos que se crean obviamente es el de mi usuario por lo que otra vez de nuevo me obliga a cambiar los permisos del usuario.

Estoy evitando por todos los medios ir por la solución fácil que sería cerrar por iptables el puerto 80 (ya que es un servidor local de desarrollo) y meterle el 777 a todos los ficheros y directorios aunque no se si es lo más correcto.

Existe alguna solución más correcta ante este problema?

Gracias desde ya!


Resolucion final

Los comentarios que me habéis dejado me han sido de mucha utilidad. He probado watchers y me pareció bueno pero tuve problemas con el tema de ser root para el chown.

Me habéis dejado más propuestas que practicamente es lo mismo que he terminado haciendo pero haciendo uso de un grupo extra. Al final he tenido que terminar eligiendo una respuesta valida cuando es mentira, tanto la de white como la de Leonardo son muy válidas y me han ayudado muchísimo. Agradezco enormemente vuestro tiempo :)

Al final he hecho lo siguiente:

Añado nuevo grupo y meto los dos usuarios en el mismo grupo:

groupadd www-pub  
usermod -a -G www-pub david
usermod -a -G www-pub www-data

Todos los usuarios del directorio los establezco para root:www-pub

chown -R root:www-pub /var/www/html

Establezco los permisos de directorios y ficheros recursivamente:

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

y listo! el umask no he necesitado cambiarlo porque por defecto el sistema ya lo tenía colocado a 0002 (lo que me indicaba Leonardo)

El enfoque que hace White es prácticamente el mismo solo que usando otros comandos con los que nunca me he manejado (si bien es cierto que he descubierto Watcher y ya le tengo el ojo echado para planes futuros)

De verdad, muchísimas gracias a ambos por vuestra dedicación. Eternamente agradecido :)
Me apoyé de aqui: http://serverfault.com/questions/6895/whats-the-best-way-of-handling-permissions-for-apache2s-user-www-data-in-var

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Si estás trabajando con Apache bajo el usuario www-data, tu enfoque de agregarte al grupo es correcto. El problema te queda en que cada archivo nuevo que creés tendrá permisos 644 y cada directorio 755 y lo que decestarías es que cada archivo nuevo sea 664 y cada directorio 775.

Podés solucionar esto cambiando la máscara de creación de archivos y directorios por defecto de tu sistema. Editá como root el archivo /etc/profile y agregale al final:

umask 002

Por las dudas, fijate que no tengas una línea equivalente, en cuyo caso comentala y dejá solo esta.

Al reiniciar la sesión, se tomará la nueva máscara de creación. Esto cambia los permisos para todo usuario: si te interesa hacerlo solo para tu usuario, se agrega la misma línea en los archivos de arranque de la sesión, como por ejemplo en el .bashrc (que suele no existir y hay que crear)

Hay otros archivos en dónde se puede configurar esto... si no te funciona el cambio, los buscamos.

Saludos codriales!

0voto

Melk comentado

El problema es que al traerme archivos por Git o SVN el usuario será el mío. El problema con eso es que mi usuario sí está en el grupo de www-data pero no al contrario. Entiendo que sería peligroso meter a www-data en mi grupo de usuario ya que, en el peor de los casos, podrían tener acceso a mis ficheros personales. Puedo crear la máscara como indicas pero si el usuario sigue siendo el de mi cuenta el usuario www-data seguirá teniendo problemas de accesos.

O al menos así lo entiendo yo :/

0voto

Leonardo-Tadei comentado

No, no tendrías más problemas de acceso si es como decís, que tu usuario y www-data pertenecen al mismo grupo.

Tu usuario puede leer y escribir porque es el dueño; www-data puede leer y escribir por los permisos de grupo.

0voto

Melk comentado

Mi usuario está en el grupo www-data lo cual quiere decir que puedo hacer operaciones sobre los archivos de www-data. Si me traigo algo con Git/SVN o se autogenera como en el caso de Koala el usuario para los nuevos archivos es el de mi usuario. En este caso el usuario www-data no es miembro del grupo al que pertenece mi usuario (david:david) por lo que tengo 2 opciones o cambio manualmente el dueño a www-data o añado www-data al grupo david (el que se genera por defecto).

El problema de esto es que no quiero meter al usuario www-data al grupo de mi usuario por seguridad.

0voto

Leonardo-Tadei comentado

Hola @Melk!

probá la solución que te propongo... te llevará menos de 10 minutos, incluyendo cerrar y abrir tu sesión (o reiniciando para estar más seguro).

Después me contás...

3votos

white Puntos75880

Hola @Melk, si entiendo bien quieres que al crear un archivo en /html se defina un propietario por default? me parece que eso no es posible ya que siempre se define como propietario el usuario que creo la carpeta o el archivo. no obstante es posible que todos los usuarios en un grupo puedan modificar los archivos en una carpeta.

agrega el grupo a la carpeta

chgrp www-data /var/www/html

dale permisos de escritura al grupo en la carpeta

chmod g+w /var/www/html

define el setgid a la carpeta, con esto todos los archivos creados heredaran los permisos de la carpeta padre:

chmod g+s /var/www/html

ahora define la lista de control de acceso en la carpeta

setfacl -d -m u::rwx,g::rwx,o::r-x /var/www/html

http://www.alcancelibre.org/staticpages/index.php/uso-getfacl-getfacl


EDIT: existe una posibilidad de cambiar de propietario cada vez que un usuario crea una carpeta o archivo, es con el uso de incron, el problema es que no da para ser recursivo.

instalandolo:

apt-get install incron

agrega los usuarios permitidos para usar incron, uno por cada linea:

gedit /etc/incron.allow

luego debes agregar los usuarios que deseas usarlos con las tablas de incron:

incrontab -e -u invitado

agregas este codigo:

/var/www/html IN_CREATE chown usuario:www-data $@/$#

de esta forma cada vez que invitado cree una carpeta o archivo en var/www/html se correra el comando chown usuario:www-data cambiando el propietario del archivo o carpeta a usuario.

Existen mas opciones como IN_MODIFY que se dispara cuando un archivo fue modificado.

mas info: https://www.howtoforge.com/triggering-commands-on-file-or-directory-changes-with-incron.

Alternativas a la carente recursividad de incron:

https://github.com/gregghz/Watcher
http://linux.die.net/man/1/inotifywait

0voto

Melk comentado

Según comentas incron saltará como trigger por cada archivo creado, lo cual, no creo que sea necesaria controlar la recursividad no? a fin de cuentas saltara por cada carpeta/fichero creado no?

Corrígeme si me estoy equivocando por favor :)

0voto

white comentado

incron funciona en el directorio que fue agregado con incrontab -e, deberías agregar los subdirectorios para que se gatille el evento IN_CREATE u otro evento en dicho subdirectorio.

/var/www/html/subdirectorio IN_CREATE chown usuario:www-data $@/$#
/var/www/html/otro_subdirectorio IN_CREATE chown usuario:www-data $@/$#

como alternativa a incron esta inotifywait o watcher en python que es mas personalizable.

con inotifywait podrias usar un bash en background, por ejemplo:.

#!/bin/sh
while true; do

    inotifywait --format "%e %w%f" -r -m -e create,modify,move "/var/www/html" | while read event filename; do

        echo "$event => $filename"
        #chown usuario:www-data $filename

    done

done

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta