SELinux: tre leve diverse, non un unico comando
Quando si lavora con SELinux, il punto chiave è questo: non stai “aprendo la porta” in un solo modo. Stai intervenendo su tre piani diversi.
- Etichette dei file: dicono a SELinux che ruolo ha un file o una directory.
- Regole permanenti: dicono a SELinux che un certo path deve avere sempre una certa etichetta.
- Booleani: attivano o disattivano comportamenti già previsti dalle policy.
I tre comandi che citi servono proprio a questo:
restoreconriallinea le etichette ai valori previsti dalle policy.semanagemodifica in modo persistente la configurazione SELinux, per esempio i contesti dei file o i booleani.setseboolcambia un booleano SELinux, spesso in modo temporaneo se non usi l’opzione di persistenza.
Se li confondi, rischi due problemi tipici: fare una modifica che sparisce al reboot, oppure lasciare una regola “sporca” che funziona oggi ma si rompe alla prossima correzione automatica delle label.
restorecon: ripristino delle etichette corrette
restorecon serve a ripristinare il contesto SELinux standard di file e directory leggendo le regole definite nel sistema. In pratica confronta l’etichetta attuale con quella attesa e, se necessario, la corregge.
È il comando giusto quando:
- hai copiato file in una nuova posizione;
- hai creato directory per un servizio web, mail o database;
- hai visto un errore SELinux su un path che dovrebbe essere già previsto dalle policy.
Esempio tipico con Apache o Nginx:
restorecon -Rv /var/www/html
Con -R applichi ricorsivamente, con -v vedi cosa cambia. Se vuoi solo verificare senza modificare, usa prima la modalità di prova:
restorecon -nRv /var/www/html
Il valore operativo di restorecon è questo: non inventa una regola nuova, riporta un path alla condizione prevista. Se il path è fuori standard, la correzione può essere solo temporanea: al prossimo allineamento tornerà la label “ufficiale”.
Per questo restorecon è spesso il primo test da fare quando SELinux blocca un servizio e tu sai che il file è nel posto giusto ma con contesto sbagliato.
Quando usarlo
- Hai copiato contenuti in una nuova directory e il web server non li legge.
- Hai ripristinato un backup e i file hanno label errate.
- Hai appena creato una cartella per upload, socket, log o cache.
Quando non basta
- Se il path non è previsto dalla policy,
restoreconnon risolve in modo stabile. - Se il servizio deve accedere a una directory non standard, serve una regola con
semanage fcontext.
semanage: configurazione permanente di SELinux
semanage è lo strumento per fare modifiche persistenti alla configurazione SELinux. Il caso più comune in ambito web è la gestione dei contesti dei file con semanage fcontext.
In parole semplici:
restoreconapplica le label attese;semanage fcontextdice a SELinux quali label devono essere attese per un certo percorso.
Esempio: vuoi che una directory custom usata da un sito web venga trattata come contenuto web leggibile dal server:
semanage fcontext -a -t httpd_sys_content_t '/srv/site(/.*)?'
Poi devi applicare le etichette al filesystem:
restorecon -Rv /srv/site
Questo è il flusso corretto: prima definisci la regola, poi allinei i file. Se fai solo restorecon, la correzione può funzionare oggi ma non restare coerente con la tua struttura custom. Se fai solo semanage, la regola esiste ma i file già presenti possono restare con label vecchie finché non li riallinei.
semanage gestisce anche i booleani, ma in modo amministrativo e persistente. Per esempio, puoi listare i booleani disponibili:
semanage boolean -l
Però, nella pratica quotidiana, il comando più usato resta quello sui contesti dei file.
Quando usarlo
- Hai un path non standard, come
/srv,/datao una mount dedicata. - Devi rendere permanente l’accesso di un servizio a una directory custom.
- Vuoi evitare di dover rifare la correzione dopo ogni restore o deploy.
Perché è importante in produzione
Molti problemi SELinux nascono da un errore concettuale: si cambia la label “a mano” su un file, ma non si definisce la regola permanente. Dopo un reboot, un restore, un deploy o un restorecon automatico, il problema torna. Con semanage fcontext invece formalizzi la scelta e riduci il rischio di drift.
Regola pratica: se il path è “strano” ma legittimo, usa
semanage fcontexte poirestorecon. Se il path è standard ma la label è sbagliata, basta spessorestorecon.
setsebool: attivare o disattivare comportamenti della policy
I booleani SELinux sono interruttori che abilitano o disabilitano comportamenti previsti dalla policy. setsebool serve a modificarli.
Esempio classico: un web server deve fare connessioni in uscita verso un database o un backend esterno. SELinux può bloccarlo finché non abiliti il booleano corretto. In quel caso il comando può essere:
setsebool -P httpd_can_network_connect on
Qui l’opzione -P rende la modifica persistente. Senza -P, la variazione può essere temporanea e sparire al reboot.
Questa differenza è fondamentale:
setseboolcambia il valore di un booleano;setsebool -Plo rende permanente;semanage boolean -lti aiuta a vedere i booleani disponibili e il loro stato.
Un booleano non serve a correggere una label sbagliata. Non sostituisce restorecon o semanage fcontext. Se il problema è un contesto file errato, il booleano non c’entra. Se il problema è una capability generica disabilitata nella policy, allora sì.
Esempi comuni
httpd_can_network_connect: consente al web server di fare connessioni di rete in uscita.httpd_enable_homedirs: consente accesso a contenuti web in home directory, quando previsto.ftpd_full_accesso booleani simili: dipende dal servizio e dalla policy installata.
Il nome esatto del booleano dipende dalla distribuzione e dal modulo di policy installato. Non va indovinato: va verificato con:
getsebool -a | grep httpd
oppure:
semanage boolean -l | grep httpd
Se non trovi il booleano giusto, stai probabilmente guardando il problema sbagliato oppure manca il modulo di policy appropriato.
Differenza pratica tra i tre comandi
La distinzione utile, quella che ti evita ore di tentativi, è questa:
restorecon= “rimetti il file nella label giusta”.semanage= “definisci che quella label è giusta per quel path”.setsebool= “accendi o spegni una funzione della policy”.
Se il sito web non legge file in una directory custom, la sequenza corretta spesso è:
- verificare il contesto attuale con
ls -Z; - capire se il path è standard o no;
- se è standard, fare
restorecon; - se è custom, definire la regola con
semanage fcontext; - applicare le label con
restorecon; - solo se serve una funzione di policy, usare
setsebool.
Come diagnosticare un blocco SELinux senza andare a caso
Il metodo corretto è osservare prima l’evidenza, poi intervenire. I comandi base sono questi:
getenforce
Ti dice se SELinux è Enforcing, Permissive o Disabled.
ls -Z /var/www/html
Ti mostra il contesto SELinux dei file o delle directory.
ausearch -m avc -ts recent
Ti mostra i denials recenti, se il logging di audit è attivo.
journalctl -t setroubleshoot --since
