Archivos/Directorios seguros utilizando ACLs (Listas de Control de Acceso) en Linux

Como Administrador del Sistema, nuestra primera prioridad será proteger y asegurar los datos contra accesos no autorizados. Todos somos conscientes de los permisos que establecemos utilizando algunos comandos útiles de Linux como chmod, chown, chgrp… etc. Sin embargo, estos conjuntos de permisos predeterminados tienen ciertas limitaciones y a veces pueden no funcionar según nuestras necesidades. Por ejemplo, no podemos establecer diferentes conjuntos de permisos para diferentes usuarios en el mismo directorio o archivo. Por lo tanto, se implementaron las Listas de Control de Acceso (ACLs).

Linux Access Control Lists

Supongamos que tienes tres usuarios, ‘tecmint1’, ‘tecmint2’ y ‘tecmint3’. Cada uno perteneciendo a un grupo común llamado ‘acl’. El usuario ‘tecmint1’ quiere que solo el usuario ‘tecmint2’ pueda leer y acceder a los archivos propiedad de ‘tecmint1’ y que nadie más tenga acceso a ellos.

Las ACL (Listas de Control de Acceso) nos permiten hacer esta función. Estas ACL nos permiten otorgar permisos a un usuario, grupo y a cualquier grupo de usuarios que no estén en la lista de grupos de un usuario.

Nota: Según la Documentación del Producto Redhat, proporciona soporte ACL para el sistema de archivos ext3 y los sistemas de archivos exportados por NFS.

Cómo verificar el soporte de ACL en los sistemas Linux

Antes de continuar, debes verificar si el Kernel actual y los sistemas de archivos montados tienen soporte para ACL.

1. Verificar el Soporte de ACL en el Kernel

Ejecute el siguiente comando para verificar el soporte de ACL para el sistema de archivos y la opción POSIX_ACL=Y (si en lugar de N hay Y, entonces significa que el kernel no admite ACL y necesita ser recompilado).

[root@linux ~]# grep -i acl /boot/config*

CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_CIFS_ACL=y
CONFIG_9P_FS_POSIX_ACL=y

2. Verificar los paquetes necesarios

Antes de comenzar a usar los ACL, asegúrese de tener instalados los paquetes necesarios. A continuación se detallan los paquetes necesarios que deben instalarse usando yum o apt-get.

