AppArmor és un mòdul de seguretat del kernel que et permet restringir les capacitats d'un programa.
Introducció
Un dels principals objectius d’aquesta activitat és que t’adonis de tots els processos que s’executen, fitxers que es manipulen i recursos que s’utilitzen quan executes una aplicació, dels quals no ets conscient, i és el primer pas per poder assegurar un sistema: que tu siguis conscient que està passant.
Nota. No podem utilitzar WSL per apparmor: Issue: AppArmor Support
Crea una nova màquina virtual a Isard amb el nom armor.
En l’activitat Usuaris vam veure que hi ha usuaris “humans” i de “sistema”, encara que pel sistema operatiu tots són iguals.
Linux és el sistema operatiu més utilitzat en servidors, i si mirem quants usuaris hi ha pots veure que hi ha molts usuaris:
Però d’aquests dos usuaris només hi ha dos que són “humans” (els que fan servir bash): box i root.
|
Si volem contar quants usuaris de sistema hi ha:
Saps qui són aquests 26 usuaris i que fan? Crec que no.
Protegir un sistema operatiu és difícil, i no és suficient amb el que has après a Usuaris respecte permisos, contrasenyes, etc. perquè el problema es controlar que fan els processos.
Per exemple, baixa una canço:
Escolta la cançó:
Suposo que t’hauràs adonat que això no té gaire bona pinta perquè ja saps que al professor a vegades li agrada fer alguna broma.
Però això és el que feu molts cops quan copieu, enganxeu i executeu tot el que trobeu per internet per tal de no pensar i resoldre un exercici.
Un dels problemes de seguretat més important és controlar que fa un procés quan s’executa!
Pots consultar els processos que estan corrent amb ps aux:
Per exemple, el primer procés de la llista mostra aquesta informació:
USER | root | És el nom de l’usuari que va començar aquest procés |
PID | 1 | (Process ID) - Identificador del procés |
START | 14:48 | En quin moment es va començar a executar |
COMMAND | /sbin/init | Quina és l’ordre que va iniciar el procés |
STAT | Ss | I els possibles estats: (man ps) |
Exercici: sleep
Pots “matar” alguns d’aquests processos amb la comanda kill
Executem el procés sleep:
&
|
|
Exercici: nano
-
Obre un altre terminal i obre un document amb
nano hola.txt -
Des de l’altre terminal troba el procés que esta executant
nano -
Matar el procés que està executant
nano
AppArmor
AppArmor és un sistema de seguretat d’aplicacions Linux eficaç i fàcil d’utilitzar que reemplaça a SELinux en moltes distribucions de Linux (per exemple, Debian, Ubuntu, OpenSUSE).
Per què ha de ser fàcil d’utilitzar? Perquè si no és fàcil d’utilitzar no s’utilitza.
Utilitza l’eina aa-status per comprovar quins perfils es carreguen i quin estat tenen actualment:
De seguida pots veure que 12 perfils han estat carregats pel sistema i estan en estat enforce (restricció). Això vol dir que AppArmor supervisarà els processos que coincideixen amb aquests perfils i decidirà si una acció específica està permesa o denegada per la política.
Una altra cosa que has d’observar a la sortida són els estats complain (queixar-se) i unconfined (sense confinar):
-
Quan un perfil està en mode
complainAppArmor li permetrà acomplir gairebé totes les tasques sense restriccions, però les registrarà al registre d’auditoria com a esdeveniments. Això és útil quan intentes crear un perfil per a una aplicació, però no estàs segur de quines coses necessita accedir. -
D’altra banda, l’estat
unconfinedpermet que el programa acompleixi qualsevol tasca i no la registrarà. Això sol passar si es va carregar un perfil després d’iniciar una aplicació, que implica que s’executa sense restriccions per part d’AppArmor.També és important tenir en compte que només els processos que tenen perfils s’enumeren sota l’estat unconfined. Per tant, qualsevol altre procés que s’executi al teu ordinador, però que no tingui un perfil creat per a ell no apareixerà a la llista de
aa-status.
Ara que hem cobert els diferents estats en què pot estar un perfil d’AppArmor, podem passar a aprendre a crear aquests perfils per a un programa específic.
Per a aquesta demostració, crearem un script senzill que després aplicarem amb AppArmor.
Important!. Com que fem servir scripts pots saber que s’està executant, però si fos un fitxer binari no podries mirar el seu contingut.
Crea un script anomenat test.sh:
Executa l’script
Recorda que a Windows podeu executar qualsevol fitxer, però a Linux has de donar-li el permís d’execució:
Ara comencem a fer que l’script compleixi les polítiques definides amb AppArmor.
Hi ha dues eines principals que fem servir per generar i afegir-hi perfils, aa-genprof i aa-logprof.
-
aa-genprofs’utilitza per supervisar i crear un perfil per a una aplicació la primera vegada que s’executa (és a dir, quan estàs creant el perfil per primera vegada) de manera que AppArmor pugui conèixer quines són les tendències de les aplicacions i demanar-vos quin comportament s’ha de tenir en determinades circumstàncies. -
aa-logprofés útil quan tens un perfil existent i necessiteu permetre/denegar l’accés a determinades tasques que ja s’han registrat durant els modes d’aplicació o reclamació.
aa-genprof
Instal.la apparmor-utils:
Ajuda. aa-genprof vol dir “app armor - generate profile”
Un professional dissenya un perfil per controlar un programa, igual que un bon pagès disseny un bon pla perquè la guineu no faci apat amb les seves gallines:

