12 febrero, 2020

Hardening Linux: Listas de control de acceso en directorios o ficheros [setfacl y getfacl]

Las ACL en Linux son, como en cualquier otro sistema operativo, listas de control de acceso (Access Control List) que nos permiten especificar que usuarios, grupos o procesos del sistema se les otorga unos permisos específicos a los objetos, como pueden ser directorios o ficheros del sistema.

Por defecto en los sistemas de ficheros ext* las ACL ya se encuentran habilitadas. Existen dos comandos para su gestión:
  • getfacl: Muestra información de los permisos de ficheros y carpetas.
  • setfacl: Establece o modifica las ACL de dichos ficheros y carpetas.
Para conocer el detalle de los argumentos disponibles tanto en getfacl como setfacl podemos consultar su ayuda con man.

Para entender mejor su funcionamiento pondré un escenario muy sencillo como ejemplo.

Escenario

Estructura de directorios:
├── Común
├── Pepe
└── Juan 
Con los siguientes usuarios y grupos:

- Usuarios: Pepe, Juan
- Grupo: Compartido
# tail -n 2 /etc/passwd
Pepe:x:1003:1003::/home/Pepe:/bin/bash
Juan:x:1004:1004::/home/Juan:/bin/bash
Maria:x:1005:1005::/home/Maria:/bin/bash
# tail -n 3 /etc/group
Compartido:x:1000:Pepe,Juan
Pepe:x:1003:
Juan:x:1004:
Maria:x:1004:


¿Qué tipo de permisos se deberían aplicar en este escenario?

1. Cada usuario puede acceder su carpeta con permisos de lectura, escritura y ejecución. 
2. Pepe no tendrá ningún tipo de permisos en la carpeta de Juan. Sin embargo, Juan solo tendrá acceso de lectura sobre la carpeta de Pepe. 
3. Todos los usuarios pertenecen al grupo llamado "Compartido", este grupo tendrá acceso total al directorio "Común".
4. Cualquier otro usuario creado en el sistema (Maria) no podrá acceder a ningún recurso. Excepto el usuario root, que si tendrá acceso total para poder modificar permisos y administración de los recursos.

Establecemos los permisos basados en ACLs

# ls -lh
total 12K
drwxr-xr-x 2 root root 4.0K Feb 12 17:53 Común
drwxr-xr-x 2 root root 4.0K Feb 12 17:53 Juan
drwxr-xr-x 2 root root 4.0K Feb 11 23:13 Pepe 
# setfacl -m o::--- Común/ ; setfacl -m o::--- Pepe/ ; setfacl -m o::--- Juan/
# setfacl -m g:Compartido:rwx Común/
# setfacl -m u:Juan:rwx Juan/ ; setfacl -m u:Pepe:--- Juan/
# setfacl -m u:Pepe:rwx Pepe/ ; setfacl -m u:Juan:r-- Pepe/ 

Después de establecer las ACLs podemos apreciar que al listar los directorios en formato lista se añade un nuevo signo "+" en los permisos de Unix, esto nos indica que ese directorio o fichero tiene más información sobre permisos y que podemos ver con getfacl.
# ls -lh
total 12K
drwxr-xr-x+ 2 root root 4.0K Feb 12 17:53 Común
drwxr-xr-x+ 2 root root 4.0K Feb 12 17:53 Juan
drwxr-xr-x+ 2 root root 4.0K Feb 11 23:13 Pepe  
# getfacl *
# file: Común
# owner: root
# group: root
user::rwx
group::---
group:Compartido:rwx
mask::rwx
other::---
# file: Juan
# owner: root
# group: root
user::rwx
user:Pepe:---
user:Juan:rwx
group::---
mask::rwx
other::---
# file: Pepe
# owner: root
# group: root
user::rwx
user:Pepe:rwx
user:Juan:r--
group::---
mask::rwx
other::---


Comprobamos que las reglas se establecieron correctamente

