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!!
Music, coffee, and coding <3