Cómo configurar las Listas de Control de Acceso - ACL's.
Autor: John Jairo Toro A.
Correo electrónico: JohnToro en gmail punto com
Sitio de Red:
Jabber ID: johntoro@jabber.org
Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1
© 1999-2007 John Jairo Toro A. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.
Introducción.
Acerca de ACL.
ACL (Access Control List) o Listas de Control de Acceso, corresponden a un conjunto de permisos complementarios a los tradicionales UGO (Usuario/Propietario, Grupo, Otros) dentro del sistema de archivos ext2, ext3, nfs. Básicamente es un parche (complemento) al núcleo (kernel) del sistema operativo que esta disponible desde la versión 2.4 (la versión 2.6 del kernel incluye soporte para: jfs, xfs).
Las ACL cumplen con el estándar POSIX (Portable Operating System for UnIX).
En algunos casos, la asignación de permisos mediante el modelo UGO puede quedarse corto, cuando, por ejemplo, queremos dar permisos a más de un usuario o grupo en un directorio o archivo, cosa que es muy común en ambientes corporativos.
Equipamiento lógico necesario.
Si utiliza CentOS 4 o White Box Enterprise Linux 4, estos ya incluyen el soporte para ACL's.
Los paquetes básicos son: acl, libacl
Los parches se pueden descargar en: http://acl.bestbits.at/download.html
Procedimientos.
Habilitar las ACL's en el volumen deseado
En el archivo /etc/fstab habilitamos el empleo de las ACL's, simplemente agregando el parámetro: acl
Ejemplo:
# /etc/fstab
|
# This file is edited by fstab-sync - see 'man fstab-sync' for details
|
/dev/VolGroupJT/LogVol0 LABEL=/boot none none none none /dev/VolGroupJT/LogVol01 /dev/hdd4 /dev/hdc /dev/fd0
|
/ /boot /dev/pts /dev/shm /proc /sys swap /media/zip /media/cdrom /media/floppy
|
ext3 ext3 devpts tmpfs proc sysfs swap auto auto auto
|
defaults,acl defaults gid=5,mode=620 defaults defaults defaults defaults pamconsole,exec,noauto,fscontext=system_u:object_r:removable_t,managed pamconsole,exec,noauto,fscontext=system_u:object_r:removable_t,managed pamconsole,exec,noauto,fscontext=system_u:object_r:removable_t,managed
|
1 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
Se debe debe desmontar (umount) y volver a montar (mount) el dispositivo o reiniciar el servidor (en el caso del directorio raíz - /)
Asignar permisos adicionales a los directorios.
Para asignación de permisos se emplea el comando: setfacl (set file access control list), el cual permite:
-
Asignar permisos básicos a: Usuario, Grupo, Otros (UGO). Equivalente a lo que hace el comando: chmod.
-
Asignar permisos por defecto (Para nuevos directorios/archivos).
-
Asignar permisos máximos (Mascaras).
-
Asignar permisos adicionales a grupos y usuarios.
Su sintaxis básica es:
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ... setfacl --restore=file
|
Los parámetros (opciones) básicos son:
Opción
|
Descripción
|
-R
|
Cambia permisos a archivos y directorios de forma descendente a partir de un directorio dado.
|
-d
|
Asigna los permisos por defecto.
|
-b
|
Borra todos los permisos adicionales, conservando únicamente los básicos de UGO.
|
-k
|
Borra los permisos por defecto.
|
-m
|
Modifica los permisos agregando/cambiando por los nuevos valores.
|
Ejemplos:
setfacl -b -k -R "/dir/sub dir"
Borra recursivamente (-R) todos los permisos adicionales (-b) y por defecto (-d), a partir de: "/dir/sub dir"
|
setfacl -R -d -m group:grupo1:rwx "/dir"
Asigna/modifica (-m) recursivamente (-R) permisos por defecto (-d) al grupo: "grupo1", como de: lectura, escritura, exploración/ejecución (rwx) a partir de: "/dir"
|
setfacl -m group:grupo2:rx "/dir/sub dir"
Asigna/modifica (-m) permisos de: lectura, exploración (rx) al grupo: "grupo2", en el directorio: "/dir/sub dir"
|
setfacl -m group::rx "/dir/sub dir"
Asigna/modifica (-m) permisos de: lectura, exploración (rx) al grupo base, en el directorio: "/dir/sub dir". Similar a: chmod g+rx-w "/dir/sub dir"
|
setfacl -m user:usuario1:rwx "/dir/sub dir/script.sh"
Asigna/modifica (-m) permisos de: lectura, escritura y ejecución (rwx) al usuario: "usuario1", para el archivo: "/dir/sub dir/script.sh"
|
Conocer permisos adicionales a los directorios.
Para conocer los permisos asignados a un directorio/archivo, se emplea el comando: getfacl (get file access control list).
Su sintaxis básica es:
getfacl [-dRLPvh] file ... getfacl [-dRLPvh] -
|
Los parámetros (opciones) básicos son:
Opción
|
Descripción
|
-R
|
Cambia permisos a archivos y directorios de forma descendente a partir de un directorio dado.
|
-d
|
Muestra los permisos por defecto.
|
El resultado de su ejecución incluye valores como estos:
[user@servidor ]# getfacl dir # file: dir # owner: usuario1 # group: grupo1 user::rwx user:usuario2:rwx group::rwx group:grupo2:r-x mask:r-x other:r-x default:user::rwx default:user:usuario2:rwx default:group::r-x default:mask:r-x default:other:---
|
(Comando)
Nombre del Archivo/Directorio
Propietario
Grupo
Permisos a Usuario (Propietario)
Permisos adicional asignado al Usuario: "usuario2"
Permisos a Grupo
Permisos adicional asignado al Grupo: "grupo2"
Mascara (Permisos máximos)
Permisos a Otros
Permisos por defecto a Usuario (Propietario)
Permisos por defecto al Usuario: "usuario2"
Permisos por defecto a Grupo
Mascara para permisos por defecto
Permisos por defecto a Otros
|
Ejemplo Practico.
La empresa X tiene centralizada la información en un servidor SAMBA corriendo bajo CentOS 4 (ext3), la cual es accesible desde la red interna tanto por estaciones Linux (smb://servidor/Empresa) como Windows (servidorEmpresa).
La información esta almacenada dentro del directorio: /share/Empresa y esta organizada en directorios que corresponden a sus diferentes Departamentos (D. Administrativo, D. Comercial, etc.)

Existe un grupo general (empresa) al que pertenecen todos los usuarios y grupos para cada uno de los departamentos (d_administrativo, d_comercial, etc.) y estos tienen asignados los diferentes usuarios (Pedro, Juan, Maria, etc.) según su labor, al departamento correspondiente.
Aplicaremos una política de seguridad sencilla:
-
Veamos los permisos actuales.
[ ]# getfacl -R /share/Empresa getfacl: Removing leading '/' from absolute path names # file: share/Empresa # owner: root # group: root user::r-x group::-wx other::r-x # file: share/Empresa/D.?40Comercial # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Contable # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Sistemas # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Administrativo # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Administrativo/Correspondencia # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Administrativo/Correspondencia/2006 # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Administrativo/Correspondencia/2007 # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Compras # owner: root # group: root user::rwx group::r-x other::r-x # file: share/Empresa/D.?40Producci303263n # owner: root # group: root user::rwx group::r-x other::r-x
|
-
Apliquemos las política de seguridad
-
Todo los empleados deben tener acceso a la carpeta/directorio de la Empresa (/share/Empresa), pero no pueden crear directorios/archivos adicionales.
[ ]# setfacl -m -d group:empresa:rx /share/Empresa [ ]# setfacl -m group:empresa:rx /share/Empresa
|
NOTA: Se asignan permisos adicionales y por defecto (-d), para garantizar que los nuevos directorios/documentos, hereden los permisos existentes (se conserve la política).
-
Cada usuarios debe tener acceso al departamento en el cual labora.
[ ]# setfacl -R -m -d group:d_administrativo:rwx "/share/Empresa/D. Administrativo" [ ]# setfacl -R -m group:d_administrativo:rwx "/share/Empresa/D. Administrativo" [ ]# setfacl -R -m -d group:d_comercial:rwx "/share/Empresa/D. Comercial" [ ]# setfacl -R -m group:d_comercial:rwx "/share/Empresa/D. Comercial" [ ]# setfacl -R -m -d group:d_compras:rwx "/share/Empresa/D. Compras" [ ]# setfacl -R -m group:d_compras:rwx "/share/Empresa/D. Compras" [ ]# setfacl -R -m -d group:d_contable:rwx "/share/Empresa/D. Contable" [ ]# setfacl -R -m group:d_contable:rwx "/share/Empresa/D. Contable" [ ]# setfacl -R -m -d group:d_produccion:rwx "/share/Empresa/D. Producción" [ ]# setfacl -R -m group:d_produccion:rwx "/share/Empresa/D. Producción" [ ]# setfacl -R -m -d group:d_sistemas:rwx "/share/Empresa/D. Sistemas" [ ]# setfacl -R -m group:d_sistemas:rwx "/share/Empresa/D. Sistemas"
|
NOTA: Por lo general se deben asignar los permisos a grupos de usuarios, así, si hay rotación del personal no se ven afectadas las políticas de seguridad.
-
Todos los empleados tienen acceso al Directorio de "Correspondencia" ubicado en el "D. Administrativo" (/share/Empresa/D. Administrativo/Correspondencia), podrán consultar la correspondencia de otros años (solo lectura), pero solo podrán guardar correspondencia en el directorio correspondiente al año actual (2007).
[ ]# setfacl -m group:empresa:rx "/share/Empresa/D. Administrativo" [ ]# setfacl -R -m -d group:empresa:rx "/share/Empresa/D. Administrativo/Correspondencia" [ ]# setfacl -R -m group:empresa:rx "/share/Empresa/D. Administrativo/Correspondencia"
|
NOTA: Se permite el acceso de todos los usuarios a: “D. Administrativo” y dentro de este a: “Correspondencia”
[ ]# setfacl -R -m mask::rx "/share/Empresa/D. Administrativo/Correspondencia"
|
NOTA: Se aplica la mascara (permisos máximos) de solo lectura a: “Correspondencia”
[ ]# setfacl -R -m -d group:empresa:rwx "/share/Empresa/D. Administrativo/Correspondencia/2007" [ ]# setfacl -R -m group:empresa:rwx "/share/Empresa/D. Administrativo/Correspondencia/2007" [ ]# setfacl -R -m mask::rwx "/share/Empresa/D. Administrativo/Correspondencia/2007"
|
NOTA: Se permite el acceso de Lectura/Escritura al año actual: “2007” y se cambia la mascara para este.
-
"Juan" como Gerente desea ver toda la información almacenada.
[ ]# setfacl -R -m -d user:juan:rx "/share/Empresa" [ ]# setfacl -R -m user:juan:rx "/share/Empresa"
|
NOTA: Como se menciono inicialmente, los permisos se deben aplicar a nivel de grupo, en este caso se debería emplear un grupo “gerencia”, así, si hay un cambio de gerente, basta con asignar el nuevo gerente al grupo “gerencia” sin alterar las políticas de seguridad.
-
Las personas del "D. Sistemas", esta construyendo una base de datos con la información de clientes (Clientes.xls) existente en el "D. Comercial".
[ ]# setfacl -m group:d_sistemas:rx "/share/Empresa/D. Comercial"
|
NOTA: Se permite el acceso del grupo: “d_sistemas” a: “D. Comercial”
[ ]# setfacl -m group:d_sistemas:rwx "/share/Empresa/D. Comercial/Clientes.xls"
|
NOTA: Por facilidad de administración, los permisos se deben asignar a nivel de directorios, no de archivos individuales.
-
Veamos el Resultado.
-
[ ]# getfacl -R /share/Empresa
getfacl: Removing leading '/' from absolute path names
# file: share/Empresa
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:empresa:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:empresa:r-x
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Comercial
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:d_comercial:rwx
group:d_sistemas:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:d_comercial:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Comercial/Clientes.xls
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:d_comercial:rwx
group:d_sistemas:rwx
mask::rwx
other::---
# file: share/Empresa/D.?40Contable
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:d_contable:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:d_contable:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Sistemas
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:d_sistemas:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:d_sistemas:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Administrativo
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:empresa:r-x
group:d_administrativo:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:d_administrativo:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Administrativo/Correspondencia
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:empresa:r-x
group:d_administrativo:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:empresa:r-x
default:group:d_administrativo:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Administrativo/Correspondencia/2006
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:empresa:r-x
group:d_administrativo:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:empresa:r-x
default:group:d_administrativo:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Administrativo/Correspondencia/2007
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:empresa:rwx
group:d_administrativo:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:empresa:rwx
default:group:d_administrativo:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Compras
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:d_compras:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:d_compras:rwx
default:mask::rwx
default:other::r-x
# file: share/Empresa/D.?40Producci303263n
# owner: root
# group: root
user::rwx
user:juan:r-x
group::rwx
group:d_produccion:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:juan:r-x
default:group::rwx
default:group:d_produccion:rwx
default:mask::rwx
default:other::r-x
|
Como vimos en el ejemplo, en muchos casos debemos asignar los permisos por defecto iguales a los permisos efectivos, para que cada nuevo directorio/archivo asuma estos permisos. por lo que para facilitar un poco las cosas he creado este script: setACL.sh:
# Script: setACL.sh # Autor: JohnToro # Desc.: Asigna permisos ACL's por defecto y efectivos if [ $# -ge 4 ] then setfacl $1 -d $2 $3 "$4" setfacl $1 $2 $3 "$4" else if [ $# -ge 3 ] then setfacl -d $1 $2 "$3" setfacl $1 $2 "$3" else echo "Parametros insuficientes." echo "Uso: setACL -m [-R] <derecho> <directorio>" fi fi
|
Y para facilitar aun mas las cosas se puede crear otro script, donde registramos todos los permisos asignados (política de seguridad), el cual he llamado: setEmpACL.sh.
# Script: setEmpACL.sh # Autor: JohnToro # Desc.: Asigna los ACL's al directorio de datos de la Empresa # Nota: -c = Limpia la definicion Previa if [ $# -ge 1 ] then if [ $1 = -c ] then echo Borrando definicion previa... setfacl -b -k -R "/share/Empresa" else echo "Parametros incorrectos." echo "Modo de Empleo: setEmpACL [-c]" echo " -c: Borra los ACL's definidos previamente" fi fi echo Aplicando politicas de Seguridad echo
# Asigna derechos Generales echo Permisos Generales Empresa... setfacl -R -m user::rwx "/share/Empresa" setfacl -R -m group::rwx "/share/Empresa" ./setACL.sh -m group:empresa:rx "/share/Empresa" ./setACL.sh -R -m user:juan:rx "/share/Empresa"
# Asigna derechos a cada Departamento echo D. Administrativo... ./setACL.sh -R -m group:d_administrativo:rwx "/share/Empresa/D. Administrativo" setfacl -R -m mask::rx "/share/Empresa/D. Administrativo/Correspondencia"
./setACL.sh -m group:empresa:rx "/share/Empresa/D. Administrativo" ./setACL.sh -R -m group:empresa:rx "/share/Empresa/D. Administrativo/Correspondencia" ./setACL.sh -R -m group:empresa:rwx "/share/Empresa/D. Administrativo/Correspondencia/2007" setfacl -R -m mask::rwx "/share/Empresa/D. Administrativo/Correspondencia/2007"
echo D. Comercial... ./setACL.sh -R -m group:d_comercial:rwx "/share/Empresa/D. Comercial"
./setACL.sh -m group:d_sistemas:rx "/share/Empresa/D. Comercial" ./setACL.sh -m group:d_sistemas:rx "/share/Empresa/D. Comercial/Clientes.xls"
echo D. Compras... ./setACL.sh -R -m group:d_compras:rwx "/share/Empresa/D. Compras"
echo D. Contable... ./setACL.sh -R -m group:d_contable:rwx "/share/Empresa/D. Contable"
echo D. Produccion... ./setACL.sh -R -m group:d_produccion:rwx "/share/Empresa/D. Producción"
echo D. Sistemas... ./setACL.sh -R -m group:d_sistemas:rwx "/share/Empresa/D. Sistemas"
# echo Otros... (Ejemplos) # ./setACL.sh -R -m group:empresa:rx "/var/www/crm/img" # ./setACL.sh -R -m group:d_produccion:rwx "/var/www/intranet/produccion" # ./setACL.sh -R -m group:d_administrativo:rwx "/var/www/intranet/administrativo"
|