333.1 Control de Acceso Discrecional (DAC)

Introduccion

El Control de Acceso Discrecional (DAC) es el modelo de seguridad tradicional de Unix donde el propietario de un recurso decide quien puede acceder a el. Incluye permisos rwx, bits especiales (SUID, SGID, sticky), umask, ACLs POSIX y atributos extendidos.

Para el examen: Domina los permisos especiales (SUID/SGID/sticky), las ACLs POSIX (getfacl/setfacl) incluyendo ACLs por defecto y mascara, y los atributos extendidos con chattr.


Permisos Tradicionales Unix

Permisos Basicos (rwx)

PermisoArchivoDirectorio
r (4)Leer contenidoListar contenido
w (2)Modificar contenidoCrear/eliminar archivos
x (1)EjecutarAcceder (cd) al directorio
# Ver permisos
ls -la archivo.txt
# -rw-r--r-- 1 usuario grupo 1024 Jan 15 10:00 archivo.txt
 
# Cambiar permisos (octal)
chmod 750 archivo.sh    # rwxr-x---
 
# Cambiar permisos (simbolico)
chmod u+x,g-w,o= archivo.sh
 
# Cambiar propietario
chown usuario:grupo archivo.txt
 
# Cambiar solo grupo
chgrp nuevo_grupo archivo.txt
 
# Recursivo
chmod -R 750 /var/www/
chown -R www-data:www-data /var/www/

Bits Especiales

SUID (Set User ID) - 4000

Cuando se establece en un ejecutable, el proceso se ejecuta con los permisos del propietario del archivo, no del usuario que lo ejecuta.

# Establecer SUID
chmod u+s archivo
chmod 4755 archivo
 
# Ejemplo: passwd tiene SUID para modificar /etc/shadow
ls -la /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
 
# Buscar archivos con SUID
find / -perm -4000 -type f 2>/dev/null

SGID (Set Group ID) - 2000

En ejecutables: el proceso hereda el grupo del archivo. En directorios: los nuevos archivos heredan el grupo del directorio.

# Establecer SGID
chmod g+s directorio/
chmod 2770 directorio/
 
# Ejemplo: directorio compartido
mkdir /datos/proyecto
chgrp equipo /datos/proyecto
chmod 2770 /datos/proyecto
# Todos los archivos nuevos tendran grupo "equipo"
 
# Buscar directorios con SGID
find / -perm -2000 -type d 2>/dev/null

Sticky Bit - 1000

En directorios: solo el propietario del archivo (o root) puede eliminarlo, aunque otros tengan permiso de escritura en el directorio.

# Establecer sticky bit
chmod +t directorio/
chmod 1777 directorio/
 
# Ejemplo clasico: /tmp
ls -ld /tmp
# drwxrwxrwt 15 root root ... /tmp
 
# Buscar directorios con sticky bit
find / -perm -1000 -type d 2>/dev/null

Para el examen: SUID en archivos ejecutables es un riesgo de seguridad potencial. Audita regularmente archivos con SUID/SGID. SUID no funciona en scripts interpretados por seguridad.


umask

La umask define los permisos que se eliminan al crear nuevos archivos y directorios.

# Ver umask actual
umask          # Formato octal (ej: 0022)
umask -S       # Formato simbolico (ej: u=rwx,g=rx,o=rx)
 
# Establecer umask
umask 0027     # Archivos: 640, Directorios: 750
 
# Calcular permisos resultantes:
# Archivos: 666 - umask = permisos
# Directorios: 777 - umask = permisos
 
# Ejemplo con umask 0022:
# Archivos:    666 - 022 = 644 (rw-r--r--)
# Directorios: 777 - 022 = 755 (rwxr-xr-x)
 
# Ejemplo con umask 0077:
# Archivos:    666 - 077 = 600 (rw-------)
# Directorios: 777 - 077 = 700 (rwx------)
umaskArchivosDirectoriosUso
0022644755Por defecto
0027640750Restrictivo
0077600700Muy restrictivo
0002664775Colaborativo

