Seguridad - Los Access Control Lists (ACLs)

Mayo 2017


Exceder los privilegios de base de un sistema Linux utilizando los ACLs.

I. PREREQUISITOS


- Conocimientos de base del sistema GNU/Linux
- Instalación de software
- Conocer la arborescencia de un sistema GNU/Linux
- Estar acostumbrado a la línea de comandos (shell, Terminal o consola)
- Comandos de base
- Nociones de [ privilegios de acceso a los archivos]
- Gestión de usuarios de un sistema GNU/Linux
- Kernel linux

Vea también los atributos de archivos (sobretodo la opción -i que nos muestra los privilegios de acceso) gestión de atributos de los archivos ext2

Wow, todo eso. ¿Entonces los ACLs son hechos sólo para los expertos de GNU/Linux?
No, no se precipite en sacar conclusiones.
Después de la lectura de este pequeño tutorial será capaz de poner en práctica los ACLs.
Sin embargo el tutorial no le enseñará las estrategias que debe implementar sino solamente como puede utilizar los ACLs así como algunas razones para hacerlo.

II. Introducción


Los ACLs permiten otorgar privilegios de acceso adicionales.
El propietario de un archivo puede, gracias a los ACLs, otorgar privilegios a uno o más usuarios y/o grupos que se sustituirán a los privilegios de acceso de base.

Con los ACLs es posible otorgar privilegios a un usuario que no es parte del grupo sin modificar los privilegios de los otros.
Igualmente se pueden autorizar privilegios de acceso a un grupo de usuarios que no pertenecen al grupo del archivo.
No hay límites en lo que respecta al número de usuarios o grupos a adicionar con los ACLs.

El respaldo hecho con tar no memoriza los ACLs definidos.

III. Definición


Un ACL está compuesto de varias entradas de tipo ACL. Una entrada especifica los permisos de acceso a un objeto asociado a un usuario o grupo de usuarios utilizando una combinación de privilegios tradicionales r, w y x.

Es decir una entrada ACL esta compuesta de un:
  • tag que especifica una identidad de usuario
  • tag opcional de usuarios o grupos
  • la lista de permisos otorgados



He preferido utilizar el término tag (del manual en inglés, man acl), pero si desea, puede utilizar etiqueta en lugar de tag. Adicionalmente puede reemplazar la estructura en español SI SI NO ENTONCES <Comentario> por la estructura en inglés IF THEN ELSE <comment>

Los tags definidos son los siguientes:
---------------------------------------------------------------------------------------------------------------------------------------------
ACL_USER_OBJ | privilegios de acceso para el propietario
---------------------------------------------------------------------------------------------------------------------------------------------|
ACL_USER         |privilegios de acceso para los usuarios identificados por el tag opcional
---------------------------------------------------------------------------------------------------------------------------------------------|
ACL_GROUP_OBJ| privilegios de acceso para el grupo del archivo
---------------------------------------------------------------------------------------------------------------------------------------------|
ACL_GROUP      | privilegios de acceso para el grupo identificado por el tag opcional
---------------------------------------------------------------------------------------------------------------------------------------------|
ACL_MASK        | privilegios máximos otorgados a ACL_USER, ACL_GROUP_OBJ
                                              y ACL_GROUP
---------------------------------------------------------------------------------------------------------------------------------------------|
ACL_OTHER      | privilegios de acceso que no corresponden a ninguna entrada = otros
---------------------------------------------------------------------------------------------------------------------------------------------



Algoritmo de búsqueda de ACLs

SI el UID efectivo del proceso es igual al UID del propietario ENTONCES 

  SI ACL_USER_OBJ contienen los permisos necesarios ENTONCES 
    el acceso es autorizado 
  SI NO 
    el acceso es prohibido 
  FIN SI 

SI NO SI el UID efectivo del proceso corresponde a cualquier ACL_USER ENTONCES 

  SI ACL_USER y ACL_MASK contienen los permisos necesarios ENTONCES 
    el acceso es autorizado 
  SI NO 
    el acceso es prohibido 
  FIN SI 
SI NO SI el GID efectivo o cualquier GID de procesos corresponde al GID del archivo
 o al ACL_GROUP ENTONCES 

  SI ACL contiene un ACL_MASK </gras>ENTONCES</gras> 
    
    SI ACL_MASK y cualquier ACL_GROUP_OBJ o ACL_GROUP contienen los 
permisos necesarios ENTONCES 
      el acceso es autorizado 
    SI NO  
      el acceso es prohibido 
    FIN SI 

  SI NO <comment> a este nivel ACL_GROUP no puede estar sin ACL_MASK</comment> 
    SI ACL_GROUP_OBJ contiene los permisos necesarios ENTONCES 
      el acceso es autorizado 
   <ras> SI NO </gras>
      el acceso es prohibido 
    FIN SI
  FIN SI 

SI NO SI ACL_OTHER contiene los permisos necesarios ENTONCES 
  el acceso es autorizado 
SI NO 
  el acceso es prohibido 
FIN SI



Para resumir todo esto con un ejemplo:
 [d[efault]]:tag:usuario|grupo:privilegios


Para cada tag utilizamos:
u[ser], g[roup], o[ther], m[ask]


Cuando el campo usuario|grupo está vacío, la entrada se aplica al propietario. Los archivos creados en un directorio, que tiene un ACL con el tag default, retienen el ACL del directorio.

Observación!

Aquello que está delimitado por los corchetes es opcional.
Es decir, la forma corta está permitida.