El que faràs ara és deixar que la guineu faci el que hagi de fer, i que aa-genprof registri el que ha fet la guineu.
Executem aa-genprof amb el nostre script com a paràmetre:
[
Obre un nou terminal i executa l’script (recorda que aa-genprof ha d’estar funcionat per poder escanejar el registre per conèixer tots els esdeveniments que crea el programa):
Ja pots tornar a l’altre terminal.
Un cop hàgis executat l’script, prem el botó s a la finestra del terminal on s’està executan
app-genpro :
[
A continuació aa-genprof ens proposa regles per afegir al perfil.
() aa-genprof t’està dient que un perfil (normalment indicat per la ruta absoluta del programa) està intentant accedir o executar un fitxer determinat o que el procés requereixi accés a una determinada capacitat del nucli.
En aquest cas t’està dient que l’script executa el fitxer /usr/bin/touch (com jo pots haver imaginat quan vares escriure l’script).
AppArmor també intenta proporcionar un avís de gravetat basat en el que el procés està intentant fer (1 és un avís baix i 10 és molt greu), però això no sempre és precís, ja que alguns programes necessiten legítimament accés a recursos que compten com un avís molt greu.
Per exemple, el navegador Chrome(ium) requereix accés a CAP_SYS_ADMIN per crear un sanddbox segur per als seus processos fills, però AppArmor donaria un avís de gravetat 10 per a això.
També observa com AppArmor ens ofereix aquí diverses opcions diferents sobre què podem fer, però centrem-nos en les principals:
-
Inherit: Crea una regla que es denota ambixdins del perfil que fa que el binari executat hereti els permisos del perfil principal. -
Child: Crea una regla que es denota ambCxdins del perfil, requereix que es creï un subperfil dins del perfil principal i les regles s’han de generar per separat per a aquest fill (apareixeran demanades quan s’executen exploracions al pare). -
Deny: Crea una regla que AppArmor anteposadenya l’inici de la línia dins del perfil, provoca que es denegui l’accés als pares al recurs. -
Abort: Surt del programa AppArmor sense desar cap canvi. -
Finish: Surt del programa AppArmor, però guardarà els canvis.
Aquesta és realment la part complicada de generar els vostres propis perfils AppArmor perquè has de saber quins permisos cal donar i denegar. Per això, et recomano molt utilitzar perfils preexistents si és possible, especialment si són distribuïts per una part de confiança.
Per a aquest script és suficient en només donar un permís (D)eny a /usr/bin/touch (has de premer la lletra d) per tal que l’script no pugui executar l’ordre touch.
El següent missatge sembla una mica diferent dels anteriors:
() Observa com hi ha un camp nou anomenat “Mode” que ens indica quins permisos requereix l’script per accedir al “Path”.
Com ja vas aprendre a Usuaris en Linux tot són fitxers, i el terminal també és un fitxer. Per poder escriure al terminal (la interfície TTY) l’script necessita permís d’escritura (w).
Tingues en compte també com hi ha algunes opcions noves disponibles, les principals són:
Allow: Permet l’accés al camí amb els permisos sol·licitatsDeny: Denegueu l’accés a la ruta amb els permisos sol·licitatsIgnore: Ometeu aquest missatge, tornarà a aparèixer una altra vegada que executis logprof
De moment permet a l’script accedir a la consola amb l’opció (A)llow (prem la tecla a)
Finalment, ens demana si volem desar els canvis o no.
Prem s per desar els canvis.
=
()I després f per acabar:
Elimina el fixer hello.txt i torna a executar l’script test.sh (ho pots fer des del mateix terminal en què has executat app-armor):
L’script no es pot executar perquè ara no té permís per executar l’ordre touch.
aa-genprof ha generat un nou fitxer de compliment a /etc/apparmor.d/home.box.test.sh:
Com pots burlar el confinament?
Si et fixes bé la política s’aplica a /home/box/test.sh.
Una opció és canviar el nom al fitxer:
Una altra opció és moure l’script de lloc:
aa-logprof
Fins a aquest punt hem vist com utilitzar AppArmor per perfilar i fer complir regles contra un procés. Tanmateix, tot això es va fer sota el supòsit que l’script test.sh no canviarà mai.
Malauradament, el programari del món real no funciona d’aquesta manera, sovint s’actualitza, cosa que fa que requereixi l’addició o eliminació d’accés per a determinats fitxers i funcions. Això vol dir que hem de poder aprofitar AppArmor perquè ens permeti actualitzar els perfils a mesura que canvien els programes. Per això tenim les aplicacions aa-logprof i aa-mergeprof.
aa-logprof s’utilitza per escanejar el registre d’auditoria per detectar qualsevol esdeveniment que AppArmor no hagi pogut fer coincidir amb les regles existents en un perfil i, a continuació, us demanarà canvis.
Abans de començar assegura’t que AppArmor fa complir el perfil test.sh amb l’ordre aa-status:
Mou el fitxer al “home”:
Ara simulem un problema de seguretat. Algú, en aquest cas tu perquè és un exemple, modifica el fitxer test.sh perquè faci un curl com el del hack anterior, però en aquest cas inofensiu.
A continuació torna a executar l’script, i imagina’t que no saps que algú ha modificat l’script (un greu problema de seguretat)
Per sort AppArmor ha bloquejat l’script per transferir dades a Internet.
Ara recordes que el vas modificar tu fa pocs minuts i que si, que és correcte que faci curl.
Per permetre que l’script transfereixi dades a Internet, has d’actualitzar el perfil d’AppArmor.
Executa l’aplicació aa-logprof i actualitza el perfil amb aquestes opcions: curl (inherit), touch (deny):
()
()
=
()
Guarda els canvis i executa l’script:
Com pots veure l’script dona error perquè no pot resoldre el domini www.google.com.
Si fas un ping pots verificar que és un problema de l’script, no del sistema operatiu:
Com pots intuir el problema de l’script test.sh és que està confinat per app-armor:
() Resulta que l’ordre curl necessita llegit el fitxer openssl.cnf per poder resoldre la IP de l’adreça www.google.es.
Segur que desconeixies l’existència d’aquest fitxer, i que curl necessitava llegir-lo per poder resoldre els dominis d’internet!
Has de permetre la lectura d’aquest fitxer.
() Ara et diu que l’script també necessita llegir el fitxer /etc/nsswitch.conf.
Aquest cop en lloc de permetre la lectura perquè sí (allow), mira en què consisteix aquest fitxer i decideix amb una mica de fonaments. Per això està google i Chat GPT, no perquè et faci la feina i no hagis de pensar: Ubuntu Manpage: nsswitch.conf
Pregunta. Quants fitxers ha de llegir curl per poder executar-se? Saps perquè serveix cada un d’ells?
/etc/passwd. Un recurs que necessita és /etc/passwd on estan tots els usuaris del sistema. Però perquè curl necessita llegir aquest fitxer? A través d’ell pot coneixer tots els usuaris de sistema i els serveis que s’estan executant en el servidor, com apache, nginx, mysql, etc. El més segur es denegar perquè en principi no li fa falta per funcionar.
I depèn del que hagis fet test.sh pot executar l’ordre `curl.
I ara test.sh pot transferir dades a Internet:
Administrar
Els sistemes operatius Linux, a diferència de Windows, s’administren mitjançant fitxers.
El directori /etc/apparmor.d és on es troben els perfils AppArmor (entre ells el que vas crear abans):
Com hem explicat abans un perfil pot estar en mode complain o enforce.
aa-complain
Abans de començar comentem la línia del curl perquè la línia de sortida sigui més curta:
Per posar el perfil home.box.test.sh en mode complain executa l’ordre:
Pots verificar que ara l’script test.sh es pot executar sense problemes:
Això és útil per poder registrar tot el que fa l’script, en lloc de tenir-lo que executar vàries vegades com hem fet abans quan hem afegit l’ordre curl.
Per tornar a posar l’script test.sh en mode enforce executem l’ordre:
Pots verificar que l’script torna a estar confinat:
Si executes la comanda aa-status pots veure que gairebé tots els perfils estan en mode enforced:
Per posar tots els perfils en mode complain executa l’ordre:
Pots veure que alguns dels fitxers són directoris; per tant, aa-complain mostra el missatge “not found, skipping”
aa-enforce
Verifica si encara hi ha perfils en mode enforce:
On estan aquest perfils?
Que has de fer per posar-los en mode enforce?
No funciona, com pots veure si executes aa-status, i això que no son directoris.
Pots veure que són perfils d’AppArmor:
# vim:syntax=apparmor
#include <tunables/global>
#include if exists "/var/lib/snapd/apparmor/snap-tuning"
És el moment de preguntar a Chat GPT! 😂
Posem tot de nou a mode enforce:
Seleccionar aplicacions
Un dels problemes de seguretat més important és quan una aplicació de confiança té un bug i fa el que no ha de fer. Una aplicació de confiança normalment s’executa amb uns privilegis que un atacant vol aconseguir per explotar el sistema, i per això és important que aquestes aplicacions estiguin confinades.
Només cal protegir els programes que s’executen a la teva màquina i que estan exposats a atacs. Normalment són agents de xarxa, aplicacions web i cron jobs.
Però com pots esbrinar quins processos s’estan executant actualment amb ports de xarxa oberts i que potser necessiten un perfil per limitar-los? Pots executar aa-unconfined com root.
systemd i sshd són dos serveis molt importants del sistema operatiu.
Saps perquè serveixen?
Són dos dels serveis més importants d’un servei operatiu i no estan confinats perquè en cas d’una actualització podrien deixar de funcionar correctament pel confinament d’AppArmor i causar greus problemes en el sistema operatiu.
Per aquest motiu la distribució Ubuntu no s’atreveix a confinar-los.
Exercicis
ping
Anem a confinar ping:
Obre un altre terminal i fes un ping a www.google.es:

Ja podem escanejar el ‘system log’ per trobar ‘AppArmor events’!
Denega-ho tot. (excepte network inet dgram perquè no permeti fer un deny).
Verifica que ping ja no funciona:
Finalitza el proces i edita el fitxer usr.bin.ping:
Modifica el fitxer i ara ho permetem tot (borrem el deny)
# Last Modified: Thu Sep 21 09:18:33 2023
Torna a carregar el perfil:
Ara si que pots fer ping a www.google.es:
Torna a posar deny tot, excepte en un dels fitxers, aquell que dona l’error “Temporary failure in name resolution”
Avaluació
Amb la comanda kill puc matar un procés, i no cal fer sudo si sóc el “propietari” del procés:
&
Mata el procés “sleep” i verifica amb ps que el procés està “kaput”:
Show solution
|
|
Però encara hi ha una linia que posa sleep !!
No et preocupis, el que tenia que estar “kaput” està “kaput”
Instal.la el servidor apache:
Com que el teu usuari també pertany al grup sudo anem a matar tots els processos de l’usuari www-data.
Tinc poders de superusuari 😃 !!
Anem a veure quins processos té l’usuari www.data…
|
Matem tots els de www-data …
Fàcil, excepte que han aparegut uns de nous
😯
|
Com puc matar tots els processos www-data sense parar el servidor Apache?
Haig de descubir quin usuari mou els fils rere l’hombra i matar-lo amb un kill.
🧐
Show solution
TODO
Tens un “amic” informàtic que t’ha passat aquest script que té el nom de colt.sh.
Et diu si t’atreveixes a executar-lo 4 vegades sense modificar res.
colt.sh
#/bin/bash
number=
if
then
else
Tu respons que cap problema, que l’executaré 10 vegades i no em passarà res.
El primer que fas, i és molt important, és fer un update per assegurar que l’Ubuntu està al dia.
Executa l’script 🚀🚀🚀
Show solution

Si vols els punts d'aquesta pregunta, ja saps ... la màquina "kaput" o tenir sort
🙄
Has decidit que vas a confinar l’script amb AppArmor, i el primer que faràs és generar un perfil amb aa-genprof.
Genera el perfil.
Terminal 1
Un cop has generat el perfil ja pots tornar a executar l’script fins que faci tot el que ha de fer.
Obre un altre terminal …
Show solution

Per generar el perfil complet ha d’haver-hi un BANG!!.
Però quan hi ha un “BANG!!” la màquina torna a estar “kaput”, no hi ha logs, …
Que podem fer ???
Si vols els punts d'aquesta pregunta, ja saps ... la màquina "kaput"
🙄
Et dones compte que això de les juguesques és una mica perillós, i més val anar a poc a poc.
Crea l’script grasshoper.sh, i crea un perfil que li permeti tocar el que vulgui touch, però no borrar rm.
#!/bin/bash
Show solution
TODO
Verifica que funciona:
Amb aa-genprof has generat un perfil per a l’script grasshoper.sh que no permet executar l’ordre rm.
Potser podriem aprofitar aquest perfil per colt.sh? Bona pensada!
Crea un perfil per colt.sh que sigui segur, carrega’l al kernel i a jugar !!
No passa res si no ho aconsegueixes, el que compta (i puntua és intentar-ho)
Show solution
Aprofito el perfil de grasshoper.sh :
|
L’adapto a colt.sh
# Last Modified: Thu Sep 26 09:51:59 2024
Carrego al kernel el perfil modificat:
I ja puc jugar!
TODO. Falta captura de pantalla
6.- Al final penses, i estic d’acord, en que això d’AppArmor és una mica complicat, i com ha explicat el teu professor moltes vegades el que és complicat deixa de ser segur perquè no es fa servir.
Ara és el moment en que el delegat de classe faci una mica de feina i demani en nom de la classe que si us plau us ensenyin Docker.
Però com que ara tens una mica de pressa ja t’ajudo !!
Instal.lem docker:
| A continuació crea un contenidor ubuntu i fica`t dins:
Ara estic en un entorn segur, ha jugar!
😀
&&
Escriu l’script:
#/bin/bash
number=
if
then
else
Ja pots executar tants cops com vulguis!
TODO Falta caputra de pantalla
Copiar, fer, captura de pantalla … 0,5 punts a la butxaca de franc !