Uso de Listas de Control de Accesos (ACLs) en Linux

Linux Nivel Alto 5 de feb. de 2023

Vamos a mostrar las posibilidades de permisos basados en ACLs

Introducción a las Listas de Control de Acceso - ACL

Una de las características que se echan en falta en los sistemas Linux actuales, especialmente en entornos corporativos, es la posibilidad de especificar los permisos de acceso a los ficheros con mayor granularidad.
Los sistemas Linux siguen el modelo de permisos Unix tradicional segmentando el tipo de acceso en tres categorías:

  • El propietario del fichero (User)
  • El grupo al que pertenece el fichero (Group)
  • El resto de usuarios del sistema que no están en ninguna de las dos categorías anteriores (Other).

Este modo de permisos se denomina modelo UGO (User, Group, Others)

Sin embargo, estas tres categorías se revelan insuficientes en una gran cantidad de situaciones, donde deseariamos poder especificar permisos diferenciados para varios usuarios o grupos determinados.

Aquí es donde entran en juego los permisos basados en Listas de Control de Acceso, más conocidos como ACLs. En este sistema de permisos los ficheros no tienen un juego fijo de permisos (como en el modelo tradicional, que tiene tres permisos y sólo tres), sino que los permisos del fichero son en realidad una lista de Entradas de Control de Acceso (o ACEs).
Cada una de estas ACEs contiene un par (usuario/grupo, permiso) que indica un tipo de acceso determinado para un usuario o grupo, y el conjunto de todas ellas forman la ACL que marca el tipo de acceso permitido en un fichero.

Cómo incorporar ACLs a nuestro sistema de Ficheros Linux

Para poder hacer uso de ACLs en Linux, si nuestros sistemas de ficheros son XFS, btrfs, ZFS y ext2/ext3/ext4.

Además debemos de tener actualizado nuestro Kernel a versiones superiores a 2.4.20, cosa que todas las distribuciones cumplen.

Nuestro Kernel tiene que estar compilado con las opciones de ACL necesarias para la versión del sistema de ficheros que estemos actualmente.

Primero averiguamos la versión de Kernel que estamos usando:

uname -r

5.10.0-21-amd64

Una vez determinado el Kernel actual filtramos la configuración actual para saber si disponemos de soporte para las ACLs:

cat /boot/config-$(uname -r)|grep -i ACL | sort

CONFIG_9P_FS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_CEPH_FS_POSIX_ACL=y
CONFIG_EROFS_FS_POSIX_ACL=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_F2FS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y

Tenemos que tener instalado los programas e2fsprogs y acl que dan soporte a los atributos extendidos (EAs) y a las Listas de Control de Accesos (ACLs)

El paquete acl, incluye varias herramientas (setfacl, getfacl, chacl)  que nos van a permitir gestionar las ACLs.


Soporte de ACLs en sistemas de ficheros compartidos mediante Samba

En el caso de disponer de un sistema de ficheros compartido con Samba, este debe haber sido creado o disponer de soporte para:

  • xatttr name spaces para usuarios y sistema.
  • Soporte para las Access Control Lists (ACL)

Podemos verificar si tenemos soporte para ACL en Samba, mediante el siguiente comando:

smbd -b | grep HAVE_LIBACL
HAVE_LIBACL

Si no obtenemos ese valor, Samba fue compilado forzando su compilación mediante el parámetro --with-acl-support=no y deberemos volver a compilar Samba con soporte para ACLs

Además indicaremos a Samba en su fichero de configuración smb.conf que vamos a querer usar de forma global soporte para ACLS, para ello en la sección [global] nos aseguraremos de tener las siguientes líneas:

[global]
...
vfs objects = acl_xattr
map acl inherit = yes
# Incluir línea siguiente solo si version de Samba es inferior a 4.9.0
store dos attributes = yes
...

Para más detalles sobre ajustes de ACLs en Samba lee el artículo de la Wiki oficial de Samba: "Setting and Share Using Windows ACLs"

Uso de las ACL

