Las listas de control de acceso (Access Control Lists - ACLs) proveen un mecanismo para especificar permisos en archivos y otros objetos de forma mucho más flexible que el sistema estándar Unix de usuario/grupo/otros. En GNU/Linux es posible lograr el mismo esquema de autorización (para especificar permisos en archivos y directorios) que utiliza el sistema de archivos NTFS mediante ACLs.

Las ACLs se almacenan en el mismo sistema de archivos, por ello existen parches disponibles para los sistemas de archivos ext2 y ext3 que habilitan el soporte para ACLs mediante atributos extendidos (EAs).

Los requisitos para utilizar ACLs son:

  • Kernel Linux versión 2.4 o 2.6 parchado
  • Instalar las utilidades de ACL

Para ejemplificar la instalación y puesta en funcionamiento de ACLs en GNU/Linux se utiliza el sistema operativo Debian 6:

# uname -a
Linux wst 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux
# cat /etc/debian_version
6.0.5

Primero se debe determinar si el kernel soporta ACLs, para ello es posible revisar los logs y verificar que las variables CONFIG_EXT2_FS_POSIX_ACL, CONFIG_EXT3_FS_POSIX_ACL, CONFIG_EXT4_FS_POSIX_ACL estén configuradas en 'y':

# cat /boot/config-2.6.32-5-amd64 | grep _ACL
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_OCFS2_FS_POSIX_ACL=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_GENERIC_ACL=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_JFFS2_FS_POSIX_ACL=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFS_ACL_SUPPORT=m

Si el kernel soporta ACLs simplemente se debe instalar el paquete acl, el cual provee las herramientas para modificar y listar ACLs en archivos y directorios:

# apt-cache search setfacl
acl - Access control list utilities
# apt-get install acl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  acl
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 65.9 kB of archives.
After this operation, 303 kB of additional disk space will be used.
Get:1 http://ftp.ccc.uba.ar/pub/linux/debian/debian/ squeeze/main acl amd64 2.2.49-4 [65.9 kB]
Fetched 65.9 kB in 1s (45.7 kB/s)
Selecting previously deselected package acl.
(Reading database ... 28753 files and directories currently installed.)
Unpacking acl (from .../acl_2.2.49-4_amd64.deb) ...
Processing triggers for man-db ...
Setting up acl (2.2.49-4) ...

Luego se debe activar el soporte para ACLs en las particiones deseadas. Para ello es necesario agregar la opción "acl" en la línea de configuración correspondiente en el archivo /etc/fstab. Por ejemplo para activar el soporte de ACLs para la partición raíz (/):

# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# / was on /dev/sda2 during installation
UUID=4c6854ec-34b0-4bd4-ad8f-ac69fcee205f /               ext4    acl,errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=808c7a4a-95f9-47d3-99c8-4da76c58e2e2 /boot           ext3    defaults        0       2
# swap was on /dev/sda3 during installation
UUID=b1c5da4f-2518-4139-8e77-7eb561941db3 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

Reiniciar el sistema para montar el sistema de archivos raíz nuevamente. Si se trata de otra partición es posible re-montarla con el sistema en funcionamiento (sin reiniciar) utilizando la instrucción "mount -o remount,acl /dev/xdx".

# reboot

Una vez que el sistema ha iniciado nuevamente, se puede verificar que la partición ha sido montada con soporte para ACLs:

# mount
/dev/sda2 on / type ext4 (rw,acl,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)

Finalmente un ejemplo del uso de ACLs en el sistema de archivos, en este caso se trata de otorgar permisos de lectura y ejecución al grupo "www-data" (Apache). Para listar la ACL de un objeto se utiliza la herramienta "getfacl". Por defecto, los únicos valores en la ACL de un archivo son los permisos del sistema de archivos Unix (usuario/grupo/otros):

# getfacl /var/www/
getfacl: Removing leading '/' from absolute path names
# file: var/www/                                      
# owner: root                                         
# group: root                                         
user::rwx                                             
group::rwx                                            
other::---                                           

Estos valores por defecto en la ACL se actualizan automáticamente cada vez que se modifican los permisos en el sistema de archivos.

Para modificar la ACL de un objeto se debe utilizar la herramienta "setfacl". Por ejemplo para dar lectura y ejecución al grupo "www-data":

# setfacl -R -m group:www-data:r-x /var/www/

La opción "-R" indica que se aplique recursivamente. La opción "-m" indica que se está modificando la ACL. Luego se indican los permisos utilizando la sintaxis "group:[GRUPO]:[PERMISOS]". Finalmente se indica el target.

Una vez modificada la ACL se verifica con "getfacl":

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

Si se listan los permisos del sistema de archivo se observa que el objeto posee un símbolo '+' al final, esto indica que el objeto posee una ACL personalizada, es decir posee permisos extendidos más allá de los permisos del sistema de archivos:

# ls -l /var
total 48
drwxr-xr-x 2 root root 4096 Aug 8 06:25 backups
drwxr-xr-x 10 root root 4096 Aug 7 11:41 cache
drwxr-xr-x 31 root root 4096 Aug 7 11:41 lib
drwxrwsr-x 3 root staff 4096 Aug 8 09:14 local
drwxrwxrwt 3 root root 4096 Aug 8 08:51 lock
drwxr-xr-x 10 root root 4096 Aug 8 08:51 log
drwxrwsr-x 2 root mail 4096 Aug 8 10:51 mail
drwxr-xr-x 2 root root 4096 Aug 7 11:23 opt
drwxr-xr-x 8 root root 4096 Aug 8 11:21 run
drwxr-xr-x 5 root root 4096 Aug 7 11:41 spool
drwxrwxrwt 2 root root 4096 Aug 8 09:56 tmp
drwxrwx---+ 3 root root 4096 Aug 8 08:21 www

De esta forma es posible lograr en GNU/Linux un sistema de archivos como el de los sistemas operativos Windows (a partir de NT con sistema de archivos NTFS) que utilice ACLs para manejar los permisos de forma granular. Esta granularidad permite restringir más los permisos y lograr mínimo privilegio en los accesos, lo cual es una gran mejora respecto a seguridad.


Tal vez pueda interesarte


Compartí este artículo