"È un fatto importante e popolare che le cose non sono sempre come sembrano..."
―Douglas Adams, Guida galattica per autostoppisti
Sicurezza. Indurimento. Conformità. Politica. I quattro cavalieri dell'Apocalisse SysAdmin. Oltre alle nostre attività quotidiane (monitoraggio, backup, implementazione, messa a punto, aggiornamento e così via), siamo anche responsabili della protezione dei nostri sistemi. Anche quei sistemi in cui il fornitore di terze parti ci dice di disabilitare la sicurezza avanzata. Sembra un lavoro per Mission Impossible è Ethan Hunt.
Di fronte a questo dilemma, alcuni amministratori di sistema decidono di prendere la pillola blu perché pensano che non sapranno mai la risposta alla grande domanda della vita, dell'universo e di tutto il resto. E, come tutti sappiamo, la risposta è 42 .
Nello spirito di Guida galattica per autostoppisti , ecco le 42 risposte alle grandi domande sulla gestione e l'utilizzo di SELinux con i tuoi sistemi.
- SELinux è un sistema di ETICHETTA, il che significa che ogni processo ha un'ETICHETTA. Ogni file, directory e oggetto di sistema ha un'ETICHETTA. Le regole dei criteri controllano l'accesso tra i processi etichettati e gli oggetti etichettati. Il kernel applica queste regole.
- I due concetti più importanti sono:Etichettatura (file, processo, porte, ecc.) e Imposizione del tipo (che isola i processi l'uno dall'altro in base ai tipi).
- Il formato etichetta corretto è
user:role:type:level
(facoltativo ).
- Lo scopo dell'applicazione della sicurezza multilivello (MLS) è controllare i processi (domini ) in base al livello di sicurezza dei dati che utilizzerà. Ad esempio, un processo segreto non può leggere dati top secret.
- Applicazione della sicurezza multicategoria (MCS) protegge processi simili l'uno dall'altro (come macchine virtuali, ingranaggi OpenShift, sandbox SELinux, container, ecc.).
- Parametri del kernel per modificare le modalità SELinux all'avvio:
autorelabel=1
→ forza la rietichettatura del sistemaselinux=0
→ il kernel non carica nessuna parte dell'infrastruttura SELinuxenforcing=0
→ avvio in modalità permissiva
- Se devi rietichettare l'intero sistema:
# touch /.autorelabel
# rebootSe l'etichettatura del sistema contiene una grande quantità di errori, potrebbe essere necessario eseguire l'avvio in modalità permissiva affinché l'etichettatura automatica riesca.
-
Per verificare se SELinux è abilitato:
# getenforce
-
Per abilitare/disabilitare temporaneamente SELinux:
# setenforce [1|0]
-
Strumento di stato di SELinux:
# sestatus
-
File di configurazione:
/etc/selinux/config
- Come funziona SELinux? Ecco un esempio di etichettatura per un server Web Apache:
- Binario:
/usr/sbin/httpd
→httpd_exec_t
- Directory di configurazione:
/etc/httpd
→httpd_config_t
- Directory del file di registro:
/var/log/httpd
→httpd_log_t
- Rubrica dei contenuti:
/var/www/html
→httpd_sys_content_t
- Script di avvio:
/usr/lib/systemd/system/httpd.service
→httpd_unit_file_d
- Processo:
/usr/sbin/httpd -DFOREGROUND
→httpd_t
- Porte:
80/tcp, 443/tcp
→httpd_t, http_port_t
- Binario:
Un processo in esecuzione in httpd_t
il contesto può interagire con un oggetto con httpd_something_t
etichetta.
- Molti comandi accettano l'argomento
-Z
per visualizzare, creare e modificare il contesto:ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
I contesti vengono impostati quando i file vengono creati in base al contesto della directory principale (con alcune eccezioni). Gli RPM possono impostare i contesti come parte dell'installazione.
- Ci sono quattro cause principali degli errori di SELinux, che sono ulteriormente spiegate negli articoli 15-21 di seguito:
- Problemi di etichettatura
- Qualcosa che SELinux deve sapere
- Un bug in una policy/app SELinux
- Le tue informazioni potrebbero essere compromesse
- Problema di etichettatura: Se i tuoi file in
/srv/myweb
non sono etichettati correttamente, l'accesso potrebbe essere negato. Ecco alcuni modi per risolvere questo problema:- Se conosci l'etichetta:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- Se conosci il file con l'etichettatura equivalente:
# semanage fcontext -a -e /srv/myweb /var/www
- Ripristina il contesto (per entrambi i casi):
# restorecon -vR /srv/myweb
- Se conosci l'etichetta:
- Problema di etichettatura: Se sposti un file invece di copiarlo, il file mantiene il suo contesto originale. Per risolvere questi problemi:
-
Modifica il comando contestuale con l'etichetta:
$ sudo chcon -t httpd_system_content_t /var/www/html/index.html
-
Modifica il comando di contesto con l'etichetta di riferimento:
$ sudo chcon --reference /var/www/html/ /var/www/html/index.html
-
Ripristina il contesto (per entrambi i casi):
$ sudo restorecon -vR /var/www/html/
-
-
Se SELinux ha bisogno di sapere HTTPD è in ascolto sulla porta 8585, di' a SELinux:
$ sudo semanage port -a -t http_port_t -p tcp 8585
-
SELinux deve sapere boolean consentono di modificare parti della politica di SELinux in fase di esecuzione senza alcuna conoscenza della scrittura della politica di SELinux. Ad esempio, se vuoi che httpd invii email, inserisci:
$ sudo setsebool -P httpd_can_sendmail 1
- SELinux deve sapere I booleani sono solo impostazioni off/on per SELinux:
- Per vedere tutti i booleani:
# getsebool -a
- Per vedere la descrizione di ciascuno:
# semanage boolean -l
- Per impostare un booleano esegui:
# setsebool [_boolean_] [1|0]
- Per configurarlo in modo permanente, aggiungi
-P
. Ad esempio:
# setsebool httpd_enable_ftp_server 1 -P
- Per vedere tutti i booleani:
- Le politiche/app di SELinux possono avere dei bug, inclusi:
- Percorsi di codice insoliti
- Configurazioni
- Reindirizzamento di
stdout
- Descrittori di file trapelati
- Memoria eseguibile
- Librerie mal costruite
- Le tue informazioni potrebbero essere compromesse se hai domini confinati cercando di:
- Carica i moduli del kernel
- Disattiva la modalità di applicazione di SELinux
- Scrivi su
etc_t/shadow_t
- Modifica le regole di iptables
- Strumenti SELinux per lo sviluppo di moduli di policy:
$ yum -y install setroubleshoot setroubleshoot-server
Riavvia o riavvia
auditd
dopo l'installazione.
- Usa
journalctl
per elencare tutti i log relativi asetroubleshoot
:$ sudo journalctl -t setroubleshoot --since=14:20
- Usa
journalctl
per elencare tutti i log relativi a una particolare etichetta SELinux. Ad esempio:$ sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
-
Usa
setroubleshoot
log quando si verifica un errore SELinux e suggerire alcune possibili soluzioni. Ad esempio, dajournalctl
:Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
SELinux is preventing httpd from getattr access on the file /var/www/html/index.html.
***** Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label,
/var/www/html/index.html default label should be httpd_syscontent_t.
Then you can restorecon.
Do
# /sbin/restorecon -v /var/www/html/index.html
- Registrazione:SELinux registra informazioni ovunque:
/var/log/messages
/var/log/audit/audit.log
/var/lib/setroubleshoot/setroubleshoot_database.xml
-
Registrazione:ricerca di errori SELinux nel registro di controllo:
$ sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
-
Per cercare i messaggi SELinux Access Vector Cache (AVC) per un particolare servizio:
$ sudo ausearch -m avc -c httpd
- Il
audit2allow
l'utilità raccoglie le informazioni dai registri delle operazioni negate e quindi genera le regole di policy-allow di SELinux. Ad esempio:- Per produrre una descrizione leggibile dall'uomo del motivo per cui l'accesso è stato negato:
# audit2allow -w -a
- Per visualizzare la regola di imposizione del tipo che consente l'accesso negato:
# audit2allow -a
- Per creare un modulo personalizzato:
# audit2allow -a -M mypolicy
Il-M
l'opzione crea un file di imposizione del tipo (.te) con il nome specificato e compila la regola in un pacchetto di criteri (.pp):mypolicy.pp mypolicy.te
- Per installare il modulo personalizzato:
# semodule -i mypolicy.pp
- Per produrre una descrizione leggibile dall'uomo del motivo per cui l'accesso è stato negato:
- Per configurare un singolo processo (dominio) per l'esecuzione di permissive:
# semanage permissive -a httpd_t
- Se non vuoi più che un dominio sia permissivo:
# semanage permissive -d httpd_t
-
Per disabilitare tutti i domini permissivi:
$ sudo semodule -d permissivedomains
-
Abilitazione del criterio MLS di SELinux:
$ sudo yum install selinux-policy-mls
In
/etc/selinux/config:
SELINUX=permissive
SELINUXTYPE=mlsAssicurati che SELinux sia in esecuzione in modalità permissiva:
$ sudo setenforce 0
Usa i
fixfiles
script per garantire che i file vengano rietichettati al prossimo riavvio:$ sudo fixfiles -F onboot
$ sudo reboot
-
Crea un utente con un intervallo MLS specifico:
$ sudo useradd -Z staff_u tux
Usando il
useradd
comando, mappa il nuovo utente su un utente SELinux esistente (in questo caso,staff_u
).
-
Per visualizzare la mappatura tra utenti SELinux e Linux:
$ sudo semanage login -l
-
Definisci un intervallo specifico per un utente:
$ sudo semanage login --modify --range s2:c100 tux
-
Per correggere l'etichetta sulla home directory dell'utente (se necessario):
$ sudo chcon -R -l s2:c100 /home/tux
-
Per elencare le categorie correnti:
$ sudo chcat -L
-
Per modificare le categorie o per iniziare a crearne di tue, modifica il file come segue:
/etc/selinux/_<selinuxtype>_/setrans.conf
-
Per eseguire un comando o uno script in un file, ruolo e contesto utente specifici:
$ sudo runcon -t initrc_t -r system_r -u user_u yourcommandhere
- -t è il contesto del file
- -r è il contesto del ruolo
- -u è il contesto utente
- Contenitori in esecuzione con SELinux disabilitato:
- Con Podman:
# podman run --security-opt label=disable …
- Con Docker:
# docker run --security-opt label=disable …
- Con Podman:
- Se è necessario concedere a un container l'accesso completo al sistema:
- Con Podman:
# podman run --privileged …
- Con Docker:
# docker run --privileged …
- Con Podman:
E con questo, conosci già la risposta. Quindi, per favore: Non farti prendere dal panico e attiva SELinux .
Fonti:
- SELinux di Dan Walsh
- La tua guida visiva per l'applicazione delle politiche di SELinux anche da Dan Walsh
- Linux Security Enhanced per comuni mortali di Thomas Cameron
- Il libro da colorare SELinux di Máirín Duffy
- Guida per utenti e amministratori di SELinux—Red Hat Enterprise Linux 7