333.2 Control de Acceso Obligatorio (MAC)

Introduccion

El Control de Acceso Obligatorio (MAC) es un modelo de seguridad donde las politicas de acceso son definidas por el administrador del sistema y no pueden ser modificadas por los usuarios individuales. A diferencia de DAC, en MAC ni siquiera root puede eludir las politicas establecidas. Linux implementa MAC mediante SELinux y AppArmor.

Para el examen: Este subtema tiene peso 4. Necesitas conocer tanto SELinux como AppArmor en profundidad: modos, comandos de gestion, contextos de seguridad, booleanos y creacion de perfiles.


DAC vs MAC

CaracteristicaDACMAC
Quien define accesoPropietario del recursoPolitica del sistema
Root puede eludirSiNo
GranularidadArchivo/directorioProcesos, archivos, puertos, etc.
ComplejidadBajaAlta
Ejemplochmod, ACLs POSIXSELinux, AppArmor
Proteccion contra root comprometidoNoSi

SELinux (Security-Enhanced Linux)

SELinux fue desarrollado por la NSA y es el sistema MAC por defecto en distribuciones Red Hat/CentOS/Fedora.

Modos de SELinux

ModoDescripcion
EnforcingAplica la politica y deniega accesos no permitidos
PermissiveNo aplica pero registra las violaciones (para depuracion)
DisabledSELinux completamente desactivado
# Ver modo actual
getenforce
# Enforcing
 
# Ver estado detallado
sestatus
# SELinux status:          enabled
# SELinuxfs mount:         /sys/fs/selinux
# Current mode:            enforcing
# Policy from config file: targeted
 
# Cambiar modo temporalmente
setenforce 0    # Permissive
setenforce 1    # Enforcing
 
# Cambiar modo permanentemente
# /etc/selinux/config
SELINUX=enforcing    # enforcing | permissive | disabled
SELINUXTYPE=targeted

Para el examen: Cambiar entre enforcing y permissive no requiere reinicio. Cambiar a/desde disabled SI requiere reinicio y reetiquetado del sistema de archivos.

Contextos de Seguridad

Todo en SELinux tiene un contexto de seguridad con el formato: usuario:rol:tipo:nivel

# Ver contexto de archivos
ls -Z /var/www/html/
# -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
 
# Ver contexto de procesos
ps auxZ | grep httpd
# system_u:system_r:httpd_t:s0   root  ... /usr/sbin/httpd
 
# Ver contexto del usuario actual
id -Z
# unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
ComponenteDescripcionEjemplo
Usuario SELinuxIdentidad SELinuxsystem_u, unconfined_u
RolDetermina que tipos puede usarsystem_r, object_r
TipoPrincipal mecanismo de controlhttpd_t, httpd_sys_content_t
NivelMLS/MCS (Multi-Level Security)s0, s0:c0.c1023

Politica “targeted”

La politica targeted confina procesos especificos (httpd, named, etc.) mientras los demas se ejecutan en dominio “unconfined” (sin restricciones MAC).

Gestion de Contextos de Archivos

# Restaurar contexto por defecto de un archivo
restorecon -v /var/www/html/index.html
 
# Restaurar recursivamente
restorecon -Rv /var/www/html/
 
# Cambiar contexto temporalmente
chcon -t httpd_sys_content_t /datos/web/archivo.html
 
# Cambiar contexto permanentemente (sobrevive relabeling)
semanage fcontext -a -t httpd_sys_content_t "/datos/web(/.*)?"
restorecon -Rv /datos/web/
 
# Listar reglas de contexto de archivos
semanage fcontext -l | grep /var/www
 
# Eliminar regla de contexto personalizada
semanage fcontext -d "/datos/web(/.*)?"

Para el examen: chcon cambia contextos temporalmente (se pierden con restorecon o relabeling). semanage fcontext + restorecon es la forma correcta y permanente.

Booleanos de SELinux

Los booleanos permiten ajustar la politica sin recompilarla.

# Listar todos los booleanos
getsebool -a
 
# Ver valor de un booleano
getsebool httpd_can_network_connect
# httpd_can_network_connect --> off
 
# Cambiar booleano temporalmente
setsebool httpd_can_network_connect on
 
# Cambiar booleano permanentemente
setsebool -P httpd_can_network_connect on
 
# Listar booleanos con descripcion
semanage boolean -l | grep httpd

Booleanos comunes:

BooleanoDescripcion
httpd_can_network_connectPermitir a Apache conexiones de red
httpd_enable_homedirsPermitir acceso a directorios home
ftpd_anon_writePermitir escritura FTP anonima
samba_enable_home_dirsSamba puede acceder a homes
ssh_sysadm_loginLogin SSH con rol sysadm