Usuario Pepe
root@rpi:~# su - Pepe
Pepe@rpi:~$ cd /Recursos/

Pepe@rpi:/Recursos$ touch Pepe/test-pepe
Pepe@rpi:/Recursos$ touch Juan/test-pepe
touch: cannot touch 'Juan/test-pepe': Permission denied
Pepe@rpi:/Recursos$ ls Juan/
ls: cannot open directory 'Juan/': Permission denied
Pepe@rpi:/Recursos$ touch Común/test-pepe

Pepe@rpi:/Recursos$ tree -pugh
.
├── [drwxrwx--- root     root     4.0K]  Común
│   └── [-rw-rw-r-- Pepe     Pepe        0]  test-pepe
├── [drwxrwx--- root     root     4.0K]  Juan [error opening dir]
└── [drwxrwx--- root     root     4.0K]  Pepe
    └── [-rw-rw-r-- Pepe     Pepe        0]  test-pepe
3 directories, 2 files

Usuario Juan
root@rpi:~# su - Juan
Juan@rpi:~$ cd /Recursos/

Juan@rpi:/Recursos$ touch Juan/test-juan
Juan@rpi:/Recursos$ touch Pepe/test-juan
touch: cannot touch 'Pepe/test-juan': Permission denied
Juan@rpi:/Recursos$ ls Pepe/
ls: cannot access 'Pepe/test-pepe': Permission denied
test-pepe
Juan@rpi:/Recursos$ touch Común/test-juan

Juan@rpi:/Recursos$ tree -pugh
.
├── [drwxrwx--- root     root     4.0K]  Común
│   ├── [-rw-rw-r-- Juan     Juan        0]  test-juan
│   └── [-rw-rw-r-- Pepe     Pepe        0]  test-pepe
├── [drwxrwx--- root     root     4.0K]  Juan
│   └── [-rw-rw-r-- Juan     Juan        0]  test-juan
└── [drwxrwx--- root     root     4.0K]  Pepe  [error opening dir]
3 directories, 3 files

Usuaria Maria
root@rpi:~# su - Maria
Maria@rpi:~$ cd /Recursos/

Maria@rpi:/Recursos$ touch Común/test-maria
touch: cannot touch 'Común/test-maria': Permission denied
Maria@rpi:/Recursos$ touch Pepe/test-maria
touch: cannot touch 'Pepe/test-maria': Permission denied
Maria@rpi:/Recursos$ touch Juan/test-maria
touch: cannot touch 'Juan/test-maria': Permission denied
Maria@rpi:/Recursos$ ls Común/ ; ls Pepe/ ; ls Juan/
ls: cannot open directory 'Común/': Permission denied
ls: cannot open directory 'Pepe/': Permission denied
ls: cannot open directory 'Juan/': Permission denied

Maria@rpi:/Recursos$ tree -pugh
.
├── [drwxrwx--- root     root     4.0K]  Común [error opening dir]
├── [drwxrwx--- root     root     4.0K]  Juan [error opening dir]
└── [drwxrwx--- root     root     4.0K]  Pepe [error opening dir]
3 directories, 0 files


Backups de las ACLs de directorios o ficheros

Algo interesante es que podemos realizar backups y restauraciones de los permisos ACLs. Siguiedo el escenario anterior.

Para realizar exportar las ACLs del directorio de Juan, usamos el argumento -R.
getfacl -R Juan/ > backup-acl-Juan.txt
Para realizar una restauración de las ACLs del directorio de Juan, usamos el argumento --restore=directorio/fichero.
setfacl --restore=backup-acl-Juan.txt
Esto solamente es un ejemplo muy básico con la idea de mostrar su uso. Lo ideal es aplicarlo en aquellos directorios/ficheros que sabemos que solo deberían acceder determinados usuarios, con el fin de ir fortificando y endureciendo la seguridad en los sistemas de ficheros de nuestros entornos Linux.

Saludos!

No hay comentarios:

Publicar un comentario