¿Cómo establecer permisos predeterminados para archivos movidos o copiados a un directorio?

9

Mi pregunta es similar a Cómo establecer los permisos de archivo predeterminados en TODOS los archivos recién creados en Linux , pero difiere en formas importantes:

Quiero que todos los archivos creados (o copiados o movidos a) un determinado directorio hereden un conjunto de permisos predeterminados que es diferente del predeterminado del sistema.

Justificación: El directorio en cuestión es la "tolva de admisión" para una aplicación. Los usuarios en un grupo colocan los archivos en el directorio, y la aplicación (que se ejecuta con otra identificación de usuario en el mismo grupo) los toma y los procesa. El problema es que el propietario de cada archivo colocado en el directorio es el usuario que lo colocó allí, y los permisos están predeterminados en "rw-r - r--"; Quiero cambiar eso a "rw-rw ----". La aplicación que realiza la admisión no puede hacer eso explícitamente, porque el ID de usuario con el que se ejecuta la aplicación no posee el archivo en cuestión, ¡y los permisos predeterminados no permiten que la aplicación chmod en el archivo! Obviamente, el usuario podría hacer un chmod después de colocar el archivo allí, pero quiero mantener la "caída" del usuario lo más simple posible. (Estas personas no son alfabetizadas en Linux,

umask parece demasiado poderoso: no quiero establecer permisos predeterminados para cada archivo creado en cualquier lugar por estos usuarios, solo aquellos creados en (o colocados en) este directorio.

¡Por favor asesóreme, gracias!

Robar
fuente

Respuestas:

5

Puede usar una ACL (lista de control de acceso) para establecer los permisos predeterminados para los archivos en un directorio.

De man 5 acl:

Si una ACL predeterminada está asociada con un directorio, el parámetro de modo para las funciones que crean objetos de archivo y la ACL predeterminada del directorio se utilizan para determinar la ACL del nuevo objeto:

  1. El nuevo objeto hereda la ACL predeterminada del directorio contenedor como su ACL de acceso.

  2. Las entradas de ACL de acceso correspondientes a los bits de permiso de archivo se modifican para que no contengan permisos que no estén contenidos en los permisos especificados por el parámetro de modo.

Para configurarlo (cambiar dispositivo, directorios, etc., en consecuencia):

Edite su /etc/fstabarchivo y agregue la aclopción de montaje.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Vuelva a montar ( página de manual de Sambamount.cifs ) su sistema de archivos reiniciando o use:

mount -o remount,acl /home

Asegúrate de que tienes la setfacly getfaclutilidades.

Establezca la ACL predeterminada en el directorio (también puede necesitar configurar la ACL en los archivos existentes):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Vea el tutorial vinculado para más información.

Fuente: Tutorial Parte 1 y Parte 2

Referencia: listas de control de acceso POSIX en Linux

Pausado hasta nuevo aviso.
fuente
No creo que deba agregar aclcomo una opción al mountcomando cuando lo haya agregado /etc/fstab. Será redundante y cuando ejecutes el mountcomando en tu respuesta, obtendrás una salida como esta: /dev/vda1 on / type ext4 (rw,errors=remount-ro,acl,acl)(ver acl,aclal final). Por favor corríjalo si no estoy equivocado.
its_me
1

Puedo ofrecer una solución alternativa: haga un directorio "drop" separado, ejecute un minijob por separado que corrija los permisos y luego mueva los archivos al directorio de datos de la aplicación. Puede usar incron para eso para que prácticamente no haya un retraso de tiempo notable.

Peter Eisentraut
fuente
1

Puedo pensar en cuatro posibles métodos para hacer esto:

  • umask, que no deseas usar
  • programa contenedor, que establece la umask de esa aplicación, no la del usuario
  • cron, como describió @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \;, diferentes sistemas tienen mejoras de rendimiento en esto (como la -exec+opción)
  • configuraciones basadas en directorios, que requieren un poco de programación de shell para hacer, pero básicamente el shell, al configurar el indicador o llamar a cd, cambiaría la umask si hay un archivo de puntos presente en ese directorio (o posiblemente un directorio ancestro); para bash, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"sería lo más simple.
Arcege
fuente