Proteger archivos / directorios mediante ACL (listas de control de acceso) en Linux


Como administrador del sistema, nuestra primera prioridad será proteger y asegurar los datos del acceso no autorizado. Todos somos conscientes de los permisos que establecemos mediante algunos comandos útiles de Linux como chmod, chown, chgrp… etc. Sin embargo, estos conjuntos de permisos predeterminados tienen algunas limitaciones y, en ocasiones, pueden no funcionar según nuestras necesidades. Por ejemplo, no podemos configurar diferentes conjuntos de permisos para diferentes usuarios en el mismo directorio o archivo. Por lo tanto, se implementaron listas de control de acceso (ACL).

Digamos que tiene tres usuarios, "tecmint1", "tecmint2" y "tecmint3". Cada uno de los grupos en común dice "acl". El usuario "tecmint1" quiere que solo el usuario "tecmint2" pueda leer y acceder a los archivos propiedad de "tecmint1" y nadie más debería tener acceso a eso.

Las ACL (Access Control Lists) nos permiten hacer el mismo truco. Estas ACL nos permiten otorgar permisos para un usuario, grupo y cualquier grupo de cualquier usuario que no esté en la lista de grupos de un usuario.

Nota: Según la documentación del producto Redhat, proporciona compatibilidad con ACL para el sistema de archivos ext3 y los sistemas de archivos exportados a NFS.

Cómo comprobar la compatibilidad con ACL en sistemas Linux

Antes de seguir adelante, debe tener soporte para ACL en el Kernel actual y los sistemas de archivos montados.

Ejecute el siguiente comando para verificar la compatibilidad con ACL para el sistema de archivos y la opción POSIX_ACL u003d Y (si hay N en lugar de Y, significa que Kernel no admite ACL y debe recompilarse).

[[email protected] ~]# 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

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

[[email protected] ~]# yum install nfs4-acl-tools acl libacl		[on RedHat based systems]
[[email protected] ~]$ sudo apt-get install nfs4-acl-tools acl	[on Debian based systems]

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

[[email protected] ~]# mount  | grep -i root

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

Pero en nuestro caso no muestra acl de forma predeterminada. Entonces, a continuación, tenemos la opción de volver a montar la partición montada nuevamente usando la opción acl. Pero, antes de seguir adelante, 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.

[[email protected] ~]# tune2fs -l /dev/mapper/fedora-root | grep acl

Default mount options:    user_xattr acl

En el resultado 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.

[[email protected] ~]# mount -o remount,acl /

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

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

Nuevamente, vuelva a montar la partición.

[[email protected] ~]# mount -o remount  /

En el servidor NFS, si el sistema de archivos exportado por el servidor NSF admite ACL y los clientes NFS pueden leer las ACL, el sistema cliente utilizará las ACL.

Para deshabilitar las ACL en el recurso compartido NFS, debe agregar la opción "no_acl" en el archivo "/ etc/exportfs" en el servidor NFS. Para deshabilitarlo en el lado del cliente NSF nuevamente, use la opción "no_acl" durante el tiempo de montaje.

Cómo implementar el soporte de ACL en sistemas Linux

Hay dos tipos de ACL:

  1. Access ACLs: Access ACLs are used for granting permissions on any file or directory.
  2. Default ACLs: Default ACLs are used for granting/setting access control list on a specific directory only.

Diferencia entre Access ACL y Default ACL:

  1. Default ACL can be used on directory level only.
  2. Any sub directory or file created within that directory will inherit the ACLs from its parent directory. On the other hand a file inherits the default ACLs as its access ACLs.
  3. We make use of “–d” for setting default ACLs and Default ACLs are optionals.

Para determinar las ACL predeterminadas para un archivo o directorio específico, use el comando "getfacl". En el siguiente ejemplo, getfacl se usa para obtener las ACL predeterminadas para una carpeta "Música".

[[email protected] ~]# 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-

Para establecer las ACL predeterminadas para un archivo o directorio específico, use el comando "setfacl". En el ejemplo siguiente, el comando setfacl establecerá nuevas ACL (leer y ejecutar) en una carpeta "Música".

[[email protected] ~]# setfacl -m d:o:rx Music/
[[email protected] ~]# 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

Utilice el comando "setfacl" para configurar o modificar cualquier archivo o directorio. Por ejemplo, para otorgar permisos de lectura y escritura al usuario "tecmint1".

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

Utilice el comando "getfacl" para ver ACL en cualquier archivo o directorio. Por ejemplo, para ver ACL en ‘/ tecmint1/example‘ 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::---

Para eliminar ACL de cualquier archivo/directorio, usamos las opciones xyb 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 ACL 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 proporcionaremos el permiso de lectura y ejecución en ese directorio al usuario "tecmint2".

Paso 1: cree dos usuarios y elimine la contraseña de ambos

[[email protected] ~]# 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 los usuarios en el grupo secundario.

[[email protected] ~]# groupadd acl
[[email protected] ~]# usermod -G acl tecmint1
[[email protected] ~]# usermod -G acl tecmint2

Paso 3: Cree un directorio/tecmint y cambie la propiedad a tecmint1.

[[email protected] ~]# mkdir /tecmint1
[[email protected] ~]# chown tecmint1 /tecmint1/
[[email protected] ~]# ls -ld /tecmint1/

drwxr-xr-x 2 tecmint1 root 4096 Apr 17 14:46 /tecmint1/
[[email protected] ~]# 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: Inicie sesión con tecmint1 y cree un directorio en la carpeta/tecmint.

[[email protected] ~]$ su - tecmint1

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

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

Paso 5: Ahora configure ACL usando "setfacl", de modo que "tecmint1" tenga todos los permisos rwx, "tecmint2" solo tendrá permiso de lectura en la carpeta "ejemplo" y otros no tendrán 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 inicie sesión con otro usuario, es decir, "tecmint2" en otra terminal y cambie el directorio a "/ tecmint1". Ahora intente ver el contenido usando el comando "ls" y luego intente cambiar el directorio y vea la diferencia como se muestra a continuación.

[[email protected] ~]$ su - tecmint2

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

-bash: cd: example/: Permission denied
[[email protected] 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 otorgue permiso de "ejecución" a "tecmint2" en la carpeta "ejemplo" y luego use el comando "cd" para ver el efecto. Ahora "tecmint2" tiene los permisos para ver y cambiar el directorio, pero no tiene permisos para escribir nada.

[[email protected] tecmint1]$ setfacl -m u:tecmint2:r-x example/
[[email protected] tecmint1]$ getfacl example/

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

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

mkdir: cannot create directory ‘test’: Permission denied
[[email protected] example]$ touch test

touch: cannot touch ‘test’: Permission denied

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

[[email protected] tecmint1]# ll

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

Enlaces de referencia

Documentación de ACL