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:
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
Publicado por
Carlos-vialfa.
Última actualización: 12 de agosto de 2008 a las 19:11 por Carlos-vialfa.