Configuracion persistente:

# Para todos los usuarios: /etc/profile o /etc/bashrc
umask 0027
 
# Para un usuario: ~/.bashrc
umask 0077
 
# Para PAM: /etc/pam.d/common-session
session optional pam_umask.so umask=0027

ACLs POSIX (Listas de Control de Acceso)

Las ACLs POSIX extienden el modelo de permisos tradicional permitiendo definir permisos para usuarios y grupos adicionales.

Requisitos

# El sistema de archivos debe montarse con soporte ACL
mount -o acl /dev/sda1 /datos
# O en /etc/fstab:
/dev/sda1  /datos  ext4  defaults,acl  0  2
 
# Nota: ext4 y xfs soportan ACLs por defecto

Comandos Basicos

# Ver ACLs de un archivo
getfacl archivo.txt
 
# Salida ejemplo:
# file: archivo.txt
# owner: maria
# group: equipo
# user::rw-
# user:juan:rw-
# group::r--
# group:auditores:r--
# mask::rw-
# other::---
 
# Establecer ACL para un usuario
setfacl -m u:juan:rw archivo.txt
 
# Establecer ACL para un grupo
setfacl -m g:auditores:r archivo.txt
 
# Eliminar ACL de un usuario
setfacl -x u:juan archivo.txt
 
# Eliminar todas las ACLs
setfacl -b archivo.txt
 
# Copiar ACLs de un archivo a otro
getfacl archivo1.txt | setfacl --set-file=- archivo2.txt

ACLs por Defecto (Default ACLs)

Las ACLs por defecto se aplican a directorios y se heredan automaticamente por los nuevos archivos y subdirectorios creados dentro.

# Establecer ACL por defecto en directorio
setfacl -d -m u:juan:rwx /datos/proyecto/
setfacl -d -m g:equipo:rx /datos/proyecto/
 
# Ver ACLs por defecto
getfacl /datos/proyecto/
# default:user::rwx
# default:user:juan:rwx
# default:group::r-x
# default:group:equipo:r-x
# default:mask::rwx
# default:other::---
 
# Eliminar ACLs por defecto
setfacl -k /datos/proyecto/

La Mascara (mask)

La mascara establece los permisos maximos efectivos para usuarios y grupos adicionales (no el propietario ni “otros”).

# Establecer mascara
setfacl -m m::rx archivo.txt
 
# Permisos efectivos:
# Si un usuario tiene ACL rw- pero la mascara es r-x
# Los permisos efectivos son r-- (interseccion)
Entrada ACLAfectada por mask
user:: (propietario)No
user:nombre:Si
group:: (grupo propietario)Si
group:nombre:Si
mask::N/A (es la mascara)
other::No

Para el examen: chmod en un archivo con ACLs modifica la mascara, no los permisos del grupo propietario. Un + al final de ls -l indica presencia de ACLs.

Opciones Avanzadas de setfacl

# Aplicar recursivamente
setfacl -R -m u:juan:rx /datos/
 
# Establecer ACLs desde archivo
setfacl --restore=backup_acls.txt
 
# Backup de ACLs
getfacl -R /datos/ > backup_acls.txt
 
# Modificar multiples entradas a la vez
setfacl -m u:juan:rwx,g:equipo:rx,o::- archivo.txt

Atributos Extendidos (Extended Attributes)

xattr con getfattr / setfattr

Los atributos extendidos permiten almacenar metadatos adicionales en archivos.

# Establecer atributo
setfattr -n user.descripcion -v "Datos confidenciales" archivo.txt
 
# Ver atributos
getfattr archivo.txt
getfattr -n user.descripcion archivo.txt
 
# Listar todos los atributos con valores
getfattr -d archivo.txt
 
# Eliminar atributo
setfattr -x user.descripcion archivo.txt

