Encontré este ejemplo, titulado:ACL y MASK en Linux. En este artículo se demuestran los siguientes ejemplos que creo que ayudan a comprender cómo ACL y umask
interactuar entre sí.
Antecedentes
Cuando se crea un archivo en un sistema Linux, los permisos predeterminados 0666
se aplican mientras que cuando se crea un directorio, los permisos predeterminados 0777
se aplican.
ejemplo 1 - archivo
Supongamos que configuramos nuestra umask en 077 y tocamos un archivo. Podemos usar strace
para ver lo que sucede realmente cuando hacemos esto:
$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile
En este ejemplo podemos ver que el sistema llama a open()
se hace con los permisos 0666, sin embargo cuando el umask 077
luego es aplicado por el kernel, se eliminan los siguientes permisos (---rwxrwx
) y nos quedamos con rw-------
también conocido como 0600.
ejemplo - 2 directorio
El mismo concepto se puede aplicar a los directorios, excepto que en lugar de que los permisos predeterminados sean 0666, son 0777.
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777) = 0
drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
Esta vez estamos usando el mkdir
dominio. El mkdir
el comando luego llamó a la llamada del sistema mkdir()
. En el ejemplo anterior podemos ver que el mkdir
comando llamado mkdir()
llamada al sistema con los permisos predeterminados 0777
(rwxrwxrwx
). Esta vez con una máscara de 022
se eliminan los siguientes permisos (----w--w-
), por lo que nos queda 0755 (rwxr-xr-x
) cuando se crearon los directorios.
ejemplo 3 (aplicación de ACL predeterminada)
Ahora vamos a crear un directorio y demostrar lo que sucede cuando se le aplica la ACL predeterminada junto con un archivo dentro.
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir
$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
Ahora vamos a crear el archivo, aclfile
:
$ strace -s 128 -fvTttto luvly touch acldir/aclfile
# view the results of this command in the log file "luvly"
$ less luvly
Ahora obtenga los permisos del archivo recién creado:
$ getfacl --all-effective acldir/aclfile
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
Fíjate en la máscara, mask::rw-
. ¿Por qué no es mask::rwx
? como cuando se creó el directorio?
Verifica el luvly
archivo de registro para ver qué permisos predeterminados se usaron para la creación del archivo:
$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
Aquí es donde se pone un poco confuso. Con la máscara establecida en rwx
cuando se creó el directorio, esperaría el mismo comportamiento para la creación del archivo, pero no funciona de esa manera. Es porque el núcleo está llamando al open()
función con los permisos predeterminados de 0666
.
Para resumir
- Los archivos no obtendrán permiso de ejecución (enmascaramiento o efectivo). No importa qué método usemos:ACL, umask o máscara y ACL.
- Los directorios pueden obtener permisos de ejecución, pero depende de cómo esté configurado el campo de enmascaramiento.
- La única forma de establecer permisos de ejecución para un archivo que está bajo permisos de ACL es configurarlos manualmente usando
chmod
.
Referencias
- página man de acl
por motivos de seguridad, el sistema operativo Linux no permite la creación automática de un archivo con un bit de ejecución. Esto es para evitar que los atacantes cibernéticos escriban programas en dichos archivos y los ejecuten si obtienen acceso a su servidor. Es solo una precaución de seguridad. Siempre tendrá que configurar manualmente el bit de ejecución en los archivos después de crearlos con la utilidad chmod