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!

09 febrero, 2020

Active Directory: Auditar creación y cambios en cuentas de usuario (ID de eventos)

Para poder auditar la creación y cambios de cuentas de usuarios de Active Directory debemos establecer esta política a nivel de dominio en la plantilla "Default Domain Controllers Policy" situada en Objetos de directiva de grupo.

La editamos y configuramos:
Configuración del equipo > Directivas > Configuración de Windows > Configuración de seguridad > Directivas locales > Directiva de auditoría
Habilitamos "Auditar la administración de cuentas" en intentos "Correcto" y "Error".

Figura 1: Habilitar la auditoría de administración de cuentas en la plantilla "Default Domain Controllers Policy".

Si también queremos que se realice auditoría de la administración de cuentas locales en cualquier equipo unido al dominio, que no sean cuentas Active Directory. Debemos aplicar esta política a nivel de dominio dentro de la plantilla "Default Domain Policy".

Los ID de eventos que nos interesan para este caso son sobre la creación de nuevas cuentas de usuarios de Active Directory.
  • ID de evento 4720: Se creó una cuenta de usuario.
  • ID de evento 4722: Se habilitó una cuenta de usuario.
  • ID de evento 4724: Se intentó restablecer la contraseña de una cuenta.
  • ID de evento 4738: Se cambió una cuenta de usuario.
En el visor de eventos (eventvwr.msc) de un controlador de dominio, registros de Windows > Seguridad.

Creamos un filtro por los ID que nos interesen, separado por comas si queremos buscar más de un número de ID distinto.

En la siguiente captura se puede ver un ejemplo de un ID 4722, como se habilitó una nueva cuenta en Active Directory, más arriba tendríamos el ID 4720 donde se creó dicha cuenta.

Figura 2: Filtrar por ID de eventos para encontrar la creación de nuevas cuentas de usuario de Active Directory.

Saludos!
Entradas Relacionadas