Listas de Control de Acceso ACL en Linux

Hoy le toca el turno a las Listas de Control de Acceso o ACL, en sistemas GNU/Linux. Simplificando se trata de una lista de permisos adjuntos a un objeto. No es la primera vez que hablamos de las ACL en la web, ya que hablamos de ellas en su combinación con el servicio SAMBA

¿Qué son las ACL?

Una ACL especifica a qué usuarios o procesos del sistema se les otorga acceso a los objetos, así como qué operaciones se les permiten a los objetos dados. Cada entrada  especifica un tema y una operación.

Por ejemplo, si un objeto de fichero, tiene una ACL que contiene (David: leer,escribir;Angela:leer), esto le daría permiso a David para leer y modificar el archivo, en cambio Angela solo podría leerlo.

¿Cómo funcionan?

Primero de todo hay que tener en cuenta que el sistema de archivos debe de tener habilitado las ACL. Para ello se debe especificar cuando se montan, bien de manera provisional o de manera permanente en el fichero /etc/fstab

Para comprobar que la opción “acl” está habilitado en las particiones montadas, podemos realizar la siguiente comprobación:

  1. tune2fs -l /dev/sda1 | grep “Default mount options:”

Como en el ejemplo:

  1. [root@servcentos01]# tune2fs -l /dev/sda1 | grep "Default mount options:"
  2. Default mount options:    user_xattr acl

Los sistemas de ficheros como Btrfs y ext* ya vienen con las ACL habilitadas por defecto.

Trabajando con ACL

Para trabajar con las Listas de Control de Acceso tenemos disponibles dos herramientas fundamentales, que son:

  • getfacl: Muestra información de los permisos de ficheros y carpetas
  • setfacl: Modifica las ACL de dichos ficheros y carpetas

Para agregar permisos a un usuario

  1. #setfacl -m “u:usuario:permisos” fichero o directorio

Si queremos agregar permisos a un grupo:

  1. #setfacl -m “g:grupo:permisos” fichero o directorio

Permitir que todos los archivos o directorios hereden las entradas de ACL desde un directorio con:

  1. #setfacl -dm “entrada” directorio

Eliminar una entrada específica:

  1. #setfacl -x “entrada” fichero o directorio

Borrar todas las entradas:

  1. #setfacl -b fichero o directorio

Para mostrar los permisos:

  1. #getfacl nombre de fichero o directorio

Setfacl: Principales usos

Veamos un resumen de los principales parámetros que podemos utilizar con la herramienta «setfacl»

  • Modificar ACL de un archivo para el usuario con acceso de lectura y escritura:
    1. setfacl -m u:username:rw file
  • Modificar la ACL predeterminada de un archivo para todos los usuarios:
    1. setfacl -d -m u::rw file
  • Eliminar la reglas de un archivo para un usuario:
    1. setfacl -x u:username file
  • Eliminar todas las entradas de un archivo:
    1. setfacl -b file

Este resumen lo podéis obtener con la herramienta TLDR, de la que ya hablamos:

  1. tldr setfacl

Laboratorio de pruebas

Tomemos el siguiente arbol de directorios para la empresa ficticia LibreCorp:

  1. .
  2. ├── Compras
  3. ├── Contabilidad
  4. │   ├── Albaranes
  5. │   ├── Balances
  6. │   ├── Facturas
  7. │   └── LibroCuentas
  8. ├── IT
  9. │   ├── Inventario
  10. │   └── Software
  11. ├── Marketing
  12. │   └── Campañas
  13. └── Ventas
  14.     └── Comerciales

Existe un grupo creado llamado «librecorp», con tres usuarios «david», «Fernando» y «María»

Listar permisos ACL con getfacl

Si utilizamos «getfacl» vemos los permisos que tienen asignadas las diferentes carpetas:

  1. # file: Compras
  2. # file: Compras
  3. # owner: root
  4. # group: librecorp
  5. user::rwx
  6. user:Fernando:r-x
  7. group::---
  8. group:librecorp:r-x
  9. mask::r-x
  10. other::---
  11. default:user::rwx
  12. default:group::---
  13. default:group:librecorp:r-x
  14. default:mask::r-x
  15. default:other::---
  16.  
  17. (...)
  18.  
  19. # file: IT
  20. # owner: root
  21. # group: librecorp
  22. user::rwx
  23. user:david:rwx
  24. user:Fernando:r-x
  25. group::---
  26. group:librecorp:r-x
  27. mask::rwx
  28. other::---
  29. default:user::rwx
  30. default:group::---
  31. default:group:librecorp:r-x
  32. default:mask::r-x
  33. default:other::---
  34.  
  35. # file: Marketing
  36. # owner: root
  37. # group: librecorp
  38. user::rwx
  39. user:Fernando:r-x
  40. user:Maria:rwx
  41. group::---
  42. group:librecorp:r-x
  43. mask::rwx
  44. other::---
  45. default:user::rwx
  46. default:group::---
  47. default:group:librecorp:r-x
  48. default:mask::r-x
  49. default:other::---
  50.  
  51. (...)

Observamos que los usuarios del grupo «librecorp» pueden acceder a los recursos en modo lectura. Además el usuario Fernando tiene los permisos de lectura declarados explicitamente. En el caso de David, tiene permisos de lectura, escritura y ejecución sobre IT En lo que respecta a Maria tiene todos los permisos sobre la carpeta Marketing.

Asignar permisos ACL a un nuevo usuario con setfacl

La empresa ha tenido una nueva incorporación en el departamento de Marketing, llamada Judith, creamos el usuario y le asignamos al grupo. Además le daremos permiso de escritura sobre la carpeta Marketing.

  1. useradd Jutidh
  2. passwd Jutidh
  3. usermod -aG librecorp Judith
  4. setfacl -Rm u:Judith:rwx /opt/LibreCorp/Marketing

Si listamos los permisos del recurso Marketing:

  1. [root@servcentos LibreCorp]# getfacl Marketing
  2. # file: Marketing
  3. # owner: root
  4. # group: librecorp
  5. user::rwx
  6. user:Fernando:r-x
  7. user:Maria:rwx
  8. user:Judith:rwx
  9. group::---
  10. group:librecorp:r-x
  11. mask::rwx
  12. other::--

A modo de ejemplo, utilizamos el usuario David para intentar escribir sobre los departamentos de Marketing y de IT:

  1. [david@servcentos LibreCorp]$ touch Marketing/prueba
  2. touch: cannot touch ‘Marketing/prueba’: Permission denied
  3. [david@servcentos LibreCorp]$ touch IT/prueba
  4. [david@servcentos LibreCorp]$ ls IT/prueba
  5. IT/prueba

Como David no tiene permisos sobre el recurso Marketing, el sistema le muestra un mensaje de «Acceso denegado», en cambio puede crear sin problemas el fichero «prueba» dentro de la carpeta de IT.

Eliminar permisos ACL

Nos comunican que María se marcha de la empresa, por lo que debemos eliminar los permisos que tiene actualmente sobre la carpeta de Marketing, para realizar este paso, usaremos la herramienta «setfacl», junto con el parémetro «-x«, que se utiliza para tal fin.

  1. setfacl -Rx Maria /opt/LibreCorp/Marketing

De esta manera ya no tendrá permisos de escritura en el recurso. Por último la eliminamos del grupo «librecorp», utilizando la herramienta «gpasswd»

  1. [david@servcentos opt]$ sudo gpasswd -d Maria librecorp
  2. Removing user Maria from group librecorp

Copias de seguridad de las ACL y como restaurarlas

Hay que tener en cuenta que las Listas de Control de Acceso irán variando con el tiempo, por lo que es recomendable realizar una copia de seguridad de estas. Para ello simplemente debemos utilizar la salida standard «stdout» sobre un fichero.

Como sigue:

  1. [david@servcentos ~]$ sudo getfacl -R LibreCorp > /home/david/backup-acl.txt

Utilizamos el parámetros «-R» para que nos guarde también los permisos de las subcarpetas y ficheros, de manera recursiva.

Si en algún momento queremos recuperar las ACL de la copia de seguridad utilizaremos la opción «–restore«, tal que así:

  1. setfacl --restore=/home/david/backup-acl.txt

Y esto es todo. Las listas de control de acceso tienen un sin fin de posibilidades. Os animo a jugar con ellas.

Espero que el artículo os haya parecido interesante.