Skip to content

333.2 Mandatory Access Control

Weight 5

Description Candidates should be familiar with mandatory access control (MAC) systems for Linux. Specifically, candidates should have a thorough knowledge of SELinux. Also, candidates should be aware of other mandatory access control systems for Linux. This includes major features of these systems but not configuration and use.

Key Knowledge Areas:

Understand the concepts of type enforcement, role based access control, mandatory access control and discretionary access control
Configure, manage and use SELinux
Awareness of AppArmor and Smack

Partial list of the used files, terms and utilities:

getenforce
setenforce
selinuxenabled
getsebool
setsebool
togglesebool
fixfiles
restorecon
setfiles
newrole
setcon
runcon
chcon
semanage
sestatus
seinfo
apol
seaudit
audit2why
audit2allow
/etc/selinux/*

Selinux

Security-Enhanced Linux (SELinux) es una arquitectura de seguridad para los sistemas Linux® que otorga a los administradores mayor control sobre quién puede acceder al sistema.

Entender Selinux

Los sistemas Linux y UNIX siempre han utilizado los controles DAC. SELinux es un ejemplo de un control MAC para Linux.

Con el DAC, los archivos y los procesos tienen propietarios, que pueden ser usuarios, grupos o cualquier persona. Los usuarios pueden cambiar los permisos de sus propios archivos.

Sin embargo, en los sistemas MAC, como SELinux, hay una política de acceso establecida a nivel administrativo. Incluso si se modifica la configuración de DAC en el directorio principal, la política establecida de SELinux protegerá el sistema e impedirá que otro usuario o proceso acceda al directorio.

Funcionamiento de SELinux

SELinux define los controles de acceso para las aplicaciones, los procesos y los archivos dentro de un sistema. Utiliza políticas de seguridad, que consisten en un conjunto de reglas para indicar a SELinux a qué elementos se puede acceder.

Cuando una aplicación o un proceso (conocidos como sujetos) solicitan acceso a algún objeto, como un archivo, SELinux consulta la caché de vector de acceso (AVC), donde se almacenan los permisos de los objetos y los sujetos.

Si SELinux no puede determinar el acceso en función de los permisos almacenados en la caché, envía la solicitud al servidor de seguridad, que analiza el contexto de seguridad de la aplicación o del proceso y del archivo. El contexto de seguridad se aplica desde la base de datos de políticas de SELinux. Luego, se otorga o se niega el permiso.

En caso de que sea denegado, aparecerá el mensaje avc: denied en /var/log/messages.

Configuración de SELinux

Hay muchas formas de configurar SELinux para proteger el sistema. Las más comunes son la política específica o la seguridad de varios niveles (MLS).

La primera es la opción predeterminada e incluye varios procesos, tareas y servicios. En cambio, la MLS puede ser muy compleja, y solo las organizaciones gubernamentales suelen utilizarla.

Archivo de configuracion: /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Etiquetado y tipo de restricción de SELinux

El tipo enforcing y el etiquetado son los conceptos más importantes de SELinux.

El formato de las etiquetas es user:role:type:level (el nivel es opcional). El usuario, el role y el nivel se utilizan en las implementaciones más avanzadas de SELinux, como la MLS. El tipo de etiqueta es el aspecto más importante de las políticas específicas.

Las políticas de SELinux definen si un proceso que se ejecuta con cierto tipo de restricción puede acceder a un archivo que tiene una etiqueta determinada.

Habilitación de SELinux

Para habilitar SELinux en su entorno, edite /etc/selinux/config y establezca el ajuste SELINUX=permissive. Dado que SELinux estaba deshabilitado, no es conveniente configurarlo como impositivo de inmediato, ya que es probable que haya elementos mal etiquetados en el sistema que podrían impedir su arranque.

Para volver a etiquetar el sistema de archivos automáticamente, cree un archivo vacío con el nombre .autorelabel en el directorio raíz y reinicie el sistema.

Una vez que se hayan vuelto a etiquetar todos los elementos, configure el modo de SELinux como enforcing con /etc/selinux/config y reinicie el sistema, o ejecute el comando setenforce 1.

En distribuciones Debian selinux-activate automatiza todas estas operaciones y fuerza el etiquetado de archivos en el siguiente reinicio

Booleanos

Los booleanos son ajustes que permiten activar o desactivar las funciones de SELinux. Hay cientos de ellos, y muchos ya vienen definidos.

Contexto

Un contexto está formado por al menos tres valores, en ocasiones cuatro. El contexto de un servidor web Apache es el siguiente:

$ ps -eZ | grep httpd
system_u:system_r:httpd_t:s0  511  ?   00:00:00 httpd

Como se puede observar, el proceso tiene un contexto formado por los siguientes campos:

  • system_u: Representa al usuario SELinux
  • system_r: Representa el rol SELinux
  • httpd_t: Representa el tipo SELinux (también conocido como el dominio de ser un proceso)
  • s0: Representa el nivel de sensibilidad
Tipo

El dominio de un proceso (el tercer campo del contexto SELinux) es la base del control de acceso detallado de un proceso respecto de si mismo y de otros tipos.

Roles

Los roles de SELinux definen los tipos (dominios) con los que se permite a un proceso ser ejecutado. Los tipos definen los permisos, por lo que, un rol SELinux define lo que un usuario puede hacer o no, al tener acceso a uno o varios roles.

rol descripcion
user_r A este rol sólo le está permitido el uso de procesos relacionados con aplicaciones de usuario final. Privilegios, como el cambio de usuario, no están permitidos para este rol.
staff_r Es similar al anterior, pero está permitida la capacidad de cambio de rol. Está relacionado con aquellas operaciones que no son críticas para el sistema, y se suele asignar a operadores.
sysadm_r Este rol dispone de privilegios que permiten la ejecución de tareas administrativas del sistema.
secadm_r Este rol tiene la capacidad de modificar la política SELinux y gestionar los controles SELinux.
system_r Los procesos en segundo plano y los daemons tienen este rol.
unconfined_r Está asociado a usuarios finales. Desde este rol se pueden usar diferentes tipos, los cuales tendrán más o menos privilegios dependiendo de las reglas que se le apliquen en cada caso.
seinfo --role
Usuarios

Un usuario SELinux es diferente a un usuario de Linux. SELinux se asegura de que se aplican los controles de acceso oportunos, aún cuando haya conseguido mayores privilegios en el sistema.

La característica más importante de los usuarios SELinux, es la restricción de uso de los diferentes roles. Una vez que a un usuario Linux se le asigna un usuario SELinux, no le será posible el uso de un rol que no le pertenezca.

# ver roles asignados a cada user
semanage user -l

Manejar Selinux

Estado por defecto:

[root@centos1 vagrant]# getenforce 
Enforcing

Canviar temporalmente:

[root@centos1 vagrant]# setenforce 
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]

Info del estado:

[root@centos1 vagrant]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

Manejo de contexto con semanage

Associar un usuario unix a selinux

semanage login -a -s user_u usuario
semanage login -d usuario # eliminar asociacion

Usuarios de selinux

[root@centos1 ~]# semanage user -l

                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range                      SELinux Roles

guest_u         user       s0         s0                             guest_r
root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
...

Assignar roles y etiqueta a usuario

# semanage user -a -R roles -P prefijo identidad
semanage user -a -R 'staff_r user_r' -P staff test_u
semanage user -l
test_u          staff      s0         s0                             staff_r user_r

Dessasociar identidad

# semanage user -d identidad
semanage user -d test_u

Cambiar etiqueta a un directorio

[root@centos1 ~]# ls -dZ /web/
unconfined_u:object_r:admin_home_t:s0
[root@centos1 ~]# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
[root@centos1 ~]# restorecon -Rv /web

Assignar puertos a etiquetas

semanage port -l # listado de etiquetas a puertos
semanage port -m -t http_port_t -p tcp 8080 # asignar puerto a dominio

Ver contextos del sistema

[root@centos1 ~]# semanage fcontext -l
[root@centos1 ~]# seinfo -t

Semodule

Manejo de modulos de selinux

semodule -l | --list=full | -lfull  # listar modulos
semodule -i modulo.pp.b2    # instalar
semodule -r modulo          # eliminar
semodule -e modulo      # habilitar
semodule -d modulo      # desabilitar

Manejo boleanos

Algunos modulos tienen opciones Boleanos (etiquetas) en on|off

getsebool -a    # ver todos 
getsebool httpd_enable_homedirs # ver estado de uno
setsebool httpd_enable_homedirs on  # asignacion temporal
setsebool -P httpd_enable_homedirs on   # permanente

Para alternar el valor de un booleano, use el comando togglesebool como se muestra en este ejemplo:

# togglesebool ftp_home_dir
ftp_home_dir: inactive

Newrole

Abrir un nuevo shell con un contexto diferente

newrole [-r|--role] ROLE [-t|--type] TYPE [-l|--level] [-p|--preserve-environment] LEVEL [-- [ARGS]...]
newrole -r sysadm_r -t dominio_t
newrole -r sysadm_r
newrole -l Secret

Running a program in a given role or level:
newrole -r sysadm_r -- -c "/path/to/app arg1 arg2..."

Runcon

Ejecute el comando con un contexto completamente especificado, o con un contexto de seguridad actual o en transición modificado por uno o más de nivel, función, tipo y usuario.

runcon context command [args]
runcon [ -c ] [-u user] [-r role] [-t type] [-l range] command [args]

El comando chcon cambia el contexto SELinux de los archivos. Estos cambios no sobreviven un reetiquetado del sistema de archivo, o el comando /sbin/restorecon.

chcon -t tipo nombre-de-archivo 
chcon -R -t tipo nombre-de-directorio

Logs

Los logs de selinus se muestran en /var/log/messages o /var/log/audit/audit.log estos son un poco liosos de entender y existen diferentes herramientas para facilitar esto.

/var/log/audit/audit.log
aureport -a  # ayuda visualizacion de logs
  • sealert te ayuda a entender el bloqeo de selinux y muestra opciones para solucionarlo

    sealert -a /var/log/audit/audit.log

  • apol is a graphical tool that allows the user to inspect aspects of a SELinux policy

  • audit2why Muestra la causa y el porque se ha denegado el acceso

    audit2why < /var/log/audit/audit.log

Generar reglas de autorización de políticas de SELinux a partir de registros de operaciones denegadas

audit2allow -w -a
audit2allow -a -M mycertwatch   # crear modulo
semodule -i mycertwatch.pp  # instalar modulo

# crear modulo para multiples operaciones denegadas
grep certwatch /var/log/audit/audit.log | audit2allow -M mycertwatch2

  • https://stopdisablingselinux.com
  • https://selinux.readthedocs.io/es/latest/capitulo_1.html
  • https://www.redhat.com/es/topics/linux/what-is-selinux
  • https://es.wikipedia.org/wiki/SELinux
  • https://debian-handbook.info/browse/es-ES/stable/sect.selinux.html

Apparmor

Es un módulo de seguridad del kernel Linux que permite al administrador del sistema restringir las capacidades de un programa. Para definir las restricciones asocia a cada programa un perfil de seguridad.

AppArmor es menos complejo y más fácil de aprender a utilizar para un usuario medio que SELinux; incluso sus procesos de auditoría son más claros al público en general.

Con AppArmor no importa en qué clase de sistema de ficheros estén montados los archivos ya que trabaja con las rutas de los archivos o URL.

Los perfiles de AppArmor se guardan en /etc/apparmor.d/ y contienen una lista de reglas de control de acceso sobre los recursos que puede utilizar cada programa.

root@focal:~# ls /etc/apparmor.d/usr.*
/etc/apparmor.d/usr.bin.man                      /etc/apparmor.d/usr.sbin.rsyslogd
/etc/apparmor.d/usr.lib.snapd.snap-confine.real  /etc/apparmor.d/usr.sbin.tcpdump
/etc/apparmor.d/usr.sbin.haveged

Los perfiles se compilan y son cargados por el núcleo por la orden apparmor_parser

aa-status   # ver estado
aa-enforce /usr/bin/pidgin  # añadir modo enforce
aa-complain /usr/sbin/dnsmasq   # añadir modo complain

aa-disable /usr/sbin/dnsmasq
aa-audit /usr/sbin/dnsmasq # registra incluso las llamadas aceptadas

A pesar de que crear un perfil AppArmor es bastante sencillo, la mayoría de los programas no disponen de uno.

Ver programa que no disponen perfil:

aa-unconfined   # lista los programas que exponen al menos un zócalo de red 
--paranoid      # vse obtienen todos los procesos que tienen activa al menos una conexión de red y no están confinados.

Generar perfil

Para generar un perfil de manera automatica pones a la escucha el programa y desde otra shell generas logs sobre ese programa. aa-genprof registrara todo los logs gebnerados i crear un archivo de perfil.

aa-genprof dhclient

aa-genprof no es sino un pequeño script inteligente que utiliza aa-logprof: crea un perfil vacío, lo carga en modo relajado y después ejecuta aa-logprof.