come creare un'etichetta SELinux personalizzata


11

Ho scritto un servizio / singola app binaria che sto cercando di eseguire su Fedora 24, funziona usando systemd, il binario è distribuito su /srv/bot

questo servizio / app che ho scritto deve creare / aprire / leggere e rinominare i file in questa directory.

Ho iniziato a creare una nuova politica basata su SELinux: consentire a un processo di creare qualsiasi file in una determinata directory

ma quando la mia app doveva rinominare, l'output aveva un avviso:

#!!!! WARNING: 'var_t' is a base type.
allow init_t var_t:file rename;

Ho cercato su Google e ho scoperto che dovrei usare un'etichetta SELinux più specifica di un tipo di base, ma tutti gli esempi online mostrano etichette esistenti da httpd / nginx / etc.

È possibile creare un'etichetta personalizzata solo per la mia app?

La mia idea è di creare qualcosa come myapp_var_t, usare

semanage fcontext -a -t my_app_var_t '/srv/bot(/.*)?'
restorecon -R -v /srv/bot

e un .ppfile personalizzato che utilizzerà questo tipo personalizzato

Se esiste un modo migliore per risolverlo, anche quello funziona.

Grazie

Aggiornare

Dopo ulteriori ricerche, penso che il termine corretto per ciò che voglio fare sia creare nuovo typesche mi abbia portato a https://docs.fedoraproject.org/en-US/Fedora/13/html/SELinux_FAQ/index.html#id3036916

che in pratica dice: corri

sepolgen /path/to/binary

e sono stato in grado di ottenere un modello che posso quindi compilare in un file PP e caricare, ancora ottenere alcuni errori ma sembra che io sia più vicino a quello che voglio fare.

Se riesco a farlo funzionare, aggiorno questo post

Risposte:


11

Con il punto di partenza della corsa

sepolgen /path/to/binary

che ti dà:

app.fc
app.sh
app.if
app.spec
app.te

Per creare un nuovo SELinux file contextda applicare a una directory padre che contiene i file che il tuo programma / demone modificherà, modifica il file app.te e aggiungi:

type app_var_t;
files_type(app_var_t)

La prima riga dichiara il nuovo tipo e la seconda riga chiama una macro che fa un po 'di magia e la rende un tipo di file (risulta che non è possibile utilizzare una riga di contesto del processo app_exec_t su un file o una directory), vedere "Tipi di Linux rivisitati" per ulteriori informazioni informazioni sui diversi tipi

Una volta dichiarato il tipo, devi dire a SELinux che la tua app è autorizzata a usarlo, nel mio caso ho aggiunto

allow app_t app_var_t:dir { add_name remove_name write search};
allow app_t app_var_t:file { unlink create open rename write read };

Queste due righe dicono sostanzialmente, consentono al tipo app_t che è il dominio della mia app, di scrivere / cercare / etc directory con il contesto app_var_te consentirgli di creare / aprire / cancellare / etc file con il contesto app_var_t

L'ultima parte del puzzle è in qualche modo dire a SELinux quali cartelle e file dovrebbero avere ogni tipo, lo fai modificando il app.fcfile (fc => contesto del file)

questo file ha solo due righe nel mio caso:

/srv/bot/app        --  gen_context(system_u:object_r:app_exec_t,s0)
/srv/bot(/.*)?          gen_context(system_u:object_r:app_var_t,s0)

la prima riga punta direttamente al binario come distribuito sui miei server, quindi questo ottiene il contesto app_exec_t.

La seconda riga significa:

App_var_t applicabile alla directory / srv / bot e anche a tutti i file all'interno della directory / srv / bot

Nota come ha la prima linea --tra il percorso e la chiamata a gen_context. --significa, applicarlo solo ai file. nel secondo caso non abbiamo nulla (solo spazi), il che significa che si applica a tutte le directory e i file corrispondenti, che è quello che volevo, un'altra opzione è quella -ddi applicare solo le directory.

Ora ho una politica funzionante, posso distribuire la mia app con una politica personalizzata e tutto funziona. (la mia politica ha molte più voci nel .tefile ma non rientra nell'ambito di questa domanda.)

Materiale di lettura extra che mi ha aiutato ad arrivare a questa soluzione:

Semplificare le cose con sepolgen

Pensa prima di controllare ciecamente audit2allow -M miodominio

SELinux PER LO SVILUPPO DEL CAPPELLO ROSSO (PDF lungo)

Un modulo SElinux (1): tipi e regole

Esempio di politica (specialmente postgresql)

Comprensione dei file Contesti File


Oppure usa CIL
Jakuje il

sepolgen /path/to/binarysputa un errore di sintassi per me. Sono su RHEL 7.6. Penso che sepolgen --application /path/to/binarysia la sintassi corretta se il tuo obiettivo è scrivere una politica per una particolare applicazione ??
Jayhendren,

Il tuo .tefile di lancia anche un errore di sintassi per me durante la compilazione del modulo: app.te:5:ERROR 'This block has no require section.' at token 'files_type' on line 5:. E se aggiungo una requiresezione, ottengo:ERROR 'syntax error' at token 'files_type' on line 13:
jayhendren il

Siamo spiacenti, non ho più accesso a una macchina Fedora per testarla, ma potrebbe essere che dalla versione 24 abbiano cambiato la sintassi.
fmpwizard,
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.