Saltar la navegación

Listas de control de acceso - ACLs

Las listas de control de acceso o ACLs nos van a servir para ampliar las posibilidades de gestión de la seguridad sobre ficheros y directorios que nos ofrecen los permisos r, w y x, junto con los comandos chmod, chgrp y chown. Con las ACLs acciones como asignar permisos diferentes a usuarios diferentes sobre un mismo fichero o directorio, van a ser posibles.

Con las listas ACLs se van a poder asignar permisos individualizados para usuarios y grupos sobre ficheros y directorios. Será necesario que el kernel las admita para los sistemas de ficheros que utilicemos. Esto lo podemos comprobar con la siguiente orden:

# grep ACL /boot/config-$(uname -r) 
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_F2FS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_EROFS_FS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CEPH_FS_POSIX_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

Como vemos, la línea 'CONFIG_EXT4_FS_POSIX_ACL=y' indica, a través de la 'y', que el propio kernel ya maneja las ACLs para el sistema de ficheros ext4. Una 'm' indicaría que el módulo está compilado, pero tiene que cargarse en memoria, y una 'n' nos diría que el módulo no se ha compilado, por lo que la característica en cuestión no está accesible.

Pasamos ahora a instalar el paquete acl que no aportará los comandos necesarios para la configuración de las ACLs. Es muy probable en Debian, si la comprobación anterior fue positiva, que el paquete se encuentre instalado.

# apt install acl
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias... Hecho
Leyendo la información de estado... Hecho
acl ya está en su versión más reciente (2.3.1-3).
fijado acl como instalado manualmente.
0 actualizados, 0 nuevos se instalarán, 0 para eliminar y 0 no actualizados.

En Debian, por defecto, los sistemas de ficheros (particiones) se montan con la opción acl, por lo que directamente podemos aplicar ACLs. Podemos comprobar que es así con el siguiente comando:

# tune2fs -l /dev/sda1 | grep options
Default mount options: user_xattr acl

Si no fuese así, si la opción acl no hubiese salido en la información mostrada por el comando anterior, lo que tendríamos que hacer sería añadirla en el fichero /etc/fstab como opción de montaje de los sistemas de ficheros donde queramos aplicar ACLs.

/dev/sda1   /   ext4   defaults,quota   0   1

Ahora, reiniciamos el sistema o bien montamos el sistema de ficheros como sigue:

# mount -o remount /dev/sda1

A partir de este momento, tanto el root, como el resto de usuarios, podrán utilizar los comandos getfacl y setfacl para gestionar sus ACLs.

Con el comando getfacl podemos consultar la ACL de un fichero o directorio, su sintaxis es la siguiente:

getfacl [-R] {fichero|directorio}...

La opción -R mostrará recursivamente las ACLs del contenido de los directorios especificados.

$ > datos.txt
$ ls -l datos.txt
-rw-r--r-- 1 usuario usuario 0 dic 13 12:36 datos.txt
$ getfacl datos.txt
# file: datos.txt
# owner: usuario
# group: usuario
user::rw-
group::r--
other::r--

En este caso la ACL solo contiene los permisos del dueño del fichero, del grupo del fichero y del resto de usuarios del sistema, es decir, los permisos que muestra el comando ls -l.

El comando setfacl se utiliza para asignar ACLs a usuarios y grupos sobre ficheros y directorios. Su sintaxis es la siguiente:

setfacl [-R] -m {user:usuario:permisos|group:grupo:permisos}... {fichero|directorio}...

La opción -R asignará recursivamente la ACL al directorio especificado.

$ setfacl -m u:u1:rwx,g:audio:rwx datos.txt 
$ getfacl datos.txt
# file: datos.txt
# owner: usuario
# group: usuario
user::rw-
user:u1:rwx
group::r--
group:audio:rwx
mask::rwx
other::r--

Podemos usar la opción -x para eliminar una ACL concreta, la sintaxis es la siguiente:

setfacl [-R] -x {user:usuario|group:grupo}... {fichero|directorio}...

La opción -R eliminará recursivamente la ACL al directorio especificado.

$ setfacl -x u:u1,g:audio datos.txt 
$ getfacl datos.txt
# file: datos.txt
# owner: usuario
# group: usuario
user::rw-
group::r--
mask::r--
other::r--

Se pueden eliminar todas las ACLs con la opción -b:

setfacl [-R] -b {fichero|directorio}...
$ getfacl datos.txt
# file: datos.txt
# owner: usuario
# group: usuario
user::rw-
user:u1:rwx
group::r--
group:audio:rwx
mask::rwx
other::r--
$ setfacl -b datos.txt 
$ getfacl datos.txt
# file: datos.txt
# owner: usuario
# group: usuario
user::rw-
group::r--
other::r--

Es posible hacer una copia de seguridad de las ACLs en un fichero y posteriormente restaurarlas. Para estos casos se utiliza la opción --restore, y además, puede ser interesante la opción -p para guardar la ruta absoluta de los ficheros y directorios, lo que nos permitirá hacer la restauración sea cual sea nuestro directorio de trabajo.

$ tree d
d
└── datos.txt

1 directory, 1 file $ setfacl -R -m user:u1:rwx,group:audio:rwx d $ getfacl -R d # file: d # owner: usuario # group: usuario user::rwx user:u1:rwx group::r-x group:audio:rwx mask::rwx other::r-x
# file: d/datos.txt # owner: usuario # group: usuario user::rw- user:u1:rwx group::r-- group:audio:rwx mask::rwx other::r-- $ getfacl -R ~/d getfacl: Eliminando '/' inicial en nombres de ruta absolutos # file: home/usuario/d # owner: usuario # group: usuario user::rwx user:u1:rwx group::r-x group:audio:rwx mask::rwx other::r-x # file: home/usuario/d/datos.txt # owner: usuario # group: usuario user::rw- user:u1:rwx group::r-- group:audio:rwx mask::rwx other::r-- $ getfacl -Rp ~/d # file: /home/usuario/d # owner: usuario # group: usuario user::rwx user:u1:rwx group::r-x group:audio:rwx mask::rwx other::r-x # file: /home/usuario/d/datos.txt # owner: usuario # group: usuario user::rw- user:u1:rwx group::r-- group:audio:rwx mask::rwx other::r-- $ getfacl -Rp ~/d > d.acl $ setfacl -R -b d $ getfacl -R d # file: d # owner: usuario # group: usuario user::rwx group::r-x other::r-x # file: d/datos.txt # owner: usuario # group: usuario user::rw- group::r-- other::r-- $ cd Documentos/ $ setfacl --restore=../d.acl $ getfacl -R ../d # file: ../d # owner: usuario # group: usuario user::rwx user:u1:rwx group::r-x group:audio:rwx mask::rwx other::r-x # file: ../d/datos.txt # owner: usuario # group: usuario user::rw- user:u1:rwx group::r-- group:audio:rwx mask::rwx other::r--