Gestion de Puertos

# Listar puertos permitidos para un tipo
semanage port -l | grep http
# http_port_t    tcp   80, 443, 488, 8008, 8009, 8443
 
# Añadir puerto personalizado
semanage port -a -t http_port_t -p tcp 8080
 
# Modificar asignacion existente
semanage port -m -t http_port_t -p tcp 8080
 
# Eliminar asignacion personalizada
semanage port -d -t http_port_t -p tcp 8080

Diagnostico y Solucion de Problemas

# Ver denegaciones en el log de auditoria
ausearch -m AVC -ts recent
 
# Herramienta de analisis de alertas SELinux
sealert -a /var/log/audit/audit.log
 
# Generar modulo de politica a partir de denegaciones
audit2allow -a         # Muestra las reglas necesarias
audit2allow -a -M mi_modulo  # Genera modulo compilado
 
# Instalar modulo de politica
semodule -i mi_modulo.pp
 
# Listar modulos instalados
semodule -l
 
# Ver logs de SELinux
journalctl -t setroubleshoot
# Flujo tipico de solucion de problemas:
# 1. Verificar modo
getenforce
# 2. Buscar denegaciones
ausearch -m AVC -ts recent
# 3. Analizar con sealert
sealert -a /var/log/audit/audit.log
# 4. Probar en modo permissive si es necesario
setenforce 0
# 5. Aplicar solucion (contexto, booleano, o modulo)
# 6. Volver a enforcing
setenforce 1

AppArmor

AppArmor es el sistema MAC por defecto en distribuciones Debian/Ubuntu y SUSE. Utiliza perfiles basados en rutas de archivos (no etiquetas como SELinux).

Modos de Perfiles

ModoDescripcion
EnforceAplica el perfil y bloquea accesos no permitidos
ComplainNo bloquea pero registra violaciones (para depuracion)
UnconfinedSin restricciones (perfil no cargado)

Comandos Basicos

# Ver estado de AppArmor
aa-status
# o
apparmor_status
 
# Salida muestra:
# - Perfiles cargados
# - Perfiles en modo enforce
# - Perfiles en modo complain
# - Procesos confinados
 
# Poner perfil en modo enforce
aa-enforce /etc/apparmor.d/usr.sbin.apache2
# o por nombre del ejecutable
aa-enforce /usr/sbin/apache2
 
# Poner perfil en modo complain
aa-complain /etc/apparmor.d/usr.sbin.apache2
 
# Deshabilitar perfil
aa-disable /etc/apparmor.d/usr.sbin.apache2
 
# Recargar perfil
apparmor_parser -r /etc/apparmor.d/usr.sbin.apache2
 
# Cargar perfil nuevo
apparmor_parser /etc/apparmor.d/usr.sbin.mi_app
 
# Eliminar perfil cargado
apparmor_parser -R /etc/apparmor.d/usr.sbin.mi_app

Estructura de Perfiles

Los perfiles se almacenan en /etc/apparmor.d/ con nombres basados en la ruta del ejecutable (reemplazando / por .).

# Ejemplo: /etc/apparmor.d/usr.sbin.apache2
 
#include <tunables/global>
 