Una vez que hayamos comprobado que nuestro sistema tiene soporte y las aplicaciones necesarias para usar las ACL, podemos comenzar a usarlas.
Disponemos de 3 utilidades para usar las acl

  • getfacl: Consultar las ACL aplicadas a un directorio o fichero.
  • setfacl: Fijar las ACL a un directorio o fichero.
  • chacl: Modificar las ACL a un directorio o fichero, es IRIX-compatible con una sintaxis similar para su uso con XFS e IRIX.

Vamos a poner varios ejemplos para explicar el uso de estos comandos:

setfacl -b -k -R DirectorioConAcl
setfacl -R -m g:sistemas:rw DirectorioConAcl

El primer comando sirve para borrar las posibles ACLs que tuviese el directorio de nombre DirectorioConAcl, el borrado se indica con la opción -b. Usamos también la opción -k para borrar la ACL por defecto que pudiera tener incluida el directorio raíz de esa carpeta. Por ultimo el parámetro -R indica que realice la acción de modo recursivo, aplicandolo a todos los ficheros y directorios que haya dentro de DirectorioConAcl.
Se trata simplemente de una medida de precaución por si ya existiesen ACLs previas.

En la segunda instrucción indicamos que vamos a aplicar de modo recursivo (-R) el ajuste de las ACL, pero le indicamos que vamos a modificar (-m) la ACL de directorio indicado.
Hay que tener en cuenta que el comando setfacl distingue entre la opción de modificar (-m) y asignar (-s)


Nota: Asignar significa eliminar las ACLs previas, usaremos siempre -m para poder ir incluyendo nuevas ACLs sin eliminar las anteriores.


Luego nos encontramos con g:sistemas:rw, en esta parte indicamos si aplicamos la ACL un grupo (g), o a un usuario (u).
Despues, separado por dos puntos (:) el grupo (sistemas) o usuario al que deseamos dar permisos y luego, de nuevo separado por dos puntos el tipo de permiso a aplicar, en este caso lectura y escritura (rw) y por último el fichero o directorio (DirectorioConAcl) al que deseamos aplicar la ACL.

# Fijar ACL usando nombre (usuario/grupo)
setfacl [u|g]:[<nombre_usuario>|<nombre_grupo>]:[rwx-]

# Fijar ACL usando ID (UID/GID) del usuario o grupo
setfacl [u|g]:[<UID_usuario>|<GID_grupo>]:[rwx-]

Los tipos de permiso pueden ser lectura (r), escritura (w), ejecución (x) o usaremos un guión si en alguno de los campos no queremos dar permisos (-). Se siguen las mismas reglas que cuando se aplican permisos con chmod.

Revision de las ACL aplicadas

Para ver las ACLs que se han aplicado a un fichero o directorio usaremos el comango getfacl.
Vamos a ver la salida que produce y explicar como interpretarla, primero vamos a ver como se ven las ACLs en un fichero o directorio sin ninguna ACL aplicada:

ls -l |grep DirectorioNormal
drwxr-xr-x  2 root     root     4096 feb  5 21:41 DirectorioNormal

getfacl DirectorioNormal

# file: DirectorioNormal
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
ACLs en un directorio normal

Al usar getfacl, vemos que los permiso de user/group/other coinciden exactamente con los vemos al listar el fichero/directorio.
Ademas como datos extra nos muestra quien es el usuario propietario (owner) y a que grupo pertenece (group) el directorio/fichero.

Veamos ahora las ACLs del directorio que las tiene aplicadas:

ls -l |grep DirectorioConAcl
drwxrwxr-x+ 2 root     root     4096 feb  5 21:36 DirectorioConAcl

getfacl DirectorioConAcl

# file: DirectorioConAcl
# owner: root
# group: root
user::rwx
group::r-x
group:sistemas:rw-
mask::rwx
other::r-x

Lo primero que debemos ver es que al listar, aparecen permisos extendidos, se aprecia en el signo más (+) del directorio.
Al revisar las ACL con getfacl, vemos que aparece en la lista de grupos el grupo al que dimos acceso (sistemas) y los permisos aplicados (rw-).
Además nos aparece una nueva entrada: mask, esta entrada es especial y con ella se pueden manipular el máximo de permisos que se asignarán en esa ruta, por ejemplo podemos forzar a que ningún fichero en ella tenga permisos de ejecución.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux