ACL en GNU/Linux

Hoy vamos a introducirnos en el fascinante mundo de las ACL (Access Control List) en Linux. En este punto ya habrá alguien que piense que eso es más viejo que el mismo Unix, pero mucha gente, entre que los que me incluyo, no tenia ni idea de que existían las ACL en Linux, y menos cómo usarlas. Empecemos, como siempre, con un poco de teoría cortesía de la Wikipedia:

Una Lista de Control de Acceso o ACL (del inglés, Access Control List) es un concepto de seguridad informática usado para fomentar la separación de privilegios. Es una forma de determinar los permisos de acceso apropiados a un determinado objeto, dependiendo de ciertos aspectos del proceso que hace el pedido.

Así pues, las ACL nos permiten determinar si una entidad puede acceder o no a un objeto, y qué acciones puede realizar contra dicho objeto. Bien, hasta aquí suena exactamente igual que los típicos controles de acceso de Linux, y es normal, dado que la instancia mas simple de una ACL son los permisos habituales de propietario/grupo/otros que tan bien conocemos. La diferencia radica en que con las ACL se puede hilar mucho más fino, especificando varios grupos y usuarios y detallando para cada uno sus permisos específicos.

Bueno, y ahora, ¿cómo implementamos este tipo de acceso en nuestro Linux? Lo primero, dado que opera al nivel de sistema de ficheros, es añadir la opción acl a las particiones correspondientes. Para ello:

mount –o remount /dev/sd# -o acl

O si lo queremos persistente, añadirlo al fstab, por ejemplo:

/dev/sd#  /home                ext3       defaults,acl              1 2

Una vez está activado, vamos a jugar un poco para ver que nos permite hacer. Un símbolo “+” al final de los permisos al hacer un ls -l nos indica que el fichero o directorio en concreto tiene información adicional. Con el comando getfacl podremos inspeccionarlas:

jvela@s2-jvela:~/ACL> ls -l  
-rw-rwx---+ 1 jvela jvela   11 mar 22 16:14 prueba

jvela@s2-jvela:~/ACL> getfacl prueba
# file: prueba 
# owner: jvela 
# group: jvela 
user::rw- 
user:carlos:rw- 
group::r-- 
group:users:r-x 
mask::rwx 
other::---

Con este comando, podemos ver que el fichero prueba, además de pertenecer a jvela y tener el grupo jvela, tiene permisos adicionales de lectura y escritura para el usuario carlos y permisos de lectura y ejecución para el grupo users. El campo mask sirve para indicar los permisos máximos que podrá tener cualquier usuario o grupo. Así pues, si la mascara fuera r-x, aunque el ACL dijera que Carlos tiene permisos de escritura, no los tendría.

Gracias a esto, podemos darle permisos a un usuario y grupo específico sin tener que añadir dicho usuario a nuestro grupo personal (lo que le permitiría acceder a mucha más información nuestra, algo que probablemente no nos interesa) y sin tener que forzar opciones de others, habilitando a todos los usuarios del sistema. Dado que se pueden añadir varios usuarios y/o grupos, disfrutamos de una granularidad excelente.

Ahora toca hacerlo nosotros mismos. Vamos a hacer que un fichero que me pertenece a mí y a mi grupo personal, que contiene una entrada para Security Art Work que va a revolucionar la informática pueda ser accedido por Manolo, pero no quiero que nadie más pueda acceder a este fichero, ni quiero que Manolo pueda ver todos mis archivos, incluidos los ficheros .odt con chistes malos. Así pues, o creo un grupo específico para esta tarea, lo cual no parece la solución óptima ni escalable, o uso ACLs:

jvela@s2-jvela:~/ACL> setfacl -m u:manolo:r-- securityartwork

jvela@s2-jvela:~/ACL> getfacl securityartwork
# file: securityartwork 
# owner: jvela 
# group: jvela
user::rw- 
user:manolo:r-- 
group::r-- 
mask::r-- 
other::r--

Fácil, ¿no? El campo “u” indica que estamos añadiendo un usuario, ras lo cual especificamos al usuario y los permisos. Tan sólo hacer notar que la máscara, si no especificamos nada, se ajusta a los permisos que le hemos asignado al usuario para que los permisos sean efectivos. Si además, dado que somos muy confiados, quisiéramos que el grupo “edicion” pudiera también leer dicho fichero, y tan sólo dicho fichero (por ejemplo, porque queremos que lo validen antes de publicar), también podríamos hacerlo:

jvela@s2-jvela:~/ACL> setfacl -m g:edicion:r-- securityartwork 

jvela@s2-jvela:~/ACL> getfacl securityartwork 
# file: securityartwork 
# owner: jvela 
# group: jvela 
user::rw- 
user:manolo:r-- 
group::r-- 
group:edicion:r-- 
mask::r-- 
other::r--

Creo que hasta aquí es bastante impresionante, al menos para aquellos que desconocían la potencia de estos comandos. El comando setfacl es muy completo y os aconsejo que lo repaséis para entender cada opción y como añadir permisos más complejos. Como hemos visto las ACL proporcionan una flexibilidad tremenda y una mayor seguridad para nuestros ficheros. Pero no es oro todo lo que reluce. ¿Qué pasa al copiar archivos? ¿Y al comprimirlos y descomprimirlos? ¿Se pueden heredar permisos de un padre? ¿Y propagar dichos permisos recursivamente?

Bueno, muchas preguntas. Para las respuestas, si el tiempo lo permite, habrá otro post. De momento, vayan experimentando.

Comments

  1. un visitante says

    Por desgracia ACL no se lleva muy bien ni con cifs ni con sshfs.

    Por lo demás es una herramienta muy potente.

  2. Hola, antes de nada gracias por el mensaje.

    Según como veo los permisos cuando ejecutas la orden getfacl también hay permisos de lectura para otros, por lo que este grupo (todo el mundo) podría también leer el contenido del archivo, aunque no su escritura.

    A lo mejor me equivoco pero es lo que me parece.

    NaCl u2

  3. Ciertamente rigolox, se me paso el r– para others, así que en este caso cualquier usuario podria leer el fichero. Mea culpa, esto pasa por ir con prisas.

    chmod 640 securityartwork

    Y asi el post ya tiene algo de sentido. Gracias por el apunte.

    Moraleja: La seguridad en Linux no es muy buena cuando al hacer un touch el grupo others tiene permisos de lectura!

  4. ¡Ateo! Eso te pasa por usar una mascara “pasa todo” (022). Que siendo un fichero: 666 And ~(022) te da ese 644(110 100 100) y por eso al hacer touch te crea el fichero con permisos de lectura para otros. Eso en Windows no te hubiera pasado }8).

    Javi, el post esta muy muy currado, espero una entrada nueva pronto.

    ¡¡Felicidades y suerte en el RHCE!! :).

  5. ¿Hay alguna forma de que una carpeta movida herede los permisos de la carpeta destino?. Cuando la copias y pegas sí los hereda, pero al mover se queda con los permisos originales.

Trackbacks

  1. […] ACL en GNU/Linux. ¿Listas de control de acceso en Linux? Confieso que ni sabía que estaban disponibles… La segunda entrega aquí. […]

  2. […] Listas de Control de Acceso en GNU/Linux http://www.securityartwork.es/2010/04/13/acl-en-gnulinux/  por tollendo hace 2 segundos […]

  3. […] objeto, dependiendo de ciertos aspectos del proceso que hace el pedido.  Para saber más… Valuación : 1 + Calificar Categoría : La Red Comentar  Denunciar […]