¿Establecer permisos predeterminados para archivos y subdirectorios recién creados en un directorio en Linux?

99

Tengo un montón de scripts y aplicaciones de larga duración que almacenan los resultados de salida en un directorio compartido entre algunos usuarios. Me gustaría una forma de asegurarme de que todos los archivos y directorios creados en este directorio compartido tengan u=rwxg=rwxo=rpermisos automáticamente .

Sé que podría usar umask 006al principio mis diversos scripts, pero no me gusta ese enfoque, ya que muchos usuarios escriben sus propios scripts y pueden olvidarse de configurar el umask ellos mismos.

Realmente solo quiero que el sistema de archivos configure los archivos y directorios recién creados con un permiso determinado si está en una carpeta determinada. ¿Es esto posible?

Actualización : creo que se puede hacer con POSIX ACL , utilizando la funcionalidad de ACL predeterminada, pero todo está un poco sobre mi cabeza en este momento. Si alguien puede explicar cómo usar las ACL predeterminadas, probablemente respondería muy bien a esta pregunta.

David Dean
fuente
1
Las ACL de POSIX son agradables, sin embargo, un buen 60% de las máquinas que encuentre no las tendrán encendidas para ciertos sistemas de archivos, dependiendo de la distribución. Aquí hay una muy buena introducción y ejemplo: suse.de/~agruen/acl/linux-acls/online
Tim Post
1
Te refieres al mismo documento que vinculé :) No he tenido un cambio para leerlo todavía, pero gracias por el aviso sobre el problema de disponibilidad.
David Dean
1
El enlace en el comentario de Tim Post parece estar muerto, pero gracias a Internet Archive, pude verlo y verificar que vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html contiene exactamente el mismo documento. Editaré la pregunta para actualizar el enlace.
rmunn

Respuestas:

78

Para obtener la propiedad correcta, puede establecer el grupo setuid bit en el directorio con

chmod g+rwxs dirname

Esto asegurará que los archivos creados en el directorio sean propiedad del grupo. Luego debe asegurarse de que todos ejecuten umask 002 o 007 o algo de esa naturaleza, por eso Debian y muchos otros sistemas Linux están configurados con grupos por usuario de forma predeterminada.

No conozco una forma de forzar los permisos que desea si la umask del usuario es demasiado fuerte.

Norman Ramsey
fuente
23
Esto realmente no proporciona una solución; está preguntando sobre permisos, no sobre propiedad, y la única forma de hacerlo es con las ACL
Yarin
3
"... asegúrate de que todos corran con umask 002 o 007 o algo por el estilo", eso es un poco exagerado ... ¿Cómo se puede hacer que Postfix, Dovecot, Clam y Spam Assassin hagan esto?
jww
2
¿Qué hace la +spieza? Gracias.
tommy.carstensen
1
En este caso, significa establecer ID de grupo. Es decir, usamos g + s para establecer el bit SGID. Digo "en este caso" porque + s se combinó con g para el grupo. + s también se puede utilizar para configurar el bit SUID (setuid).
Bastión
57

A continuación, se explica cómo hacerlo con las ACL predeterminadas, al menos en Linux.

Primero, es posible que deba habilitar la compatibilidad con ACL en su sistema de archivos. Si está utilizando ext4, entonces ya está habilitado. Otros sistemas de archivos (por ejemplo, ext3) deben montarse con la aclopción. En ese caso, agregue la opción a su /etc/fstab. Por ejemplo, si el directorio está ubicado en su sistema de archivos raíz:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

Luego vuelva a montarlo:

mount -oremount /

Ahora, use el siguiente comando para establecer la ACL predeterminada:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

Todos los archivos nuevos /shared/directoryahora deberían obtener los permisos deseados. Por supuesto, también depende de la aplicación que crea el archivo. Por ejemplo, la mayoría de los archivos no serán ejecutables por nadie desde el principio (dependiendo del argumento de modo para la llamada open (2) o creat (2)), al igual que cuando se usa umask. Algunas utilidades como cp, tary rsynctratarán de preservar los permisos de los archivos de origen que enmascararán su ACL predeterminada si el archivo de origen no se puede escribir en grupo.

¡Espero que esto ayude!

pelle
fuente
Parece que esto todavía requiere adecuado umaskpara todos los usuarios. = / unix.stackexchange.com/questions/71743/…
anatoly techtonik
1
@techtonik Como escribí, depende de la aplicación que cree el archivo. Por ejemplo, si lo usa cp, intentará copiar los permisos del archivo fuente. Ni siquiera umaskayuda cuando se usa cp. He visto el mismo problema con tar. Vea esta pregunta .
pelle
@techtonik He agregado una oración sobre esto en mi respuesta ahora.
pelle
1
sí, parece que el problema estaba en la aplicación estableciendo forzosamente los derechos en 644 cuando mi configuración correcta de ACL y POSIX era para 664. Sería bueno aclarar este mecanismo de respaldo para las personas que resuelven el problema. Muchos ni siquiera conocen umask.
anatoly techtonik
Quiero decir que perdí algo de tiempo tratando de ver si no tengo las banderas de montaje configuradas correctamente (y en ext4 no se pueden configurar, porque parece que funcionan automáticamente). No hay información sobre cómo verificar si setfacl works correctly, supongo que debería fallar, pero no estoy seguro, porque la respuesta no alcanza ese punto.
anatoly techtonik
4

Es feo, pero puede usar el comando setfacl para lograr exactamente lo que desea.

En una máquina Solaris, tengo un archivo que contiene las acls para usuarios y grupos. Desafortunadamente, debe enumerar todos los usuarios (al menos no pude encontrar una manera de hacer que esto funcione de otra manera):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

Nombra el archivo acl.lst y completa tus nombres de usuario reales en lugar de user_X.

Ahora puede configurar esos acls en su directorio emitiendo el siguiente comando:

setfacl -f acl.lst /your/dir/here
innaM
fuente
¿Puedes dejar fuera de la lista de usuarios si todos son miembros del mismo grupo y solo usar los permisos del grupo?
David Dean
Me estaba haciendo la misma pregunta. Ha pasado un tiempo desde que configuré esto. Pero cada vez que obtengo un nuevo usuario (en el mismo grupo que los demás), me olvido de actualizar la lista y recibiré quejas sobre el nuevo usuario que no puede escribir / eliminar archivos. Entonces la respuesta es: No, no puedes.
innaM
4

en su script de shell (o .bashrc) puede usar algo como:

umask 022

umask es un comando que determina la configuración de una máscara que controla cómo se establecen los permisos de archivo para los archivos recién creados.

user3270784
fuente
1
Esto no es correcto porque umask limita los permisos, no puede agregar permisos
ACV
@ACV ¿puedes dar más detalles? Esto funciona para mí, los archivos recién creados ahora permiten que los miembros del grupo tengan permisos rw cuando yo los tengo umask 002en mi .bashrc.
Arthur Dent
3
@ArthurDent umask 002limita el acceso a otros, dejando el grupo sin cambios. Recuerde, es ugo- ese es el grupo de usuarios otros. También recuerde que umask básicamente significa restar de los valores predeterminados. Para archivos: 666 - 002significaría 664, lo que significa que el grupo no se ve afectado.
ACV