Una lista de control de acceso o ACL (del inglés, access control list) es un concepto de seguridad informática usado para fomentar la separación de privilegios. Es una forma de determinar los permisos de acceso apropiados a un determinado objeto, dependiendo de ciertos aspectos del proceso que hace el pedido.
(Fuente wikipedia)
¿Para que las necesitamos?
En algunas ocasiones nos podemos plantear a la hora de dar permisos a grupos o archivos de como crear un grupo de grupos. Algo parecido como los grupos anidados de samba (nested groups). Por ejemplo, imaginemos esta situación:Profesores de primer grado: usuario1, usuario2, usuario3
Profesores de segundo grado: usuario4, usuario5
Alumnos: usuario6, usuario7, usuario8, usuario9
Dirección: usuario10
Es posible que queramos crear un grupo (por ejemplo que llamaremos Escuela) en el cual todos los otros grupos estén incluidos. Por ejemplo:
Profesores: @Profesores de primer grado, @Profesores de segundo grado
Escuela: @Profesores,@ Alumnos,@ Dirección
Esto por defecto no lo podríamos hacer con nuestro sistema de ficheros ext4 tal como viene por defecto.
Así pues, lo que querremos explicar en este artículo como extender los habituales controles de acceso a los ficheros mediante acl.
Instalación
Lo haremos o bien por el gestor de paquetes visual o por linea de comandos:apt-get install acl
Ahora tendremos que incluir una opción extra en el /etc/fstab para que cuando monte nuestro disco duro tenga en cuenta las acl:
por ejemplo:
UUID=2ed78188-b7b5-411f-887b /punto/montaje ext4 acl,errors=remount-ro 0 1
Remontamos el disco (por si no queremos reiniciar, que no es necesario)
sudo mount -o remount /punto/montaje
si queremos comprobar que lo hemos hecho correctamente:
mount | grep acl
/dev/sdb1 on /punto/montaje type ext4 (rw,acl,errors=remount-ro)
Planteando el problema
Pues bien, ahora ya tenemos nuestro sistema de archivos preparado para aplicar acl's en las carpetas y/o ficheros. Vemos algunos ejemplos de como conseguirlo:Imaginemos que tenemos la siguiente estructura de carpetas:
/home/Escuela
/home/Escuela/Profesores
/home/Escuela/Profesores/1er_Grado
/home/Escuela/Profesores/2nd_Grado
/home/Escuela/Alumnos
/home/Escuela/Dirección
Lo que queremos es que cada grupo de usuarios pueda leer/escribir únicamente en su carpeta y las carpetas superiores. Es decir, un profesor de 1er Grado deberia poder leer/escribir en
/home/Escuela/Profesores/1er_Grado
/home/Escuela/Profesores/
y
/home/Escuela
pero no debería poder acceder/escribir al resto de carpetas.
Para ello la estrategia será crear un grupo de usuarios para cada grupo final de nuestro árbol de usuarios. Es decir, crearemos estos grupos:
prof_1er (Profesores de primer grado)
prof_2nd (Profesores de segundo grado)
alumnos
direccion
¡Empecemos a dar accesos!
Creamos los usuarios (usuario1 ... usuario10):usuario1:x:1001:1001:,,,:/home/usuario1:/bin/bash
usuario2:x:1002:1002:,,,:/home/usuario2:/bin/bash
usuario3:x:1003:1003:,,,:/home/usuario3:/bin/bash
usuario4:x:1004:1004:,,,:/home/usuario4:/bin/bash
usuario5:x:1005:1005:,,,:/home/usuario5:/bin/bash
usuario6:x:1006:1006:,,,:/home/usuario6:/bin/bash
usuario7:x:1007:1007:,,,:/home/usuario7:/bin/bash
usuario8:x:1008:1008:,,,:/home/usuario8:/bin/bash
usuario9:x:1009:1009:,,,:/home/usuario9:/bin/bash
usuario10:x:1010:1010:,,,:/home/usuario10:/bin/bash
y metemos a cada usuario en su grupo:
prof_1er:x:1011:usuario1,usuario2,usuario3
prof_2nd:x:1012:usuario4,usuario5
alumnos:x:1013:usuario6,usuario7,usuario8,usuario9
direccion:x:1014:usuario10
Antes de nada vamos a ver como esta el directorio Escuela para familiarizarnos con las acl's:
getfacl Escuela/
# file: Escuela/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
He usado el comando getfacl (get file access control lists) para obtener la información de acceso.
Ahora para dar acceso usaremos el comando setfacl (set file access control lists).
Miremos como esta la carpeta 1er_Grado:
getfacl /con_acl/Escuela/Profesores/1er_Grado
# file: con_acl/Escuela/Profesores/1er_Grado/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
Ahora apliquemos opciones de rwx al grupo prof_1er y saquemos los privegios al resto y veamos como queda:
setfacl -m g:prof_1er:rwx /con_acl/Escuela/Profesores/1er_Grado/
setfacl -m o::--- /con_acl/Escuela/Profesores/1er_Grado/
getfacl /con_acl/Escuela/Profesores/1er_Gradogetf
# file: con_acl/Escuela/Profesores/1er_Grado/
# owner: root
# group: root
user::rwx
group::r-x
group:prof_1er:rwx
mask::rwx
other::---
Probemos a ver si un profesor de 2nd Grado puede acceder:
su usuario4
ls
1er_Grado 2nd_Grado
cd 1er_Grado/
bash: cd: 1er_Grado/: Permiso denegado
Como vemos, no podemos acceder a la carpeta, como esperábamos.
Ahora es ir asignado los permisos a los grupos en las carpetas según los comandos antes vistos para obtener un control mucho más flexible de accesos:
setfacl -R -m o::--- /con_acl/Escuela
setfacl -m g:prof_1er:rwx /con_acl/Escuela/Profesores/1er_Grado
setfacl -m g:prof_2nd:rwx /con_acl/Escuela/Profesores/2nd_Grado
setfacl -m g:prof_1er:rwx /con_acl/Escuela/Profesores
setfacl -m g:prof_2nd:rwx /con_acl/Escuela/Profesores
setfacl -m g:alumnos:rwx /con_acl/Escuela/Alumnos
setfacl -m g:direccion:rwx /con_acl/Escuela/Dirección
y finalmente:
setfacl -m g:prof_1er:rwx /con_acl/Escuela
setfacl -m g:prof_2nd:rwx /con_acl/Escuela
setfacl -m g:alumnos:rwx /con_acl/Escuela
setfacl -m g:direccion:rwx /con_acl/Escuela
Si ahora comprobamos los accesos de la raiz, veremos que diferentes grupos de usuarios tienen acceso:
getfacl Escuela
# file: Escuela
# owner: root
# group: root
user::rwx
group::r-x
group:prof_1er:rwx
group:prof_2nd:rwx
group:alumnos:rwx
group:direccion:rwx
mask::rwx
other::---
Con esto habríamos conseguido nuestro ejercicio inicial, dar a una carpeta acceso a diferentes grupos de usuarios.