Linux ACL tutorial, trabajo con Access Control List

El trabajo con ACL (Access Control List), es útil cuando se quiere dar permisos o revocar a un usuario o grupo determinado sobre directorios y objetos. A mi personalmente no me gusta demasiado, queda todo demasiado «oculto» y caprichoso para mi gusto. Aunque hay que reconocer que en determinadas situaciones puede ser la mejor solución.

Un requisito para poder trabajar con ACL es tener montado el volumen con la opción adecuada. Esto es posible hacerlo sin desmontar ni reiniciar con el comando:

Source   
mount -o remount -o acl /dev/mapper/vg_tester1-lv_root /

Esta instrucción realiza un remount de / añadiendo la opción «acl».

El trabajo con ACL se realiza con 2 comandos:

getfacl [-aceEsRLPtpndvh] file …
Un ejemplo de llamada puede ser:
getfacl *

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file …
Las opciones que yo uso son:

  • -m, modificar un acl_spec
  • -x, eliminar un acl_spec
  • -b, eliminar todas las entradas ACL
  • -R, recursivo.

Siendo un acl_spec:

  • u:nombre_usuario:rwx, especificación de usuario.
  • g:nombre_grupo:rwx, especificación de grupo
  • o:rwx, otros usuarios.
  • m:rwx, máscara aplicada.

Algunos ejemplos de llamada son:

Source   
setfacl -m u:prueba:rwx /home/prueba/tmp
setfacl -m g:www_data:rwx /home/prueba/tmp
setfacl -x u:prueba /home/prueba/tmp
setfacl -b /home/prueba/tmp
setfacl -R -b /home/prueba

Muy recomendable ver las páginas man.

Supongamos un estado inicial:

Source   
[root@tester1 prueba]# pwd
/root/prueba
[root@tester1 prueba]# ls -l
total 40
-rw-r-xr--. 1 root root 18752 mar 7 09:44 fich2.txt
-rw-r-xr--. 1 root root 18752 mar 6 16:52 fich.txt
[root@tester1 prueba]# getfacl *
# file: fich2.txt
# owner: root
# group: root
user::rw-
group::r-x
other::r--
# file: fich.txt
# owner: root
# group: root
user::rw-
group::r-x
other::r--

En el directorio /root/prueba existen 2 ficheros sin ningún tipo de ACL definido. Es una ubicación de uso exclusivo para el usuario root, pero supongamos que queremos darle acceso de rw al fichero /root/prueba/fich.txt a un usuario «prueba».

Es necesario permitir el acceso a /root a /root/prueba y por último a /root/prueba/fich.txt, esto se puede hacer con los comandos:

Source   
setfacl -m u:prueba:--x /root
setfacl -m u:prueba:--x /root/prueba
setfacl -m u:prueba:wr- /root/prueba/fich.txt

Cuando existe cualquier definición ACL, un ls -l muestra un +:

Source   
[root@tester1 prueba]# pwd
/root/prueba
[root@tester1 prueba]# ls -l
total 44
-rw-r-xr--. 1 root root 18752 mar 7 09:44 fich2.txt
-rw-rwxr--+ 1 root root 18752 mar 6 16:52 fich.txt
[root@tester1 prueba]# getfacl *
# file: fich2.txt
# owner: root
# group: root
user::rw-
group::r-x
other::r--
# file: fich.txt
# owner: root
# group: root
user::rw-
user:prueba:rw-
group::r-x
mask::rwx
other::r--

Ahora el usuario prueba puede acceder al fichero pero no listar los contenidos de los directorios intermedios:

Source   
[prueba@tester1 ~]$ ls /root
ls: cannot open directory /root: Permission denied
[prueba@tester1 ~]$ ls /root/prueba/
ls: cannot open directory /root/prueba/: Permission denied
[prueba@tester1 ~]$ ls -l /root/prueba/fich.txt
-rw-rwxr--+ 1 root root 18752 Mar 6 16:52 /root/prueba/fich.txt
[prueba@tester1 ~]$ tail /root/prueba/fich.txt
asdas
hola
ihola
dasd
fsadfsdf
sdfa
sf
[prueba@tester1 ~]$ echo "AGREGADO" >> /root/prueba/fich.txt
[prueba@tester1 ~]$ tail /root/prueba/fich.txt
hola
ihola
dasd
fsadfsdf
sdfa
sf
AGREGADO

Esto mismo se podría haber hecho con un grupo.

Para eliminar cualquier rastro:

Source   
setfacl -b /root
setfacl -R -b /root/prueba

También es posible denegar cualquier acceso de forma explicita con:

Source   
setfacl -m u:prueba:--- /tmp

Además permite el trabajo con máscaras:

Source   
[root@tester1 prueba]# setfacl -m u:prueba:r-x fich.txt
[root@tester1 prueba]# setfacl -m m:rw- fich.txt
[root@tester1 prueba]# getfacl *
# file: fich2.txt
# owner: root
# group: root
user::rw-
group::r-x
other::r--
# file: fich.txt
# owner: root
# group: root
user::rw-
user:prueba:r-x #effective:r--
group::r-x #effective:r--
mask::rw-
other::r--

Se observa que el permiso efectivo es r en lugar de r-x, esto es así porque se ha aplicado la máscara rw-.

4 thoughts on “Linux ACL tutorial, trabajo con Access Control List

  1. Hola de nuevo, para que funcione en Solaris, hay que agregar al comando setfacl la opción -r, porque si no no reescribe la máscara:
    setfacl -r -m u:prueba:–x /root
    setfacl -r -m u:prueba:–x /root/prueba
    setfacl -r -m u:prueba:wr- /root/prueba/fich.txt
    Ahora sip 😉

  2. Pingback: Securizar aplicación PHP | Administrando Sistemas

Deja un comentario