chattr - Atributos de Sistema de Archivos

chattr modifica atributos especiales del sistema de archivos (ext2/ext3/ext4).

# Hacer archivo inmutable (ni root puede modificarlo)
chattr +i archivo.txt
 
# Quitar inmutabilidad
chattr -i archivo.txt
 
# Solo permitir añadir contenido (append-only)
chattr +a archivo.log
 
# Ver atributos
lsattr archivo.txt
# ----i--------e-- archivo.txt
 
# Aplicar recursivamente
chattr -R +i /etc/configuracion/
AtributoLetraDescripcion
ImmutableiNo se puede modificar, eliminar, renombrar ni enlazar
Append-onlyaSolo se puede añadir contenido (ideal para logs)
No dumpdExcluido de backups con dump
Secure deletionsLos bloques se sobreescriben al eliminar
UndeletableuEl contenido se guarda al eliminar (permite recuperar)
No atimeANo actualizar tiempo de acceso
SynchronousSEscrituras sincronas

Para el examen: chattr +i hace un archivo completamente inmutable: ni siquiera root puede modificarlo o eliminarlo sin quitar primero el atributo. Esto es muy util para proteger archivos criticos como /etc/passwd.


Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • SUID en directorios no tiene efecto — SUID (4000) solo funciona en archivos ejecutables binarios. En scripts interpretados (bash, python) se ignora por seguridad. SGID en directorios si tiene efecto (herencia de grupo). Nunca confundir los tres bits especiales y donde aplican
  • SGID en directorios vs archivos — en ejecutables, SGID hace que el proceso herede el grupo del archivo; en directorios, los nuevos archivos heredan el grupo del directorio (no del creador). Esta distincion es critica para directorios compartidos
  • Sticky bit solo en directorios — el sticky bit (1000) en directorios impide que usuarios borren archivos de otros (ejemplo clasico: /tmp). En archivos modernos no tiene efecto practico. Si se ve t en el bit de ejecucion de otros (drwxrwxrwt), es sticky bit
  • chmod modifica la mascara ACL, no el grupo — en un archivo con ACLs POSIX, ejecutar chmod g=rx modifica la mascara (mask), no los permisos del grupo propietario directamente. Esto afecta los permisos efectivos de todos los usuarios y grupos adicionales en las ACLs
  • ACL mask y permisos efectivos — la mask limita los permisos maximos de usuario nombrado, grupo propietario y grupo nombrado. Los permisos del propietario (user::) y otros (other::) NO se ven afectados por la mask. Los permisos efectivos son la interseccion de la ACL con la mask
  • + en ls -l indica ACLs — si aparece un + al final de los permisos (ej: -rw-r--r--+), el archivo tiene ACLs extendidas. Sin el +, solo tiene permisos tradicionales. Un . indica contexto SELinux pero sin ACLs
  • ACLs por defecto solo en directorios — las default ACLs (setfacl -d -m) solo se aplican a directorios y se heredan por archivos y subdirectorios nuevos creados dentro. No se pueden establecer default ACLs en archivos regulares
  • chattr +i vs chattr +a+i (immutable) impide cualquier modificacion, eliminacion, renombramiento o enlace, incluso para root; +a (append-only) permite añadir contenido pero no modificar ni eliminar (ideal para logs). El examen puede presentar escenarios donde root no puede borrar un archivo, y la causa es +i
  • umask no es una resta aritmetica exacta — aunque se suele decir “666 - umask” para archivos, tecnicamente es una operacion AND NOT a nivel de bits. Con umask 0033, los archivos obtienen 644 (no 633). Para el examen, la simplificacion funciona en la mayoria de casos pero conoce la excepcion
  • setfacl -b vs setfacl -k-b elimina TODAS las ACLs (incluidas las por defecto); -k elimina solo las ACLs por defecto del directorio, manteniendo las ACLs de acceso. Confundir ambos puede dejar archivos sin las ACLs heredadas esperadas