Configuración de diferentes ACL en directorios y archivos

15

Quiero configurar permisos predeterminados para un recurso compartido de archivos para que todos puedan rwx todos los directorios y para que todos los archivos recién creados sean rw.

Todos los que acceden a este recurso compartido están en el mismo grupo, por lo que esto no es una preocupación.

He observado hacer esto a través de ACLs sin cambiar todos los umasks de los usuarios y demás. Aquí están mis invocaciones actuales:

setfacl -Rdm g:mygroup:rwx share_name
setfacl -Rm g:mygroup:rwx share_name

Mi problema es que si bien quiero todos los nuevos creados subdirectorios ser rwx, Solo quiero de nueva creación archivos ser rw.

¿Alguien tiene un método mejor para lograr el resultado final deseado? ¿Hay alguna manera de establecer las ACL en los directorios por separado de los archivos, de forma similar a chmod +x contra chmod +X?

Gracias

durandal
fuente

Respuestas:

12

Como señala Gilles, setfacl los permisos predeterminados especifican los permisos máximos, básicamente reemplazando el umask. Así que los archivos recién creados serán rw a menos que la aplicación que creó el archivo solicite especialmente que sea ejecutable.

$ mkdir test
$ touch test/oldfile
$ getfacl test/oldfile
# file: test/oldfile
# owner: myuser
# group: myuser
user::rw-
group::r--
other::r--

$ setfacl -m d:g:mygroup:rwx test
$ touch test/newfile
$ getfacl test/newfile
# file: test/newfile
# owner: myuser
# group: myuser
user::rw-
group::r-x                         #effective:r--
group:mygroup:rwx                  #effective:rw-
mask::rw-
other::r--

Tenga en cuenta los permisos efectivos anteriores. (Solo hay unos pocos programas que solicitarán establecer el bit de ejecución en los archivos que crea, por ejemplo. gcc para ejecutables y cp si el archivo que se copiaba era ejecutable)

¿O quiso decir que el primer comando setfacl estaba funcionando como usted quería, pero el segundo no lo estaba? En otras palabras, ¿está buscando reparar los permisos en los archivos antiguos, asegurándose de que los directorios sean transitables, sin dar a otros archivos regulares permisos de ejecución?

Mi version de setfacl permite X exactamente como quieras, por ejemplo:

setfacl g:mygroup:rwX

$ setfacl --version
setfacl 2.2.49
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ find test -ls
107513    4 drwxr-xr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-r--r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxr-xr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ setfacl -Rm g:somegroup:rwx test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rwxr--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir
$ rm -r test
$ mkdir test
$ mkdir test/olddir
$ touch test/oldfile
$ setfacl -Rm g:somegroup:rwX test
$ find test -ls
107513    4 drwxrwxr-x   3 myuser    myuser        4096 Dec 22 01:56 test
107539    0 -rw-rw-r--   1 myuser    myuser           0 Dec 22 01:56 test/oldfile
107529    4 drwxrwxr-x   2 myuser    myuser        4096 Dec 22 01:56 test/olddir

Si tu versión de setfacl no soporta eso, porque no usar find?

sobrescriba los permisos, configurándolos en rw para archivos y rwx para dirs

$ find . \( -type f -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -type d -exec setfacl -m g:mygroup:rwx '{}' ';' \)

establecer los permisos de ACL de mi grupo según los permisos de grupo existentes

$ find . \( -perm -g+x -exec setfacl -m g:mygroup:rw '{}' ';' \) \
      -o \( -exec setfacl -m g:mygroup:rwx '{}' ';' \)

Probablemente querrá comprobar que la máscara de grupo proporciona permisos efectivos. Si no, tendrás que ejecutar esto también:

$ find . -type d -exec chmod g+rwX '{}' ';'
Mikel
fuente
3

Para futuros lectores, utilizar. setfacl en archivos / carpetas existentes sin agregar el bit ejecutable a sus archivos, la solución es esta parte de @ La respuesta de Mikel :

Mi versión de setfacl le permite a X exactamente como lo desea, por ejemplo:

setfacl g:mygroup:rwX

Extracto relevante de la setfacl documentación :

El campo perms es una combinación de caracteres que indican el   permisos: leer (r), escribir (w), ejecutar (x), ejecutar solo si el   El archivo es un directorio o ya tiene permiso de ejecución para algunos   usuario (X) .

Erik Koopmans
fuente
2

Por lo que entiendo de las ACL de Linux, setfacl -Rdm g:mygroup:rwx share_name hace exactamente lo que quieres. Experimentar:

umask 007
mkdir foo
chgrp mygroup foo
chmod 2700 foo
setfacl -d -m group:mygroup:rwx foo
setfacl -m group:mygroup:rwx foo
touch foo/data
echo '#!/bin/ls' >foo/exec
chmod +x foo/exec

Entonces como un usuario diferente en grupo mygroup:

$ cat foo/*
#!/bin/ls
#!/bin/ls
$ ./foo/data
ash: ./foo/data: Permission denied
$ ./foo/exec
./foo/exec

¿Que esta pasando?

$ getfacl foo/data
# file: foo/data
# owner: myuser
# group: mygroup
user::rw-
group::---
group:mygroup:rwx                 #effective:rw-
mask::rw-
other::---

La ACL efectiva para mygroup es el resultado de and'ing the ACL_GROUP entrada para mygroup ( rwx ) con la entrada ACL_MASK ( rw- ).

los La página del manual de acl (5) Esto explica el cálculo en "algoritmos de verificación de acceso". No explica como ACL_MASK Se generan entradas, pero en la práctica parece suceder lo correcto.

Gilles
fuente