setfacl: ¿Son estos dos comandos iguales?

10

Tengo un script de implementación (basado en capifony) que establece los permisos en servidores específicos para una instalación de Symfony2. Contiene los siguientes dos comandos para hacer esto para varios directorios:

setfacl -R -m u:www-data:rwx -m u:`whoami`:rwX app/cache
setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwX app/cache

Estos dos comandos están en el sitio de Symfony2 como una forma de arreglar los permisos, sin embargo, estos se parecían sorprendentemente a mí. Así que eché un vistazo a las páginas de manual setfacly, por lo que pude entender, el segundo comando hace exactamente lo que hace el primero con una opción adicional (que no entiendo del todo). Mi pregunta es, ¿es correcta mi suposición? Si es así, ¿tendría el mismo efecto si eliminara el primer comando?

Hosh Sadiq
fuente

Respuestas:

15

El primer comando cambiará los permisos de cualquier archivo / directorio preexistente. El -dsegundo comando es crítico para establecer los permisos predeterminados en adelante para cualquier directorio, que a su vez proporcionará un conjunto predeterminado de ACL para cualquier archivo dentro de estos directorios.

NOTA: Que en ambos casos los comandos se ejecutarán recursivamente a través del -Rconmutador.

Con respecto al -dcambio, desde la setfaclpágina del manual:

   -d, --default
       All operations apply to the Default ACL. Regular ACL entries in the 
       input set are promoted to Default ACL entries. Default ACL  entries
       in the input set are discarded. (A warning is issued if that happens).

Este extracto también lo explica bastante bien:

Hay dos tipos de ACL: las ACL de acceso y las ACL predeterminadas. Una ACL de acceso es la lista de control de acceso para un archivo o directorio específico. Una ACL predeterminada solo puede asociarse con un directorio; Si un archivo dentro del directorio no tiene una ACL de acceso, utiliza las reglas de la ACL predeterminada para el directorio. Las ACL predeterminadas son opcionales.

Fuente: 8.2. Configuración de ACL de acceso .

Ejemplo

Digamos que tengo esta estructura de directorio.

$ tree
.
|-- dir1
|   |-- dirA
|   |   `-- file1
|   `-- fileA
`-- file1

2 directories, 3 files

Ahora configuremos los permisos usando el primer setfaclcomando en su pregunta:

$ setfacl -R -m u:saml:rwx -m u:samtest:rwX .

Lo que resulta en lo siguiente:

$ getfacl dir1/ file1
# file: dir1
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Sin el -dRcomando que se ejecuta aquí, los directorios nuevos no estarían cubiertos por sus ACL:

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
group::rwx
other::r-x

Pero si eliminamos este directorio y ejecutamos el setfacl -dR ...comando y repetimos esta operación anterior:

$ rmdir dir2
$ setfacl -dR -m u:saml:rwx -m u:samtest:rwX .

Ahora los permisos se ven bastante diferentes:

$ getfacl dir1/ file1 
# file: dir1/
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

# file: file1
# owner: saml
# group: saml
user::rw-
user:saml:rwx
user:samtest:rwx
group::rw-
mask::rwx
other::r--

Y ahora nuestro directorio recién creado recogerá estos permisos "predeterminados":

$ mkdir dir2

$ getfacl dir2
# file: dir2
# owner: saml
# group: saml
user::rwx
user:saml:rwx
user:samtest:rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:saml:rwx
default:user:samtest:rwx
default:group::rwx
default:mask::rwx
default:other::r-x

Tener estos permisos en su lugar dir2ahora también aplicará estos permisos en los archivos dir2:

$ touch dir2/fileA
$ getfacl dir2/fileA 
# file: dir2/fileA
# owner: saml
# group: saml
user::rw-
user:saml:rwx           #effective:rw-
user:samtest:rwx        #effective:rw-
group::rwx          #effective:rw-
mask::rw-
other::r--
slm
fuente
Ah, así que solo para confirmar, ¿quiere decir que si tenemos el directorio app/cacheque contiene un directorio llamado dev, el primer comando se aplicará a eso, pero no el segundo? ¿Y si luego se agrega otro directorio (por ejemplo prod), el segundo comando establecerá los permisos? Si este no es el caso, ¿debería poder omitir el segundo comando?
Hosh Sadiq
1
@HoshSadiq: no, -Res un comando recursivo, por lo que se aplican los permisos. Los -dguardias si alguien creara un directorio o moviera algún directorio al árbol más adelante para que también se aplicara esta ACL.
slm
¡Eso es genial! Hace las cosas mucho más claras :) ¡Gracias!
Hosh Sadiq