Como extender los permisos de Linux: ACLs

Las ACLs o «Access Control List» son una forma de extender los permisos de seguridad que podemos asignar a los directorios y archivos de linux. Estos permisos nos permiten una mayor flexibilidad que el rígido sistema que suelen utilizar los sistemas *nix (también conocido como UGO o «User, Group, Other»), y es muy útil cuando nuestro sistema de permisos se complica por la necesidad de incluir muchos permisos diferentes a usuarios y grupos (la utilización de los permisos tradicionales o UGO son muy complejos en estos casos), ya que nos permite ir dando permisos a cada usuario del sistema/dominio de manera independiente.
El sistema de permisos ACL no substituye al sistema UGO, más bien lo extiende, ya que permite añadir muchos permisos extra partiendo de los UGO. De hecho se siguen respetando los permisos tradiciones (UGO) y se integran dentro de ACL, como y a explicaré más adelante.

Estos permisos, ACL, son necesarios cuando compartimos una carpeta a máquinas Windows (mediante Samba por ejemplo), ya que Windows usará estos permisos, y nos permitirá cambiarlos desde la misma pantalla de propiedades, pestaña de seguridad, de Windows, como muestra la imagen siguiente:

Panel de seguridad de Windows

Panel de seguridad de Windows

En este post, repasaré un poco el sistema tradicional de permisos (UGO) ya que el sistema de permisos ACL lo complementa y es necesario tener conocimientos básicos, aunque no voy a profundizar mucho en él, ya que puedes encontrar muchos manuales sobre el tema en internet (Google es tu amigo).

Importante: Conocer los permisos UGO es fundamental para utilizar los permisos ACL, por lo que te ruego encarecidamente que si no tienes algo de «culturilla» sobre el tema, que te leas el artículo entero aunque no trate directamente de ACL.

Soportar ACL en Linux

Primero de todo, para lograr que linux use este sistema hay que añadir a «/etc/fstab» en la entrada de la partición que queremos que use ACL, el parámetro «acl» al montar una partición, como indica la siguiente linea:

# Entry for /dev/sda2 :
UUID=e4f75e2b-56b5-4857-aa57-04629fbab9c8 /datos ext3 noatime,acl 1 2

Nota: Aunque casi todos los kernel de linux ya traen el soporte activado para ACL (la distribución Ubuntu la trae por defecto al menos), si usas una distro muy antigua, quizás tengas que recompilarte el kernel con ciertas opciones activadas, en internet hay varios manuales de como hacerlo.

De UGO a ACL…

Desde cualquier terminal, podremos ejecutar un «ls -l» (que es una herramienta muy potente para cualquier administrador si se sabe usar) para observar los permisos de los archivos de nuestro directorio actual, como mostramos en el siguiente listado que hemos capturado de un sistema linux cualquiera:

drwxr-sr-x 2 news   news   4096 2009-10-08 12:16 news
drwxr-xr-x 2 ntp    ntp    4096 2009-05-13 23:06 ntpstats
-rw-r--r-- 1 root   root      0 2009-07-09 09:44 pycentral.log
drwxr-x--- 3 root   adm    4096 2009-10-09 10:23 samba
-rw-r--r-- 1 root   root 505653 2009-10-08 13:08 scrollkeeper.log
-rw-r----- 1 syslog adm     564 2009-10-09 11:17 syslog
-rw-r----- 1 syslog adm  485104 2009-10-09 09:36 syslog.0
-rw-r--r-- 1 root   root 383188 2009-10-09 09:16 udev
drwxr-xr-x 2 root   root   4096 2008-03-10 16:24 unattended-upgrades
-rw-r----- 1 syslog adm     736 2009-10-09 09:17 user.log
-rw-r----- 1 syslog adm     274 2009-10-08 12:38 user.log.0
-rw-rw-r-- 1 root   utmp  33408 2009-10-09 11:32 wtmp