[root@linux ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[tecmint@linux ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

3. Verificar el soporte de ACLs en el sistema de archivos montado

Ahora, verifique si el sistema de archivos montado lo está con la opción de ACL o no. Podemos usar el comando ‘mount’ para verificar lo mismo como se muestra a continuación.

[root@linux ~]# mount  | grep -i root

/dev/mapper/fedora-root on / type ext4 (rw,relatime,data=ordered)

Pero en nuestro caso no está mostrando acl de forma predeterminada. Así que, a continuación, tenemos la opción de volver a montar la partición montada nuevamente usando la opción acl. Sin embargo, antes de continuar, tenemos otra opción para asegurarnos de que la partición esté montada con la opción acl o no, porque para los sistemas recientes puede estar integrada con la opción de montaje predeterminada.

[root@linux ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

En la salida anterior, puede ver que la opción de montaje predeterminada ya tiene soporte para acl. Otra opción es volver a montar la partición como se muestra a continuación.

[root@linux ~]# mount -o remount,acl /

A continuación, agregue la siguiente entrada al archivo ‘/etc/fstab’ para que sea permanente.

/dev/mapper/fedora-root /	ext4    defaults,acl 1 1

Nuevamente, vuelva a montar la partición.

[root@linux ~]# mount -o remount  /

4. Para el servidor NFS

En el servidor NFS, si el sistema de archivos que es exportado por el servidor NSF admite ACL y los ACL pueden ser leídos por los clientes NFS, entonces los ACLs son utilizados por el sistema cliente.

Para deshabilitar los ACL en la parte compartida de NFS, debes añadir la opción “no_acl” en el archivo ‘/etc/exportfs‘ en el Servidor NFS. Para deshabilitarlo en el lado del cliente de NSF, nuevamente utiliza la opción “no_acl” durante el montaje.

Cómo implementar el soporte de ACL en sistemas Linux

Hay dos tipos de ACLs:

  1. ACL de Acceso: Se utilizan para otorgar permisos en archivos o directorios.
  2. ACLs Predeterminados: Se utilizan para establecer/listar la lista de control de acceso en un directorio específico solamente.

Diferencia entre ACL de Acceso y ACL Predeterminados:

  1. Los ACLs predeterminados solo se pueden utilizar a nivel de directorio.
  2. Cualquier subdirectorio o archivo creado dentro de ese directorio heredará los ACL de su directorio padre. Por otro lado, un archivo hereda los ACL predeterminados como sus ACL de acceso.
  3. Utilizamos “-d” para establecer ACLs predeterminados y los ACL Predeterminados son opcionales.
Antes de establecer los ACLs predeterminados

Para determinar los ACLs predeterminados de un archivo o directorio específico, utiliza el comando ‘getfacl‘. En el ejemplo a continuación, el comando getfacl se utiliza para obtener los ACLs predeterminados de una carpeta ‘Música‘.

[root@linux ~]# getfacl Music/

# file: Music/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::rw-
Después de establecer los ACLs predeterminados

Para establecer los ACLs predeterminados de un archivo o directorio específico, utiliza el comando ‘setfacl‘. En el ejemplo a continuación, el comando setfacl establecerá nuevos ACLs (lectura y ejecución) en una carpeta ‘Música’.

[root@linux ~]# setfacl -m d:o:rx Music/
[root@linux ~]# getfacl Music/
# file: Music/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:other::r-x

Cómo establecer nuevos ACLs

Utilice el comando ‘setfacl’ para establecer o modificar en cualquier archivo o directorio. Por ejemplo, para otorgar permisos de lectura y escritura al usuario ‘tecmint1‘.

# setfacl -m u:tecmint1:rw /tecmint1/example

Cómo ver ACLs

Utilice el comando ‘getfacl‘ para ver la ACL en cualquier archivo o directorio. Por ejemplo, para ver la ACL en ‘/tecmint1/ejemplo‘ use el siguiente comando.

# getfacl /tecmint1/example

# file: tecmint1/example/
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

Cómo eliminar ACLs

Para eliminar ACL de cualquier archivo/directorio, utilizamos las opciones x y b como se muestra a continuación.

# setfacl -x ACL file/directory  	# remove only specified ACL from file/directory.

# setfacl -b  file/directory   		#removing all ACL from file/direcoty

Implementemos los ACLs en los siguientes escenarios.

Dos usuarios (tecmint1 y tecmint2), ambos con un grupo secundario común llamado ‘acl‘. Crearemos un directorio propiedad de ‘tecmint1‘ y daremos permisos de lectura y ejecución en ese directorio al usuario ‘tecmint2‘.

Paso 1: Crear dos usuarios y eliminar la contraseña de ambos

[root@linux ~]# for user in tecmint1 tecmint2

> do
> useradd $user
> passwd -d $user
> done
Removing password for user tecmint1.
passwd: Success
Removing password for user tecmint2.
passwd: Success

Paso 2: Crear un grupo y Usuarios al Grupo Secundario.

[root@linux ~]# groupadd acl
[root@linux ~]# usermod -G acl tecmint1
[root@linux ~]# usermod -G acl tecmint2

Paso 3: Crear un directorio /tecmint y cambiar la propiedad a tecmint1.

[root@linux ~]# mkdir /tecmint1
[root@linux ~]# chown tecmint1 /tecmint1/
[root@linux ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[root@linux ~]# getfacl /tecmint1

getfacl: Removing leading '/' from absolute path names
# file: tecmint1
# owner: tecmint1
# group: root
user::rwx
group::r-x
other::r-x

Paso 4: Iniciar sesión con tecmint1 y crear un directorio en la carpeta /tecmint.

[tecmint@linux ~]$ su - tecmint1

Last login: Thu Apr 17 14:49:16 IST 2014 on pts/4
[tecmint1@linux ~]$ cd /tecmint1/
[tecmint1@linux tecmint1]$ mkdir example
[tecmint1@linux tecmint1]$ ll

total 4
drwxrwxr-x 2 tecmint1 tecmint1 4096 Apr 17 14:50 example
[tecmint1@linux tecmint1]$ whoami 
tecmint1

Paso 5: Ahora establece ACL usando ‘setfacl‘, para que ‘tecmint1‘ tenga todos los permisos rwx, ‘tecmint2‘ tenga solo permiso de lectura en la carpeta ‘ejemplo‘ y los otros no tengan permisos.

$ setfacl -m u:tecmint1:rwx example/
$ setfacl -m u:tecmint2:r-- example/
$ setfacl -m  other:--- example/
$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::r-x
mask::rwx
other::---

Paso 6: Ahora inicia sesión con otro usuario, es decir, ‘tecmint2‘ en otra terminal y cambia al directorio ‘/tecmint1‘. Intenta ver los contenidos usando el comando ‘ls‘ y luego intenta cambiar de directorio y observa la diferencia como se muestra a continuación.

[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:03:31 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ ls -lR example/
example/:
total 0
[tecmint2@linux tecmint1]$ cd example/

-bash: cd: example/: Permission denied
[tecmint2@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r--
group::rwx
mask::rwx
other::---

Paso 7: Ahora otorga permiso de ‘ejecución a ‘tecmint2‘ en la carpeta ‘ejemplo‘ y luego utiliza el comando ‘cd‘ para ver el efecto. Ahora ‘tecmint2‘ tiene permisos para ver y cambiar de directorio, pero no tiene permisos para escribir nada.

[tecmint1@linux tecmint1]$ setfacl -m u:tecmint2:r-x example/
[tecmint1@linux tecmint1]$ getfacl example/

# file: example
# owner: tecmint1
# group: tecmint1
user::rwx
user:tecmint1:rwx
user:tecmint2:r-x
group::rwx
mask::rwx
other::---
[tecmint@linux ~]$ su - tecmint2

Last login: Thu Apr 17 15:09:49 IST 2014 on pts/5
[tecmint2@linux ~]$ cd /tecmint1/
[tecmint2@linux tecmint1]$ cd example/
[tecmint2@linux example]$ getfacl .
[tecmint2@linux example]$ mkdir test

mkdir: cannot create directory ‘test’: Permission denied
[tecmint2@linux example]$ touch test

touch: cannot touch ‘test’: Permission denied

Nota: Después de implementar ACL, verás un signo ‘+‘ adicional en la salida de ‘ls –l’ como se muestra a continuación.

[root@linux tecmint1]# ll

total 4
drwxrwx---+ 2 tecmint1 tecmint1 4096 Apr 17 17:01 example

Enlaces de referencia

Documentación de ACL

Source:
https://www.tecmint.com/secure-files-using-acls-in-linux/