Consentire determinati comportamenti rischiosi di un singolo programma in modo sicuro in SELinux


8

Ho un programma in esecuzione all'interno di un contenitore Docker che carica un file .so che altera il comportamento del programma attraverso l'aggancio e la manipolazione della memoria. Questo comportamento è bloccato da SELinux con il seguente messaggio nel registro di controllo:

type = AVC msg = audit (1548166862.066: 2419): avc: denied {execheap} per pid = 11171 comm = "myProgram" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: container_t: s0: c426, c629 tclass = processo consentito = 0

Sono estremamente titubante nel farcela perché audit2allownon voglio permettere questo comportamento specifico altrove (poiché sarebbe piuttosto rischioso).

  • Come posso dire a SELinux di consentire questo comportamento specifico nel modo più sicuro possibile?
  • Posso farlo in un modo che mi consenta di generare più container Docker che eseguono lo stesso programma in futuro?

Risposte:


4

audit2allowprobabilmente genera una regola per consentire execheapdi container_tprocesso tipo. Puoi sempre generare il modulo e controllarlo prima di caricarlo.

Un possibile problema è che ora a qualsiasi processo con container_ttipo è ora consentita la stessa operazione. Per evitarlo, è possibile che tu debba creare il tuo tipo personalizzato (usando container_tcome modello) e consentire solo execheapquesto tipo speciale.

Questo post sul blog di Dan Walsh spiega come scrivere tale politica personalizzata. Puoi anche combinare questo con audit2allowper generare le regole effettive. I passaggi essenziali sono:

  1. Creare un criterio contenitore di base, ad esempio container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templateLa macro crea il nuovo tipo container_execheap_te crea le regole necessarie per l'operazione docker che il nuovo tipo può essere utilizzato come dominio del contenitore.

  2. Compilare e caricare il modulo criteri (i file di sviluppo necessari, incluso il makefile, devono essere forniti dal selinux-policy-develpacchetto):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    Il nuovo tipo può essere configurato per essere un dominio consentito:

    semanage permissive -a container_execheap_t
    

    Per i domini permissivi, i rifiuti di AVC vengono registrati ma le regole non vengono applicate. In questo modo è facile generare in seguito le regole mancanti audit2allow.

  3. Esegui il contenitore in questo nuovo contesto, qualcosa del genere docker run ... --security-opt label:type:container_execheap_t ...

  4. Genera errori previsti. Quindi eseguire audit2allowper generare regole che consentano tali operazioni per container_execheap_t. Puoi aggiornare lo stesso .tefile del modulo (ricordati di aumentare il numero di versione) con le nuove regole. Compilare e installare il modulo aggiornato.

  5. Quando non vengono più generati errori, riportare il tipo di contenitore personalizzato in modalità di applicazione semanage -d container_execheap.


La tua risposta sembra essere la strada da percorrere - sfortunatamente anche se non ho alcuna esperienza nella creazione di politiche SELinux da solo. Questo è quello che ho scoperto guardando attraverso il post sul blog che hai collegato e altra documentazione. Ho la sensazione che non lo stia facendo bene ... potresti forse aiutarmi indicandomi nella giusta direzione? La mia politica ha alcun senso?
Thomas,

Grazie, ora ho qualcosa che sembra funzionare! Questo è quello che ho finito. Tuttavia ho ricevuto un sacco di errori relativi ai duplicati durante la compilazione, suppongo che sia un problema nelle politiche incluse piuttosto che nel mio? Inoltre, non sono del tutto sicuro del motivo per cui la stringa all'interno dell'istruzione gen_require deve essere terminata con un "anziché un" (quest'ultimo ha generato un errore). Comunque grazie ancora per l'aiuto!
Thomas,

Penso che sia sicuro ignorare quegli errori specifici, vedi bugzilla . Citando usando `` è come funziona nel linguaggio M4 , che viene usato per scrivere moduli di criteri di riferimento. È possibile verificare (utilizzando ps axZecc.) Che il contenitore venga eseguito nel contesto corretto se si desidera ricontrollare dopo aver installato e configurato i criteri personalizzati.
sebasth,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.