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 solucionarlosealert -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 accesoaudit2why < /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.