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:
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:
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:
[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:
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 +:
[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:
[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:
setfacl -b /root
setfacl -R -b /root/prueba
También es posible denegar cualquier acceso de forma explicita con:
setfacl -m u:prueba:--- /tmp
Además permite el trabajo con máscaras:
[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-.
Buen ejemplo y bien explicado 😉
Thanks!
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 😉
Una buena aportación
Pingback: Securizar aplicación PHP | Administrando Sistemas