Atributos y listas de control de acceso

Los atributos y listas de control de acceso son como las fosas marianas de los permisos. Bueno, en realidad no tanto, no son tan desconocidos. Quizás sean más comunes entre sysadmins pero nunca esta de más conocer estas herramientas que nos permiten manejar nuestro SO como un ninja.

Esta es la continuación del post Permisos de archivos y directorios en Linux. En dicho post dimos un repaso por los comandos básicos para ver y modificar permisos de archivos y directorios. También vimos algo de teoría que resulta muy útil si planeas venderle tu alma a Linux. Recomiendo que te des una vuelta si no aún no lo haces, no te arrepentirás. Bueno ya, basta de bla bla bla y vamos a lo bueno.

Atributos en Linux

Las 3 operaciones básicas en los archivos son también los 3 permisos básicos (read, write, execute). Adicionalmente existen los atributos que permiten personalizar algunas operaciones especiales en los archivos. Aquí una nota importante, los atributos están directamente ligados con el sistema de archivos. No todos los sistemas de archivos implementan todos los atributos, para ello debes consultar la documentación de tu sistema de archivos y así estar seguro del funcionamiento.

Posiblemente el atributo más famoso es el de inmutabilidad. Al activarlo indicas que nadie puede modificar, borrar, renombrar un archivo o crear un link. Prácticamente lo congelas como mamut en un iceberg. Ni siquiera el usuario root podrá hacerlo, sin embargo, es el usuario root quien puede asignar/eliminar el atributo.

Como la implementación de atributos depende del sistema de archivos, no daré toda la explicación de ellos. Si merece la pena ver como manipular los atributos.

Agregar o remover atributos

Nuestro amigo chattr tiene todo lo necesario para agregar y remover atributos. El comando es simple, tiene la siguiente estructura:

$ chattr {OPERADOR}{ATRIBUTO/S} {ARCHIVO}

Los operadores ya los conoces (si es que te pasaste por el post anterior), son +-=.

En cuanto a los atributos, puedes obtener la lista completa con el comando man chattr. Algunos requieren el uso de root y otros no los puedes cambiar (pero allí están de todas formas por alguna razón).

Acá te dejo algunos ejemplos.

Agrega el atributo de inmutabilidad en el archivo:

# chattr +i file.txt

Remueve el atributo de inmutabilidad en el archivo:

# chattr -i file.txt

Consultar atributos

Para consultar los atributos de un archivo usamos el comando lsattr. Funciona similar a ls, puedes ver todos los archivos o indicar una lista:

$ lsattr [FILE1 FILE2 DIR1 DIR2]

Acá un ejemplo sencillo:

$ lsattr
----i---------e------- ./file.txt
-----a--------e------- ./file2.txt
----i---------e------- ./mydir

El comando anterior solo muestra los atributos en modo abreviado. Puedes obtener mejor información usando la flag -l:

$ lsattr -l
./file.txt                   Immutable, Extents
./file2.txt                  Append_Only, Extents
./mydir                      Immutable, Extents

Listas de control de acceso en Linux

Ya sabemos que todo archivo pertenece a un usuario y un grupo (a.k.a usuario propietario y grupo propietario). De allí nace una relación con los permisos de usuario, grupo y otros. Los permisos de “otros” son para todo usuario o grupo que no son los propietarios. Todo bien hasta aquí.

¿Qué pasaría si ahora quieres que solo 3 usuarios o grupos puedan modificar un archivo/s?. Un escenario similar ocurre con los directorios. Imagina que necesitas solo 5 usuarios con permisos para crear/borrar archivos en una ruta particular. De algún modo necesitas indicarle al sistema cuales son los permisos pero de una manera más granular. Solución: ACLs.

Con todo el conocimiento adquirido del post anterior sobre permisos, te resultará fácil leer los resultados de los comandos ACL. Garantizado 🙂

En algunos casos los comandos no están disponibles por defecto pero puedes instalar el paquete acl en la mayoría de distribuciones:

