AppArmor

CiberSeguridad 4 de jul. de 2023

Introducción a AppArmor

Apparmor es un sistema de control obligatorio de acceso MAC (Mandatory Access Control) basado en la interfaz LSM (Linux Security Modules) o módulos de seguridad de Linux.
En la práctica, el núcleo pregunta a AppArmor antes de cada llamada del sistema para saber si un proceso está autorizado a realizar dicha operación. A través de este mecanismo, Apparmor confina un programa a un conjunto limitado de recursos.

AppArmor aplica un conjunto de reglas (un «perfil») a cada programa. El perfil aplicado por el núcleo depende de la ruta de instalación del programa a ejecutar.

Al contrario que en SELinux, las reglas que se aplican no dependen del usuario.

A todos los usuarios se les aplica el mismo juego de reglas cuando ejecutan el mismo programa (aunque en cualquier caso siguen teniéndose en cuenta los permisos de usuario tradicionales, lo que puede resultar en un comportamiento distinto).

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. Los perfiles se compilan y cargan por el núcleo con el comando:

apparmor_parser

Cada perfil se puede cargar bien en dos modos:

  • Estricto (enforcing): Aplica las reglas y registra las tentativas de violación.
  • Relajado (complaining):Sólo se registran las llamadas al sistema que hubieran sido bloqueadas, pero no se bloquean realmente.

Activar AppArmour y gestionar los perfiles

El soporte de AppArmor está ya integrado en los núcleos estándares proporcionados por Debian.
Para activar AppArmor basta con instalarlo como root ejecutando:

apt -y install apparmor apparmor-profiles apparmor-utils

Después de la instalación AppArmor estará operativo, puede comprobarlo ejecutando como root el comando:

aa-status

apparmor module is loaded.
31 profiles are loaded.
29 profiles are in enforce mode.
...
Existen otros perfiles de AppArmor dearrollados por la comunidad.
Para instalar otros perfiles instale los paquetes:
apparmor-profiles y apparmor-profiles-extra

El estado de cada perfil se puede cambiar entre los modos estricto y relajado mediante las órdenes:

# Usar modo Estricto (enforcing)
aa-enforce /usr/sbin/cupsd

# Usar modo Relajado (complaining)
aa-complain /usr/sbin/privoxy

Además se les puede incluir como parámetro la ruta del ejecutable o la ruta del archivo de perfil.

Ademas se puede desactivar completamente un perfil o ponerlo en modo de auditoría (de forma que registre incluso las llamadas del sistema aceptadas):

# Deshabilitar (aa-disable)
aa-disable

# Auditar
aa-audit

Creación de un nuevo perfil

A pesar de que crear un perfil AppArmor es bastante sencillo, la mayoría de los programas no disponen de uno.
Esta sección muestra cómo crear un nuevo perfil desde cero, simplemente utilizando el programa deseado y dejando que AppArmor monitorice las llamadas al sistema que realiza y los recursos a los que accede.

Los programas que deben ser confinados de forma prioritaria son aquellos expuestos a la red, puesto que estos serán los blancos más probables para atacantes remotos.
Precisamente por eso AppArmor proporciona el comando:

aa-unconfined

Con este comando listaremos los programas que tiene expuesto al menos un puerto de red sin tener ningún perfil asociado.
Con la opción --paranoid se obtienen todos los procesos en ejecución que tienen activa al menos una conexión de red y no están confinados.

aa-unconfined --paranoid

La lista de perfiles se puede ver en el siguiente enlace:

Profiles · Wiki · AppArmor / apparmor · GitLab
The AppArmor user space development project.


En el siguiente ejemplo vamos a crear un perfil para /sbin/dhclient (ya existe uno creado y disponible en apparmor-profiles), pero nos servirá para comprobar las diferencias de nuestro perfil con el oficial.

Para ello usaremos el comando:

aa-genprof dhclient

Utilice la aplicación en otra ventana y, cuando haya terminado, indique al programa aa-genprof  que escanee para buscar los eventos de AppArmor en los registros del sistema y así poder convertir esos registros en reglas de acceso.

Updating AppArmor profiles in /etc/apparmor.d
Writing updated profile for /usr/sbin/dhclient.
Estableciendo /usr/sbin/dhclient al modo reclamar.

Profiling: /usr/sbin/dhclient

Please start the application to be profiled in
another window and exercise its functionality now.

En este punto debemos iniciar la aplicación para la que estamos generando las reglas para que AppArmor pueda monitorizar los log y eventos de la misma.

Para cada evento registrado, habrá una o más sugerencias de reglas que puede aprobar o editar de varias maneras para permitir o denegar:

[(S)can system log for AppArmor events] / (F)inalizar

Una vez ejecutado y pulsada la tecla S nos mostrará:

Perfil:   /usr/sbin/dhclient
Ejecutar: /usr/sbin/dhclient-script
Severity: desconocido

(I)nherit / (C)hild / (P)rofile / (N)amed / (U)nconfined / (X) ix On / (D)eny / Abo(r)t / (F)inalizar

El primer evento detectado es la ejecución de otro programa.
En este caso se ofrecen varias opciones:

  • "Inherit" puede lanzar el programa con el perfil del programa padre.
  • “Profile” o “Name” con un perfil dedicado, que sólo se diferencian por la posibilidad de elegir un nombre de perfil arbitrario).
  • “Child”con un sub-perfil del proceso padre.
  • “Unconfined” para lanzarlo sin nigún perfil.
  • “Deny” para impedir que el programa se ejecute.


Cuando se elije lanzar el proceso hijo con un perfil de dedicado que no exista aún, la herramienta creará el perfil que falta y propondrá sugerencias de reglas en la misma sesión de trabajo.

Pulsaremos la tecla P para gestionar el perfil (profile):

Should AppArmor sanitise the environment when
switching profiles?

Sanitising environment is more secure,
but some applications depend on the presence
of LD_PRELOAD or LD_LIBRARY_PATH.

[(Y)es] / (N)o 

Writing updated profile for /usr/sbin/dhclient-script.

Dependiendo del nivel de seguridad deseado, se puede hacer que AppArmor limpie el entorno cada vez que se cambia de perfil, pero dependiendo de cada aplicación puede necesitar usar LD_PRELOAD o LD_LIBRARY_PATH para funcionar correctamente.
Vamos a escoger No por si dhclient tuviese problemas de carga de librerías, una vez escogido veremos avisos sobre eventos que pueden no ser monitorizados:

WARNING: Ignoring exec event in /usr/sbin/dhclient//null-/usr/sbin/dhclient-script//null-/usr/sbin/avahi-autoipd, nested profiles are not supported yet.
WARNING: Ignoring exec event in /usr/sbin/dhclient//null-/usr/sbin/dhclient-script//null-/usr/bin/systemctl, nested profiles are not supported yet.
WARNING: Ignoring exec event in /usr/sbin/dhclient//null-/usr/sbin/dhclient-script//null-/usr/sbin/avahi-autoipd//null-/etc/avahi/avahi-autoipd.action, nested profiles are not supported yet.
Capabilities: A nivel del núcleo, los permisos especiales del usuario root se han separado en "capacidades" («capabilities»). Cuando una llamada del sistema requiere una capacidad específica, AppArmor verifica que el perfil permite al programa utilizar esta capacidad.

A partir de este momento, para cada "capability" detectada nos muestra la Severidad y nos pedirá si la queremos Permitir (Allow), Denegar (Deny), Ignorar (Ignore) ó Auditar (Audit):

Perfil:     /usr/sbin/dhclient
Capability: net_raw
Severity:   8

 [1 - capability net_raw,]
(A)llow / [(D)eny] / (I)gnorar / Audi(t) / Abo(r)t / (F)inalizar

Así iremos escogiendo lo que queramos e irá generando para cada una de ellas el perfil que deseamos.

Según vamos avanzando en la generación del perfil nos encontraremos con nuevas preguntas:

Perfil:     /usr/sbin/dhclient
Ruta:       /etc/nsswitch.conf
Modo nuevo: owner r
Severity:   desconocido

 [1 - owner /etc/nsswitch.conf r,]
(A)llow / [(D)eny] / (I)gnorar / (G)lob / Glob with (E)xtension / (N)uevo / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inalizar

En este punto aa-genprof ha detectado que el programa requiere el permiso de lectura, marcado como 'owner r' sobre el archivo /etc/nsswitch.conf.
Si este permiso ya se hubiese concedido por otras «abstracciones» las ofrecería como alternativas posibles a escoger.

Una abstracción proporciona un conjunto reutilizable de reglas de control de acceso, agrupando reglas que suelen utilizarse conjuntamente. Se específica el archivo que se utiliza normalmente por las funciones relativas a la resolución de nombres de la biblioteca estándar C.

Por ejemplo podría aparecer la opción «#include <abstractions/nameservice>», la cual seleccionaríamos y después tendríamos que pulsar «A» para permitirlo.

Perfil:         /usr/sbin/dhclient
Network Family: netlink
Socket Type:    raw

 [1 - include <abstractions/nameservice>]
  2 - network netlink raw, 
(A)llow / [(D)eny] / (I)gnorar / Audi(t) / Abo(r)t / (F)inalizar

Una vez completadas todas las preguntas necesarias nos aparecerá lo siguiente:

= Changed Local Profiles =

The following local profiles were changed. Would you like to save them?

 [1 - /usr/sbin/dhclient]
(S)ave Changes / Save Selec(t)ed Profile / [(V)iew Changes] / View Changes b/w (C)lean profiles / Abo(r)t

Puede que un programa tenga asociados más de un perfil.
Si pulsamos 'S' guardaremos ambos, y si pulsamos 't' salvaremos el que aparece  seleccionado por defecto.

Writing updated profile for /usr/sbin/dhclient.

Profiling: /usr/sbin/dhclient

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in 
order to scan the system logs for AppArmor events. 

For each AppArmor event, you will be given the 
opportunity to choose whether the access should be 
allowed or denied.

[(S)can system log for AppArmor events] / (F)inalizar

Una vez grabado y actualizado el perfil, podemos (F)inalizar el proceso.
Se aplicarán los cambios realizados y se recargará AppArmor con la nueva configuración del perfil que hemos generado para dhclient:

Setting /usr/sbin/dhclient to enforce mode.
Setting /usr/sbin/dhclient-script to enforce mode.

Reloaded AppArmor profiles in enforce mode.

Finished generating profile for /usr/sbin/dhclient.

Cómo funciona aa-genprof

aa-genprof es simplemente un pequeño script que utiliza aa-logprof.


El funcionamiento básico es el siguiente:
Se crea un perfil vacío y se carga en modo relajado, después ejecuta aa-logprof.
Esta última es una utilidad que actualiza un perfil en función de las violaciones que han sido registradas.
En cualquier momento se puede volver a ejecutar esta herramienta para ajustar o mejorar el perfil que hemos creado.

Si has creado un nuevo perfil para alguna aplicación que no está en la lista de apparmor-profiles, puedes contribuir compartiendo ese nuevo perfil.
Consulta la siguiente página wiki para saber cómo hacerlo en:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Basado en el "Manual del Administrador de Debian" Capítulo 14. Seguridad

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux