¿Cómo configuro umask predeterminado en Apache en Debian?

14

Necesito archivos creados por apache2 para tener umask 002, es decir, grupo rw, por defecto.

Intenté poner umask 002/ etc / apache2 / envvars y, aunque este script se ejecuta como parte del inicio de apache ( apache2ctl graceful), el umask no tiene ningún efecto. Presumiblemente en algún lugar más adelante en el proceso de inicio (p. Ej., Cuando el usuario está degradado de roota www-data) hay un lugar mejor para poner esto.

He leído publicaciones sobre Fedora y una que sugiere poner umask /etc/init.d/apache2pero ninguno de estos aplica / funciona en Debian (Squeeze).

¿Puede usted ayudar?

artfulrobot
fuente
1
Debe intentar reiniciar Apache con "/etc/init.d/apache2 restart" o "service apache2 restart"
Jens Bradler
Sí, ninguno funcionó.
artfulrobot
¿Cómo se crean nuevos archivos (WebDAV, PHP)?
Jens Bradler
En mi prueba, estoy usando file_put_contents (). pero el código que estoy tratando de "arreglar" con esto es el módulo Less de Drupal (que crea versiones en caché de los archivos Less CSS procesados). Mi problema específico es que no puedo ejecutarme drush cc allcomo mi usuario porque da error en todos estos archivos de caché creados con www-data.
artfulrobot

Respuestas:

11

Para asegurarse de que la configuración de umask surta efecto, utilice una prueba simple y no utilice ninguna otra aplicación web para esto. Es posible que estas aplicaciones cambien los derechos independientemente de la configuración de umask de Apache.

Script PHP de prueba simple:

<?php
if ($fp = fopen(time() . '.txt', 'w')) {
  fwrite($fp, 'This is a simple test.');
  fclose($fp);
  echo "done";
} else {
  echo "error - cannot create file";
}
?>

Tenga cuidado de que el usuario www-data tenga acceso de escritura a la carpeta donde instaló este archivo de prueba simple.

Para ejecutar la nueva umask, verifique si el archivo / etc / apache2 / envvars se usará dentro de su archivo de inicio de Apache /etc/init.d/apache2:

...
PIDFILE=$(. /etc/apache2/envvars && echo $APACHE_PID_FILE)
...

Configure su umask en / etc / apache2 / envvars:

...
# umask 002 to create files with 0664 and folders with 0775
umask 002

Reinicia tu Apache:

service apache2 restart

Comprueba la diferencia:

#> ls -l *.txt
-rw-rw-r-- 1 www-data www-data  14 2012-05-01 15:56 1335880583.txt
-rw-r--r-- 1 www-data www-data  14 2012-05-01 15:55 1335880540.txt
Jens Bradler
fuente
¡Gracias! Incluso si me hizo sentir como un idiota leerlo (tenía el octal equivocado para el grupo rw) * rubor *
artfulrobot
Su pequeño fragmento de PHP me salvó la cordura, el plugin PDO Sqlite3 Wordpress siempre configurará el grupo para leer solo para su archivo de base de datos.
Daniel Sokolowski
2

Si ejecuta varios sitios, puede establecer permisos de grupo predeterminados usando las Listas de control de acceso (ACL) por directorio de la siguiente manera:

Establezca el setidindicador para forzar que todos los archivos nuevos hereden el grupo del directorio:

# chmod g+s wordpress

Crear nuevos archivos rwpara los permisos de grupo, ej. para que www-datapueda escribir en archivos SFTPed por el usuario de carga:

# setfacl --default --modify group::rwx wordpress 

Confirme que la ACL es así:

# getfacl wordpress
# file: wordpress
# owner: carissacosgrove
# group: www-data
# flags: -s-
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::r-x

Cree un archivo para confirmar que funcionó:

# ll test
-rw-rw-r-- 1 root www-data 0 Feb 17 01:09 test
Daniel Sokolowski
fuente
¿No será problemático si la aplicación intenta escribir archivos con un permiso reducido a propósito?
berbt
No, en absoluto, la aplicación se limite a escribir con permisos reducidos, que realmente me confundió un poco al principio - stackoverflow.com/questions/28454551/...
Daniel Sokolowski
1
Creo que a este comando setfacl --default --modify group:rwx wordpressle faltan dos puntos. Debería sersetfacl --default --modify group::rwx wordpress
Marcos
2

(Para Debian Stretch que usa systemd - ¡Gracias womble!)

Coloque UMask=0002el archivo de la unidad de servicio systemche Apache2, vuelva a cargar la unidad de servicio y luego reinicie Apache2.

$ pwd
/etc/systemd/system/multi-user.target.wants

$ cat apache2.service
[Unidad]
Descripción = El servidor HTTP Apache
Después = network.target remote-fs.target nss-lookup.target

[Servicio].
.
.
.
UMask = 0002

$ sudo systemctl daemon-reload
$ sudo systemctl restart apache2
duplexddaann
fuente
Debian Squeeze no usó systemd.
womble
Ah, sí, al final del cuerpo de la pregunta original dicen Debian Squeeze. Como la pregunta era de hace ~ 8 años a partir de hoy, y mientras intentaba resolver el problema planteado en el título con el último Debian a fines de 2019, eso es lo que publiqué. Creo que la mayoría de las personas que buscan una solución hoy en comparación con hace ocho años pueden beneficiarse de mi solución, así que dejaré lo que puse. Gracias por señalarlo.
duplexddaann