IV. Colocar soportes para los ACLs


Verificación de la compatibilidad de los ACLs con el kernel


El kernel de la familia 2.6 incluye el soporte acl para ext2, ext3, jfs y xfs.
Si el kernel no incluye el soporte debe compilar el kernel.

Para mayor información vaya al sitio de los ACLs http://acl.bestbits.at/

éste es el resultado para la versión 2.6.17.3 del kernel.
$ uname -a && grep -i 'acl' /boot/config-$(uname -r) 
Linux debian 2.6.17.3 #1 PREEMPT Sat Jul 1 11:24:31 CEST 2006 i686 GNU/Linux 
CONFIG_EXT2_FS_POSIX_ACL=y 
CONFIG_EXT3_FS_POSIX_ACL=y 
CONFIG_JFS_POSIX_ACL=y 
CONFIG_FS_POSIX_ACL=y 
CONFIG_XFS_POSIX_ACL=y 
# CONFIG_NFS_V3_ACL is not set 
# CONFIG_NFSD_V3_ACL is not set

Instalación del paquete acl


Ahora que el soporte es compatible con el kernel, sólo nos falta instalar el software que nos permita usar los acl.

Este es un paquete acl que contiene los comandos getfacl y setfacl.

Debian : apt-get install acl
Mandriva 2006: urpmi acl

Preparación de las particiones


Para ingresar los ACLs en los archivos, la partición que contiene estos archivos debe soportar los acl.

Para ello hay dos formas de hacerlo:
  • temporal

mount /dev/partition -o defaults,acl /punto/de/montaje
  • permanente - edición de /etc/fstab

/dev/partition /home ext3 defaults,acl 0 2
  • Donde partition depende de su configuración:
    • hda, hdb,.. para un disco duro IDE
    • sda, sdb,.. para un disco duro SCSI

V. Los comandos


setfacl


El comando setfacl nos permite posicionar los ACLs.
Mostraremos solamente las opciones -m, -x, -L y -R.
Vea el manual man setfacl para mayor información.

-m, --modify - modifica los ACL de un archivo o directorio
-x, --remove – elimina las entradas ACLs
-b, --remove-all – elimina todas las entradas ACLs
-L, --logical – enrutamiento de los enlaces simbólicos
-R, --recursive – aplicación de los ACLs de forma recursiva

getfacl


El comando getfacl nos permite mostrar los ACLs.
  • La opción -R permite ver los ACLs de forma recursiva
  • La opción -L para el enrutamiento de los enlaces simbólicos



man getfacl para mayor información.

VI. Salvar y restaurar ACLs


Lo que era inadmisible para el comando chmod, no lo es para los ACLs. El comando getfacl permite salvar los ACLs

Ejemplo: Memorizar los ACLs de une arborescencia

$ getfacl -R /ruta/hacia/dir > /ruta/hacia/get_rep.acl

El comando setfacl permite restaurar los ACLs

Ejemplo: Restauración de los ACLs de una arborescencia

$ setfacl --restore=/ruta/hacia/get_rep.acl

VII. Ejemplos de utilización de ACLs


No es fácil imaginar todas las posibles configuraciones, por lo que les dejo descubrir por ustedes mismos en función de sus configuraciones.

Aquí un enlace donde encontrará un ejemplo de utilización.
http://informatica.uv.es/iiguia/AER/Tema5.pdf

Piense bien antes de utilizar los ACLs.
Si chmod es suficiente no se complique la vida.
En cambio donde chmod no puede hacer nada piense en los ACLs.

Ejemplo 1:

- un directorio cuyo propietario es José y el grupo es ccm

Para José los privilegios son (Lectura, Escritura, Ejecución) rwx
Para el grupo ccm los privilegios son (Lectura y Ejecución) r-x
Para los otros ningún privilegios entonces ---

Pero José quiere otorgar a los moderadores que son parte del grupo modo,
el privilegio de lectura r.

En esta situación chmod no puede hacer nada. Entonces, recurrimos a los ACLs.
$ setfacl -R -m group:modo:r /home/ccm/unmundomejor


Ejemplo 2
  • En el mismo archivo José ha decidido otorgar a Sebastián todos los privilegios
  • y a </gras>Martín</gras> y </gras>Jesús </gras>privilegios de ejecución



Sabiendo que todos son parte del grupo modo.
$ setfacl -R -m u:egavuasbes:wx,u:martin:x,u:jesus:x /home/ccm/unmundomejor


Ejemplo 3

Jesús habiendo sido solicitado por Royal Dutch Shell, debido a sus conocimientos en Shell y
Martín solicitado por C PLUS ELECTRONICS.COM por su dominio en lenguaje C

José ha decidido retirarles los privilegios de ejecución temporalmente.
$ setfacl -R -x u:jesus $ setfacl -R -x u:martin


Ejemplo 4

Un día José decide quitar los ACLs para poder reorganizar el proyecto, pero antes hace una copia de respaldo de las ACLs
$ getfacl -R /home/ccm/unmundomejor > /home/jose/cambiarelmundo/ unmundomejor.save.acl 
$ setfacl -R -b /home/ccm/unmundomejor

Consulta también

Publicado por Carlos-vialfa. Última actualización: 12 de agosto de 2008 a las 19:11 por Carlos-vialfa.
El documento «Seguridad - Los Access Control Lists (ACLs)» se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo libremente. No olvides citar a CCM (es.ccm.net) como tu fuente de información.