/usr/sbin/apache2 {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/apache2-common>
 
  capability net_bind_service,
  capability setuid,
  capability setgid,
 
  /var/www/html/** r,          # Lectura de contenido web
  /var/log/apache2/*.log w,    # Escritura de logs
  /etc/apache2/** r,           # Lectura de configuracion
  /run/apache2/*.pid rw,       # PID file
  /tmp/** rw,                  # Acceso temporal
 
  # Red
  network inet stream,
  network inet6 stream,
 
  # Denegacion explicita
  deny /etc/shadow r,
}

Permisos en Perfiles

PermisoDescripcion
rLectura
wEscritura
aAppend (solo añadir)
kLock de archivos
lLink
mmmap con PROT_EXEC
xEjecucion
ixHereda el perfil actual
pxTransicion a perfil del ejecutable
uxEjecutar sin confinamiento
Pxpx con limpieza de entorno
Uxux con limpieza de entorno

Creacion de Perfiles

# Generar perfil interactivamente
aa-genprof /usr/sbin/mi_aplicacion
# 1. Inicia escaneo de logs
# 2. Ejecutar la aplicacion en otra terminal
# 3. Volver y seleccionar acciones para cada acceso
 
# Actualizar perfil existente basado en logs
aa-logprof
 
# Generar perfil basico automaticamente
aa-autodep /usr/sbin/mi_aplicacion

Flujo de Creacion de Perfil

# 1. Generar perfil basico
aa-autodep /usr/sbin/mi_app
 
# 2. Poner en modo complain
aa-complain /usr/sbin/mi_app
 
# 3. Ejercitar la aplicacion (todas sus funcionalidades)
 
# 4. Analizar logs y ajustar perfil
aa-logprof
 
# 5. Pasar a modo enforce
aa-enforce /usr/sbin/mi_app
 
# 6. Monitorear y ajustar si es necesario

Para el examen: Conoce el flujo completo: aa-genprof o aa-autodep para crear, aa-complain para depurar, aa-logprof para ajustar, aa-enforce para activar.

Abstracciones y Tunables

# Abstracciones: conjuntos predefinidos de permisos comunes
/etc/apparmor.d/abstractions/
# - base          : accesos basicos del sistema
# - nameservice   : resolucion de nombres
# - authentication: acceso a archivos de autenticacion
# - apache2-common: permisos comunes de Apache
 
# Tunables: variables globales
/etc/apparmor.d/tunables/
# - global : incluye todas las variables
# - home   : define @{HOME}

Comparacion SELinux vs AppArmor

CaracteristicaSELinuxAppArmor
Modelo de etiquetadoEtiquetas en inodosBasado en rutas
ComplejidadAltaMedia
Distribucion por defectoRHEL/CentOS/FedoraDebian/Ubuntu/SUSE
Politica basetargeted, mls, minimumPerfiles individuales
GranularidadMuy altaAlta
Control de redSi (puertos, protocolos)Limitado
ReetiquetadoNecesario tras cambiosNo necesario
Herramientas de diagnosticoaudit2allow, sealertaa-logprof
Curva de aprendizajePronunciadaModerada
Proteccion rename/hardlinkSi (etiquetas en inodo)No (basado en ruta)

Trampas del examen

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

  • SELinux enforcing vs permissivepermissive registra violaciones pero NO las bloquea; enforcing registra Y bloquea. Cambiar entre ambos con setenforce NO requiere reinicio. Pero pasar de disabled a enforcing SI requiere reinicio y relabeling completo (touch /.autorelabel + reboot o fixfiles relabel)
  • chcon vs semanage fcontext + restoreconchcon cambia contextos temporalmente (se pierden con restorecon o relabeling); semanage fcontext -a + restorecon es la forma correcta y permanente. El examen penaliza responder chcon cuando se pide un cambio persistente
  • setsebool vs setsebool -P — sin -P, el cambio es temporal (se pierde al reiniciar); con -P, el cambio es permanente (se escribe en la politica). Olvidar -P es uno de los errores mas comunes en el examen
  • audit2allow genera modulos, no los instalaaudit2allow -a -M modulo genera el archivo .pp, pero hay que instalarlo manualmente con semodule -i modulo.pp. Son dos pasos separados que el examen puede evaluar individualmente
  • AppArmor: enforce vs complain — equivalente a enforcing vs permissive de SELinux, pero a nivel de perfil individual (no global). aa-enforce activa el bloqueo; aa-complain solo registra. Un perfil puede estar en complain mientras otros estan en enforce
  • SELinux basado en etiquetas vs AppArmor basado en rutas — SELinux asocia contextos a inodos (persisten tras rename/move); AppArmor usa rutas del sistema de archivos (si se renombra un archivo, puede escapar del perfil). Esta diferencia es fundamental y aparece frecuentemente en el examen
  • restorecon vs relabelrestorecon restaura el contexto de archivos individuales/directorios especificos; un relabeling completo (/.autorelabel + reboot) restaura contextos de TODO el sistema de archivos. Usar relabeling completo cuando solo se necesita restorecon -Rv /ruta es ineficiente
  • AppArmor ix vs px vs uxix hereda el perfil actual; px transiciona al perfil del ejecutable llamado; ux ejecuta sin confinamiento. Px y Ux (mayusculas) limpian variables de entorno. Confundir estos modos de ejecucion puede crear brechas de seguridad
  • semanage port -a vs semanage port -m-a (add) añade un puerto nuevo a un tipo; -m (modify) cambia la asignacion de un puerto que ya esta asignado a otro tipo. Si el puerto ya pertenece a otro tipo, -a falla y se debe usar -m
  • DAC se evalua ANTES que MAC — el kernel evalua primero los permisos DAC (rwx, ACLs) y luego MAC (SELinux/AppArmor). Si DAC deniega, MAC ni siquiera se consulta. Por tanto, una denegacion puede ser DAC y no MAC, y ausearch -m AVC no mostrara nada. Siempre verificar ambas capas