# apt install acl

Asignar una lista de control de acceso

El comando setfacl es lo todo lo que ocupamos. La estructura básica es la siguiente:

$ setfacl {ACCION}{ESPECIFICACION_ACL} ARCHIVO_O_DIRECTORIO

Las acciones pueden ser -m para modificar o -x para remover.

La especificación ACL se construye usando la siguiente estructura:

Para usuarios: u:nombreusuario:permisos

Para grupos g:nombregrupo:permisos

El siguiente ejercicio te ayudará a ver las ACL en acción.

Un usuario root crea una carpeta shared en /home. Por defecto esta carpeta pertenece a root, los demás usuarios (user1 y user2 para este ejemplo) pueden ver el contenido pero no pueden crear nada dentro.

user1$ ls -l /home
drwxr-xr-x 2 root   root   4096 May  4 14:45 shared
drwxr-x--- 2 user1  user1  4096 May  4 14:46 user1
drwxr-x--- 2 user2  user2  4096 May  4 14:46 user2

user1$ cd /home/shared
user1$ touch user1file.txt
touch: cannot touch 'user1file.txt': Permission denied

Principle of least privilege es un concepto de seguridad informática. Este nos dice que los usuarios solo deben tener acceso a datos, programas, carpetas necesarias para completar su trabajo. Supongamos que queremos que solo user1 pueda crear/borrar dentro de shared. Si usáramos chmod entonces terminaríamos afectando los permisos de otros. Esto también le daría permisos de escritura a user2 lo cual representaría un problema de seguridad. Si usáramos chown para que user1 sea el propietario entonces esto solucionaría temporalmente el requerimiento pero ahora user1 también podría administrar la carpeta y si el dia de mañana se requiere otro usuario entonces tendríamos un problema.

En este punto ya se nota la importancia de las ACLs. Afortunadamente, el siguiente comando resuelve todo este rollo. Proporciona todos los permisos a user1 en el directorio shared:

# setfacl -m u:user1:rwx shared

Ojo aquí, la ACL tiene cierto grado de preferencia en cuanto a permisos. Si solo diéramos el permiso w, el usuario no podría ingresar al directorio por falta de los permisos rx (aunque existan en los permisos de otros).

Ver lista de control de acceso

Podemos confirmar y ver nuestra ACL con getfacl. La estructura básica es:

$ getfacl ARCHIVO_O_DIR

Siguiendo nuestro ejemplo para ver las ACL en shared tendriamos:

$ getfacl shared
# file: shared
# owner: root
# group: root
user::rwx
user:user1:rwx
group::r-x
mask::rwx
other::r-x

Podemos ver dos entradas user:, una pertenece al propietario y la otra es la que agregamos previamente para user1. La salida seria similar si lo hacemos con grupos.

Remover lista de control de acceso

Para eliminar un ACL seguimos usando serfacl con la flag -x. La estructura seria:

$ setfacl -x {ESPECIFICACION_ACL} ARCHIVO_O_DIR

La especificación ACL es la que encontramos al consultar con getfacl sin la parte de los permisos.

$ getfacl shared
# file: shared
# owner: root
# group: root
user::rwx
user:user1:rwx <- especificación ACL
group::r-x
mask::rwx
other::r-x

Remueve al ACL de user1 en el directorio shared:

$ setfacl -x u:user1 shared

Easy-peacy!!

Conclusión

Los atributos y listas de control de acceso nos ayudan a controlar nuestro sistema de una forma más detallada. Todo depende del escenario al que nos afrontemos que podemos usar uno u otro. Los permisos pueden llegar a ser complejos y tener distintos resultados cuando se combinan, es por esta razón que saber el funcionamiento es clave.

Nuevamente te invito a que pongas en práctica el conocimiento adquirido ya que es una buena forma de dominar estos conceptos.

Espero que este post junto al anterior te hayan sido de ayuda. Nos leemos pronto!!

Deja un comentario

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