Para el tema de identificar los permisos, nos interesa mucho la primera columna (empezando por la izquierda) donde se nos muestran los permisos tradicionales basados en usuario/grupo que tiene un archivo/directorio en el sistema linux. Luego la tercera columna nos indica el propietario del usuario, y la cuarta el grupo propietario del archivo/directorio.

Las partes que nos interesan son el primer bloque (como por ejemplo este: drwxr-x—), donde el primer carácter del bloque nos indica que tipo de elemento esta listando:

  • Fichero regular (o «-«)
  • Directorio (o «d»)
  • Archivo de bloques (o «b») que suele ser típicos en el directorio «dev»
  • Archivo de carácter (o «c»)
  • Cola FIFO (o «f»)
  • Un enlace (o «l»)
  • Un socket (o «s»)

Como vemos en el primer bloque, después del primer carácter, nos encontramos una serie de caracteres agrupado de tres en tres, es decir 9 caracteres. Estos, básicamente, indican que tipo de permisos tiene asignado ese elemento (sea del tipo que sea) y los hay de 3 tipos:

  • Lectura (o «r»), para poder abrir los ficheros sin modificar.
  • Escritura (o «w») para poder modificar el fichero.
  • Ejecución (o «x») para ejecutar un programa o script. Si estamos hablado de un directorio, significa que podremos entrar dentro de el.

Estos permisos se tienen que aplicar a tres posibles escenarios (que equivalen a los tres bloques que hemos hablado antes), y que tienen el siguiente significado:

  • Para el usuario propietario del fichero (normalmente su creador), se identifica con el primer bloque (justo el que esta junto al carácter de tipo de elemento).
  • Para el grupo de usuarios propietario del fichero, se identifica con el segundo bloque. Este grupo no necesariamente tiene que ser a uno al que pertenezca el usuario ya que puede ser cualquier otro.
  • Para el resto de usuarios, que se identifica con el tercer bloque, los tres caracteres de la de derecha.

Es cierto que no solo se pueden aplicar los permisos rwx, ya que se pueden asignar ciertos permisos «especiales»:

  • «Sticky Bit» (o «t»)
  • «Bit Setgid» y «Bit Setuid» (o «s» con permisos de ejecución o «S» sin ella)

Como hemos comentado anteriormente, solo hay 3 posibilidades, permisos al usuario, al grupo del usuario y al resto. Imaginaros que tenemos 50~100 usuarios y los permisos son bastante complejos, tales como que hay varios grupos que tienen que usar cierto recurso o varios usuarios que queremos que sean propietarios de un fichero. Con este sistema de ficheros es bastante complejo de realizar o bien, creando grupos especiales para cada recursos.

Aquí viene ACL al rescate del pobre administrador de sistemas.

Al fin, ACL en nuestro sistema

Con los permisos ACL’s esto cambia, ya que podemos asignar varios permisos a nivel de usuario/grupo a un mismo fichero, lo cual nos permite muchas mas flexibilidad. Pero esto requiere unos cuantos comandos nuevos que no se suelen utilizar, estos comando son:

  • getfacl, el cual nos muestra los permisos que tiene un archivo o fichero.
  • setfacl, nos permite fijar los permisos. Es importante que por defecto nos permite asignar un permiso que no existiera, es decir, no se puede modificar un permiso con este comando.
  • chacl, nos permite modificar permisos.

Por ejemplo vamos a ver los permisos de un directorio, usaremos el comando «getfacl«:

nas001@nas001:~$ getfacl /var
getfacl: Removing leading '/' from absolute path names
# file: var
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

Este comando acepta algún parámetro extra, el cual puedes consultar en su ayuda, pero para este pequeña guía no son especialmente importantes. Solo remarcar el parámetro «-R» que nos permite recorrer recursivamente un directorio para listar los permisos de todos los ficheros y subdirectorios que existan dentro de una carpeta (y normalmente es una burrada de información que te recomiendo que vuelques a un fichero).

