lunes, 27 de junio de 2011

Listas de Control de Acceso -(ACL)

Los permisos de linux están bien siempre que no dispongamos de un grupo muy grande de usuarios, si es así se haría muy lioso ya que tendríamos un /etc/group muy grande. Una forma elegante de arreglar este problema es usando las ACL (Listas de Control de Acceso).

A grosso modo una ACL es una lista de usuarios o grupos Linux y sus correspondientes permisos de acceso que tienen a un fichero o directorio.
Instalando y activando las ACL:

Para aumentar la granularidad de los permisos en tu sistema debes tener en cuenta:

El nucleo debe soportar y estar compilado para soportar atributos extendidos y ACL
El sistema de ficheros tiene de montarse con atributos extendidos y ACL
Se tienen de instalar las utilidades de espacio de usuario (chacl,getfacl y setfacl) para establecer el ACL.

Una vez claros estos conceptos pasamos a activar ACL.
Soporte ACL del núcleo de sistema:

La gran mayoría de distros actuales ya soportan ACL puedes comprobar si tienes soporte con este comando.

# grep POSIX_ACL /boot/config-`uname -r`
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_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_TMPFS_POSIX_ACL is not set


Como podéis tenemos el soporte de ACLs activado en el kernel. De no ser así lo recompilamos marcando estas opciones.

File systems --->

[*] ReiserFS extended attributes
[*] ReiserFS POSIX Access Control Lists

Puede hacerse sobre sistemas de ficheros ReiserFS, XFS, Ext3 y otros.
Soporte ACL en /etc/fstab:

Una vez que tengamos soporte ACL necesitaremos configurar /etc/fstab. Los sistemas de ficheros montados con acl tendrán la palabra clave "acl" en las opciones de montaje de sus entradas en el fichero.

/dev/sda6 /usr reiserfs noatime,acl,user_xattr 1 2
/dev/hda1 /opt ext3 defaults 0 0

Como podéis ver sda6 tiene soporte acl en el punto de montaje , si quisiéramos hacer lo mismo en hda1 sería tan fácil como:

/dev/hda1 /opt ext3 defaults,acl 0 0

Una vez actualizado el fichero /etc/fstab debemos remontar el sistema de ficheros.

Ejemplo para hda1:

# mount -o remount /dev/hda1

Soporte ACL en el espacio de usuario:

El último paso para usar ACL es asegurarse de que las aplicaciones de espacio de usuario estén presentes en el sistema. En Debian o Ubuntu puedes comprobar así:

# dpkg -l | grep acl
ii acl 2.2.42-1ubuntu1
Access control list utilities
ii libacl1 2.2.42-1ubuntu1

También puedes comprobar buscando las herramientas:

# type -a getfacl
getfacl is /usr/bin/getfacl

Si el control de ACLs no esta instalado puedes instalarlo desde el manejador de paquetes de tu distribución en debian por ejemplo:

# apt-get install acl

Formato ACL:

Linux soporta 2 tipos básicos de ACL:

ACL de control de directorios y ficheros.
ACL de directorio (máscaras) ACL que toman por defecto los ficheros creados en ese directorio.

La ACL se representa por tres campos separados por ":".

Campo 1:
Entrada

"u" Usuario
"g" Grupo
"o" Otro
"m" Máscara

Campo 2:

UID (ID numérico de usuario)
GID (ID numérico de grupo)
Vacío (Asume UID,GID del Creador)

Campo 3:

El tercer campo es el de acceso y puede ser representado de 2 maneras.

Cadena estándar RWX (las cadenas se pueden remplazar por "-" si no queremos dar acceso de ese tipo)
Cadena simbólica + ^

Herramientas:

chacl: Permite cambiar, examinar o eliminar ACL.
getfacl: Permite examinar acl para encontrar archivos o directorios.
setfacl: Establece ACL a fichero o directorio.

Mostrar ACL:

Para el ejemplo usaremos un directorio con archivos que hemos creado con touch.

> ls -l
total 0
-rw-r--r-- 1 tuxed tuxed 0 2008-01-26 03:03 lerele
-rw-r--r-- 1 root root 0 2008-01-26 03:03 pass
-rw-r--r-- 1 root root 0 2008-01-26 03:02 user

La acl para el directorio siguiente es:

> getfacl .
# file: .
# owner: root
# group: root
user::rwx
group::rwx
other::rwx

La acl por defecto para el fichero lerele es esta:

> getfacl lerele
# file: lerele
# owner: tuxed
# group: tuxed
user::rw-
group::r--
other::r--

La acl para el directorio el cual no se le ha asignado coge los de umask:
Establecer ACL:

Hay tres maneras de establecer un ACL:

Usando el comando setfacl el cual sobrescribe cualquier ACL anterior.
Usando el comando setfacl con la opción -m (Modifica ACL).
Usando chacl para modificar una ACL existente.

En esta ocasión mostraré como se cambian las acl con chacl, ya que este no sobrescribe la existente, y además proporciona algo más de información acerca del funcionamiento de las listas de acceso.
Ejemplo:

Añadiremos al usuario aitor como alguien que puede leer el fichero lerele, y usaremos chacl (cambiar la ACL) del siguiente modo:

$ chacl u::rw-,g::r--,o::---,u:aitor:r--,m::rw- lerele

Esta es la forma en la que se ve una acl en la vida real, el hecho de que sea un comando demasiado largo es que se deben definir en los puntos ya nombrados anteriormente el propietario de fichero, grupo propietario y otros.

Para entendernos mejor, la porción u::rw,g::r--,o::--- es la ACL existente y la porción u:aitor:r--,m::rw- especifica el nuevo usuario que quiero añadir a dicha acl y la máscara de derechos efectivos cuando se añada.

La máscara de derechos efectivos es la unión de todos los permisos ya existentes de UGO para un fichero o directorio. Se obtiene al añadir un usuario a la ACL.

Para comprobar que hemos sido añadidos a la acl usaremos:

$ getfacl lerele
# file: lerele
# owner: tuxed
# group: tuxed
user::rwx group::r-- other::--- user:aitor:r-- mask::rw-

Ahora que ya sabemos como funciona acl podríamos poner que aitor tenga permisos de lectura y escritura a lerele:

$ chacl u::rw-,g::r--,o::---,u:aitor:rr-,m::rw- lerele

Como veis le hemos añadido permisos de escritura:

$ getfacl lerele
# file: lerele
# owner: tuxed
# group: tuxed
user::rwx group::r-- other::---user:aitor:rw-

No hay comentarios: