ACLs - Listas de Control de Acceso

Rafa Morales 7 Noviembre 2013
4min
0
Linux

Las ACLs (Access Control Lists) proveen un mecanismo para especificar permisos en archivos y directorios mucho más potente y flexible que el sistema estándar de permisos que trae el propio sistema Linux.

Estas ACLs se almacenan en el mismo sistema de archivos, por lo que lo primero que tendremos que hacer es comprobar si nuestro kernel y nuestro sistema de archivos están preparados para soportarlos.

Tanto ext2, ext3 y ext4 poseen dicha funcionalidad, por lo que si tenemos alguno de estos sistemas de archivos sólo nos quedará comprobar si nuestro kernel está compilado para ello. Buscaremos en el fichero de configuración del kernel las líneas que nombre las ACLs de la siguiente manera, indicando el fichero que tengamos en nuestro sistema, por ejemplo:

cat /boot/config-3.2.0-4-686-pae | grep -i ACL

La salida del comando será algo parecida a lo siguiente:

CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_OCFS2_FS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m

 

Si no estuviera soportado deberíamos recompilar nuestro kernel. Si está soportado, el siguiente paso sería instalar el paquete:

apt-get install acl

 

A continuación deberíamos montar la partición en la que queramos aplicar las ACLs con el parámetro adecuado, por lo que modificaremos el fichero /etc/fstab para indicarlo:

UUID=56da7c72-fa60-4a5b-9ef5-ad2c4be175ca    /    ext4    errors=remount-ro,acl     0       1

Reiniciaremos el sistema o remontaremos la partición para que se apliquen las nuevas características:

mount -o remount,acl /

 

getfacl

Utilizaremos el comando getfacl para visualizar los permisos que posee un archivo o directorio en concreto:

getfacl /mnt/disco_2

# file: disco_2/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

 

El comando ls nos permitirá saber si un archivo o directorio tiene ACLs definidos, pero no cuales, si al ver los detalles del mismo aparece un signo + a continuación de los permisos:

ls -l

drwxrwxr-x+ 2 root root 4096 nov  7 11:35 disco_2

 

setfacl

Utilizaremos el comando setfacl para establecer las ACLs a un archivo o directorio. La sintaxis será indicando los siguientes valores:

[ugo]:[nombre_usuario_o_grupo]:[permiso]

Con el parámetro -m añadimos o modificamos los permisos actuales:

setfacl -m u:alumno:rwx /mnt/disco_2/
setfacl -m u:alumno:7 /mnt/disco_2/

Con el parámetro -x eliminamos a un usuario o grupo:

setfacl -x u:alumno /mnt/disco_2/

on el parámetro -R lo realizamos de manera recursiva en todos los subdirectorios y archivos existentes:

setfacl -R -m u:alumno:rwx /mnt/disco_2/

Con el parámetro -b eliminamos todas las ACLs existentes:

setfacl -b -R /mnt/disco_2/

 

Si ahora comprobáramos las ACLs obtendríamos el siguiente resultado:

getfacl /mnt/disco_2/

# file: disco_2/
# owner: root
# group: root
user::rwx
user:alumno:rwx
group::r-x
other::r-x

 

El problema de las ACLs es que por defecto no se heredan en los archivos y directorios que se crean posteriormente dentro de un directorio que ya tiene las ACLs asignadas. Para conseguir este funcionamiento, debemos asignar las ACLs por defecto a los directorios. Esto lo conseguimos con el parámetro -d.

setfacl -d -m u:alumno:rwx /mnt/disco_2/
setfacl -d -x u:alumno /mnt/disco_2/

En este caso, todos los archivos que se creen dentro de este directorio poseerán las mismas ACLs que las asignadas a su directorio padre. Si comprobamos en este caso las ACLs de este directorio, la salida es algo diferente a la anterior:

getfacl /mnt/disco_2/

# file: disco_2/
# owner: root
# group: root
user::rwx
user:alumno:rwx
group::r-x
other::r-x
default:user::rwx
default:user:alumno:rwx
default:group::r-x
default:other::r-x

Con el parámetro -k eliminaremos todas las ACLs por defecto asignadas:

setfacl -R -k /mnt/disco_2/