Como puedes ver, el comando getfacl tiene una salida diferente a el comando «ls» sobretodo mas descriptivo.

nas001@nas001:~$ sudo getfacl /mnt/raid/Carpeta/
getfacl: Removing leading '/' from absolute path names
# file: mnt/raid/CONTROL
# owner: root
# group: usuarios\040del\040dominio
user::rwx
user:user1:r-x
user:user2:r-x
user:user3:r-x
user:user4:r-x
user:user5:rwx
user:user6:rwx
user:user7:r-x
user:user8:r-x
group:Administracion:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:user1:r-x
default:user:user5:r-x
default:user:user8:r-x
default:group:Administracion:rwx
default:group::---
default:mask::rwx
default:other::---

ACE, default y máscaras

Como se puede ver, esto puede ser es bastante mas complejo. Ya no tenemos la terna usuario/grupo/otros, sino que tenemos una lista de usuarios/grupos y luego el resto de los usuarios. Cada una de las lineas, que se identifica con un permiso se denomina «ACE» o «ACL Entry». Estas ACE pueden referirse a «usuarios propietarios» o «usuarios nombrados», siendo estos últimos los que se los nombra directamente en cada ACE, como por ejemplo:

user:user1:r-x # usuario nombrado "user1"
user::rwx # Usuarios propietario

En cualquier listado se puede observar el usuario propietario y  el grupo propietario, que se identifican con ACL mediante los ACE:

# ACE con los propietarios
user::rwx
group::---
other::---

Mientras que otros usuarios/grupos nombrados se pueden identificar mediante, en el siguiente listado, se puede ver los permisos del usuario «user1», y del grupo «Administracion»:

# Entradas ACE con usuarios nombrados
user:user1:r-x
group:Administracion:rwx

Como podemos ver, cada permiso, viene caracterizado mediante 3 campos separados por «:», algo tipo: «tipo:usuario:permiso», donde el tipo pueden ser:

  • «u» o user, el permiso se aplica a un usuario
  • «g» o group, el permiso se aplica a un grupo
  • «o» u other, el permiso se aplica al resto de los usuarios que no aparezcan en ninguna entrada en la lista de permisos ACL.
  • «m» o mask, es una máscara de permiso. Se aplica sobre el permiso asignado a un usuario/grupo nombrado para obtener el permiso efectivo.

Otra peculiaridad a destacar, es el permiso que tiene la etiqueta «default», como la siguiente:

default:user:user5:r-x

Esta entrada nos indica que todas las carpetas que se creen dentro de la carpeta que tiene este permiso, lo mismo que todos los ficheros que se creen, tendrán como permiso ACL heredado esta entrada, es decir, en este caso, el «user5» tendrá permiso de lectura y ejecución sobre todo lo que se cree dentro de esa carpeta.

Existe una entrada ACE que resulta muy curiosa, y es la entrada «mask«. Este entrada sólo afecta a los ACE nombrados, aquellos que tiene un usuarios o grupo en su entrada como ya explicamos, y que suelen cruzarse con los permisos que tengan los usuarios y grupos para generar permisos efectivos.

user:juan:rw- # el user1 tiene un permiso rw-
mask::r-x # Máscara con permisos r-x
# Permisos efectivos reales de user 1: r--

Modificando quien accede y quien no

Resulta que nos encontramos con dos comandos: chacl y setfacl. En casi todas la guías que leas el uso de chacl es prácticamente nulo, ya que todo el mundo usa setfacl (al parecer setfacl es mas completo, o simplemente gusta más que chacl). ¿Pero no decíamos que setfacl no modificaba los valores de los permisos?. Bueno, realmente si lo hace pero incluyendo un parámetro dentro del comando a ejecutar que nos permitirá tal posibilidad.

setfacl -m u:miuser:rwx /home/miuser/

Con estos comandos acabamos de dar permiso a «miuser» en la carpeta «/home/miuser/» para permiso de lectura, escritura y ejecución (en directorios significa poder listar su contenido). El parámetro «-m» significa modificar, lo que nos permite cambiar las ACL y incluir (o modificar) una ACE con el usuario y los permisos indicados.

setfacl -R -d -m u:miuser:rwx /home/miuser/

Como se había comentado antes en este artículo, existe una ACE que puede tener una etiqueta «default«, con este comando, podemos cambiar dicho permiso por defecto. Para ello, se usa el parámetro «-d«.
Como puedes ver, también se incluye la etiqueta «-R» que indica recursividad, es decir, que estos permisos que aplicarán al directorio y a todo el contenido de ficheros/directorios que albergue. No creo que tenga que avisaros que sepáis lo que hacéis cuando se usa un comando recursivo, ya que como metáis la pata vais a tener que andar limpiando por muchos sitios vuestro estropicio :).

Es muy importante en este comando, el tema de los errores. Al menos para mi, son bastante desconcertantes inicialmente ya que suelen generar errores bastante poco descriptivos del tipo:

nas001@nas001:~$ setfacl -m g:user1:rwx /var/log/messages
setfacl: Option -m: Argumento inválido near character 3

El error no esta en el parámetro «-m» (como parece que indica el error), si no en el usuario que se han incluido en el comando.
Fíjate bien, ya que pone una «g» de grupo delante de un usuario, por lo que nos da error, en el caracter 3, curiosamente donde empieza la palabra «user1«. Esto nos indica que el error esta en la terna de «tipo:id:permisos» que en el comando en sí.
Casi todo los errores son debidos a errores de este tipo. Avisado quedas 🙂

Borrando permisos

Tan importante como modificar los permisos, es eliminarlos de la lista de ACL. Si queremos eliminar un usuario, es cierto que podemos simplemente quitarle todos los permisos, pero seguirá apareciendo en la lista de ACL, con su ACE en el listado, lo que nos puede emborronar mucho y darlos listados muy largos y complejos de depurar (y os aseguro que algún día tendréis que mirarlos).

Para realizar una limpieza de permisos o como restaurarlos al defecto, habría que lanzar el siguiente comando (ojo que borra todos los permisos asignados dejando solo los que tenía por defecto):

setfacl -b -k -R directorio

Donde el comando «-b» borra los ACL y el «-k» los ACL por defecto o «defaults».
Pero si queremos ser más selectivos y solo borrar un permiso en particular, es decir, quitar a un usuario/grupo y que no aparezca en el listado de permisos (pasa a usar los permisos de «other»), tendremos que usar el comando:

setfacl -x u:user1 /var/www

Este comando, eliminaría de los permisos a user1 en el directorio «/var/www», y este usuario tendría que regirse por los permisos de «other» como ya hemos comentado anteriormente.

Referencias

  • «Using ACLs with Fedora Core 2», Link.
  • «POSIX Access Control Lists on Linux», Andreas Grünbacher SuSE Labs, Link.
  • «Uso de Listas de Control de Acceso (ACLs) en Linux», Ignacio Arenaza Nuño, Proyecto escomposlinux.org, Link.
Please follow and like us:

2 pensamientos en “Como extender los permisos de Linux: ACLs

  1. Pingback: Bitacoras.com

  2. Buen artículo, solo una cosa. Creo que te equivocas cuando dices :

    «Con estos comandos acabamos de dar permiso a “miuser” en la carpeta “/home/miuser/” para permiso de lectura, escritura y ejecución (en directorios significa poder listar su contenido). »

    Para poder listar el contenido de un directorio se usa el permiso de lectura. El de ejecución es para pasar a través de un directorio.

    De esta manera, con unos permisos -wx no podrás listar el contenido de un directorio y sin embargo sí podrás crear nuevos ficheros dentro y/o editar ficheros ya existentes.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *