Product SiteDocumentation Site

14.4. Introducció a AppArmor

14.4.1. Principis

AppArmor és un sistema «Mandatory Access Control» o “control obligatori d'accés” (MAC) basat en la interfície de Linux LSM («Linux Security Modules» “mòduls de seguretat de linux”). A la pràctica, el nucli consulta AppArmor abans de cada crida de sistema per saber si el procés està autoritzat a fer l'operació demanada. A través d'aquest mecanisme, AppArmor limita els programes a un conjunt limitat de recursos.
AppArmor aplica un conjunt de regles (conegut com a «profile» o “perfil”) a cada programa. El perfil aplicat pel nucli depèn del camí d'instal·lació del programa que s'està executant. Contràriament al SELinux (descrit al Secció 14.5, «Introducció a SELinux»), les regles aplicades no depenen de l'usuari. Tots els usuaris s'enfronten al mateix conjunt de regles quan estan executant el mateix programa (però els permisos d'usuari tradicionals encara s'apliquen i poden resultar en un comportament diferent!).
Els perfils d'AppArmor s'emmagatzemen a /etc/apparmor.d/ i contenen una llista de regles de control d'accés sobre els recursos que cada programa pot utilitzar. Els perfils són compilats i carregats al nucli per l'ordre apparmor_parser. Cada perfil es pot carregar en mode forçat («enforcing») o reclamat («complaining»). El primer fa complir la política i informa dels intents de violació, mentre que el segon no fa complir la política, però tot i així registra les crides del sistema que s'haurien denegat.

14.4.2. Habilitar AppArmor i gestionar-ne els perfils

AppArmor support is built into the standard kernels provided by Debian. Enabling AppArmor is thus just a matter of installing some packages by executing apt install apparmor apparmor-profiles apparmor-profiles-extra apparmor-utils with root privileges.
AppArmor és funcional després de la instal·lació, i aa-status ho confirmarà ràpidament:
# aa-status
apparmor module is loaded.
40 profiles are loaded.
18 profiles are in enforce mode.
   /usr/bin/man
[..]
22 profiles are in complain mode.
[..]
   dnsmasq
[..]
0 profiles are in kill mode.
0 profiles are in unconfined mode.
1 processes have profiles defined.
1 processes are in enforce mode.
   /usr/sbin/dhclient (473) /{,usr/}sbin/dhclient
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
0 processes are in mixed mode.
0 processes are in kill mode.
L'estat de cada perfil es pot intercanviar entre forçat i reclamació amb crides a aa-enforce i aa-complain donant com a paràmetre el camí de l'executable o el camí al fitxer de política. A més, un perfil es pot desactivar completament amb aa-disable o posat en mode d'auditoria (per també registrar les crides al sistema acceptades) amb aa-audit.
# aa-enforce /usr/bin/pidgin
Setting /usr/bin/pidgin to enforce mode.
# aa-complain /usr/sbin/dnsmasq
Setting /usr/sbin/dnsmasq to complain mode.

14.4.3. Creació d'un perfil nou

Tot i que crear un perfil d'AppArmor és bastant fàcil, la majoria dels programes no en tenen. Aquesta secció us mostrarà com crear un nou perfil des de zero només mitjançant l'ús del programa en qüestió i deixant que AppArmor monitoritzi les crides de sistema que fa i els recursos que accedeix.
Els programes més importants que cal confinar són el programes que interaccionen amb la xarxa, ja que aquests són els objectius més probables dels atacants remots. Per això AppArmor proporciona convenientment una ordre aa-unconfined per llistar els programes que no tenen cap perfil associat i que exposen un sòcol de xarxa obert. Amb l'opció --paranoid obtindreu tots els processos no confinats que tenen almenys una connexió activa de xarxa.
# aa-unconfined
473 /usr/sbin/dhclient confined by '/{,usr/}sbin/dhclient (enforce)'
521 /usr/sbin/sshd (sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups) not confined
1206 /usr/sbin/squid not confined
9931 /usr/bin/containerd not confined
11171 /usr/sbin/exim4 not confined
En el següent exemple, intentarem crear un perfil per a /sbin/dhclient (ja hi ha un perfil inclòs a apparmor-profiles de manera que podeu comparar els resultats amb l'oficial). Per a això, usarem aa-genprof dhclient. Us convidarà a usar l'aplicació en una altra finestra i, quan hàgiu acabat, a tornar a aa-genprof per escanejar els esdeveniments AppArmor als registres del sistema i convertir aquests registres en regles d'accés. Per a cada esdeveniment registrat, farà un o més suggeriments de regla que podeu aprovar o editar de diverses maneres:
# aa-genprof dhclient
Updating AppArmor profiles in /etc/apparmor.d.
Writing updated profile for /usr/sbin/dhclient.
Setting /usr/sbin/dhclient to complain mode.

Before you begin, you may wish to check if a
profile already exists for the application you
wish to confine. See the following wiki page for
more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

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)inish
S
Reading log entries from /var/log/syslog.

Profile:  /usr/sbin/dhclient 1
Execute:  /usr/sbin/dhclient-script
Severity: unknown

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

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
Y
Writing updated profile for /usr/sbin/dhclient-script.

WARNING: Ignoring exec event in /usr/sbin/dhclient//null-/usr/sbin/dhclient-script//null-/usr/bin/systemctl, nested profiles are not supported yet.
Complain-mode changes:

Profile:    /usr/sbin/dhclient 2
Capability: net_raw
Severity:   8

 [1 - capability net_raw,]
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish
A
Adding capability net_raw, to profile.

Profile:    /usr/sbin/dhclient
Capability: net_bind_service
Severity:   8

 [1 - include <abstractions/nis>]
  2 - capability net_bind_service,
(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish
A
Adding include <abstractions/nis> to profile.

Profile:  /usr/sbin/dhclient 3
Path:     /etc/dhcp/dhclient.conf
New Mode: owner r
Severity: unknown

 [1 - owner /etc/dhcp/dhclient.conf r,]
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
A
Adding owner /etc/dhcp/dhclient.conf r, to profile.

Profile:  /usr/sbin/dhclient 4
Path:     /var/lib/dhcp/dhclient.leases
New Mode: owner rw
Severity: unknown

 [1 - owner /var/lib/dhcp/dhclient.leases rw,]
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
A
Adding owner /var/lib/dhcp/dhclient.leases rw, to profile.

[..]

Profile:  /usr/sbin/dhclient-script 5
Path:     /usr/bin/dash
New Mode: owner r
Severity: unknown

 [1 - include <abstractions/gvfs-open>]
  2 - include <abstractions/ubuntu-browsers.d/plugins-common>
  3 - include <abstractions/xdg-open>
  4 - owner /usr/bin/dash r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
2

Profile:  /usr/sbin/dhclient-script
Path:     /usr/bin/dash
New Mode: owner r
Severity: unknown

  1 - include <abstractions/gvfs-open>
 [2 - include <abstractions/ubuntu-browsers.d/plugins-common>]
  3 - include <abstractions/xdg-open>
  4 - owner /usr/bin/dash r,
(A)llow / [(D)eny] / (I)gnore / (G)lob / Glob with (E)xtension / (N)ew / Audi(t) / (O)wner permissions off / Abo(r)t / (F)inish
A
Adding include <abstractions/ubuntu-browsers.d/plugins-common> to profile.
[..]

Enforce-mode changes:

= Changed Local Profiles =

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

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

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)inish
F
Setting /usr/sbin/dhclient to enforce mode.
Setting /usr/sbin/dhclient-script to enforce mode.

Reloaded AppArmor profiles in enforce mode.

Please consider contributing your new profile!
See the following wiki page for more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Finished generating profile for /usr/sbin/dhclient.
Tingueu en compte que el programa no mostra els caràcters de control que escriviu però per a la claredat de l'explicació s'han inclòs a la transcripció anterior.

1

El primer esdeveniment detectat és l'execució d'un altre programa. En aquest cas, hi ha diverses opcions: podeu executar el programa amb el perfil del procés pare (l'opció «inherit» o “heretar”), podeu executar-lo amb el seu propi perfil dedicat (opcions «Profile» i “Named”, que difereixen només per la possibilitat d'utilitzar un nom de perfil arbitrari), podeu executar-lo amb un “sub-perfil” del procés pare (opció «Child» o “fill”), podeu executar-lo sense cap perfil (l'opció «Unconfined» o “desconfinada”) o podeu decidir no executar-lo en absolut (l'opció “Deny”).
Tingueu en compte que quan opteu per executar-lo sota un perfil dedicat que encara no existeix, l'eina us crearà el perfil que falta i farà suggeriments de regles per a aquest perfil en la mateixa execució.

2

A nivell del nucli, els poders especials de l'usuari administrador estan dividits en «capabilities» o “capacitats”. Quan una crida de sistema requereix d'una capacitat específica, AppArmor verificarà si el perfil permet al programa fer ús d'aquesta capacitat.

3

Here the program seeks read permissions for its configuration file /etc/dhcp/dhclient.conf.

4

Here the program seeks read and write permissions to write the lease into /var/lib/dhcp/dhclient.leases.

5

Tingueu en compte que aquesta sol·licitud d'accés no forma part del perfil dhclient sinó del nou perfil que s'ha creat quan s'ha permès que /usr/sbin/dhclient-script s'executi amb el seu propi perfil.
aa-genprof detected that this permission was also granted by multiple “abstractions” and offers them as alternative choices. An abstraction provides a reusable set of access rules grouping together multiple resources that are commonly used together. In this specific case, we opted for selection “2” to first select the “#include <abstractions/ubuntu-browsers.d/plugins-common>” choice and then “A” to allow it.
Després d'haver passat per tots els esdeveniments registrats, el programa ofereix salvar tots els perfils que es s'han creat durant l'execució. En aquest cas, tenim dos perfils que es desen alhora amb «Save» (però també els podeu desar individualment) abans de sortir del programa amb «Finish».
aa-genprof és de fet només un “embolcall” intel·ligent al voltant de aa-logprof: crea un perfil buit, el carrega en mode de “reclamació” i després executa aa-logprof que és una eina per actualitzar un perfil basat en les violacions de perfil que s'han registrat. Així que es pot tornar a executar aquesta eina més endavant per millorar el perfil que s'acaba de crear.
Si es vol que el perfil generat sigui complet, s'ha d'utilitzar el programa de totes les maneres legítimes d'ús. En el cas de dhclient, això vol dir executar-lo a través del Network Manager, executar-lo via ifupdown, executar-lo manualment, etc. Al final, es podria obtenir un /etc/apparmor.d/usr.sbin.dhclient similar al perfil inclòs a apparmor-profiles a /usr/share/apparmor/extra-profiles/sbin.dhclient.
I /etc/apparmor.d/usr.sbin.dhclient-script podria ser similar a /usr/share/apparmor/extra-profiles/sbin.dhclient, també inclòs a apparmor-profiles.