1. Preambolo
Security-Enhanced Linux (SELinux) è un modulo del kernel Linux e un sottosistema di sicurezza di Linux.
SELinux è stato sviluppato principalmente dalla NSA. I kernel Linux 2.6 e superiori integrano già moduli SELinux.
SELinux è molto complesso e ha molte cose concettuali difficili da imparare. Molti amministratori di sistema Linux hanno disattivato SELinux perché lo trovano problematico.
Se riesci a padroneggiare SELinux e usarlo correttamente, penso che l'intero sistema possa praticamente arrivare al punto di essere "indistruttibile" (ricorda sempre che non c'è una sicurezza assoluta).
Padroneggiare i concetti base di SELinux così come i metodi di configurazione semplici è un corso obbligatorio per ogni amministratore di sistema Linux.
Questo articolo si basa su CentOS 7.4.1708.
Questo articolo è puramente una condivisione e uno scambio di esperienze di apprendimento personale, gli errori sono inevitabili, solo per riferimento! Se trovi un errore, per favore fatelo, grazie mille!
2. Il ruolo di SELinux e il meccanismo di gestione dei permessi
2.1 Il ruolo di SELinux
La funzione principale di SELinux è minimizzare le risorse a cui i processi di servizio nel sistema possono accedere (il principio del minimo privilegio).
Immagina che se un servizio di rete che gira come root ha una vulnerabilità 0day, gli hacker possano sfruttare questa vulnerabilità per fare ciò che vogliono sul tuo server come root. Non fa paura?
SELinux è qui per risolvere questo problema.
2.2 DAC
In un sistema operativo che non utilizza SELinux, il fattore che determina se una risorsa può essere accessibile è se una risorsa possiede i permessi dell'utente corrispondente (leggere, scrivere, eseguire).
Finché il processo che accede a questa risorsa soddisfa le condizioni sopra indicate, può essere accessibile.
Il problema più fatale è che gli utenti root non sono soggetti a alcuna regolamentazione e qualsiasi risorsa sul sistema può essere accessibile senza restrizioni.
Il principale organismo di questo meccanismo di gestione dei permessi è l'utente, noto anche come controllo di accesso autonomo (DAC).
2.3 MAC
In un sistema operativo che utilizza SELinux, i fattori che determinano se una risorsa può essere accessibile non sono solo i fattori sopra indicati, ma anche se ogni tipo di processo ha accesso a un certo tipo di risorsa.
In questo modo, anche se un processo è in esecuzione come root, è necessario determinare il tipo di processo e i tipi di risorse che possono essere accessibili prima di decidere se consentire l'accesso a una risorsa. Lo spazio attivo del processo può anche essere compresso al minimo.
Anche un processo di servizio che funziona come root generalmente ha accesso solo alle risorse di cui ha bisogno. Anche se un programma è vulnerabile, l'ampiezza dell'impatto è limitata alle risorse a cui è consentito accedere. La sicurezza è notevolmente aumentata.
Il corpo principale di questo meccanismo di gestione dei permessi è il processo, noto anche come controllo di accesso obbligatorio (MAC).
MAC si suddivide in due modi: uno è chiamato modalità Category Security (MCS), l'altro è chiamato modalità Multi-Level Security (MLS).
Le seguenti azioni sono in modalità MCS.
2.4 Confronto tra DAC e MAC
Ecco un'immagine per illustrare.
Come puoi vedere, in modalità DAC, finché la directory corrispondente ha i permessi dell'utente corrispondente, è accessibile. In modalità MAC, è anche limitato dalla gamma di directory a cui i processi possono accedere.
3. Concetti di base di SELinux
3.1 Soggetto
Può essere completamente equiparato a un processo.
Nota: Per facilità di comprensione, salvo diversa specificazione, il processo è considerato come il corpo principale di seguito.
3.2 Obiettivo
Risorse a cui il principale ha accesso. Possono essere file, directory, porte, dispositivi, ecc.
Nota: Per facilità di comprensione, salvo diversa specificazione, i seguenti documenti o directory sono considerati oggetti.
3.3 Politica e Regola
Di solito ci sono molti file e processi nel sistema e, per risparmiare tempo e sovraccarichi, di solito regliamo selettivamente solo alcuni processi.
E quali processi debbano essere regolamentati e come controllarli è determinato dalla politica.
Ci sono più regole in una polizza. Alcune regole possono essere abilitate o disabilitate secondo necessità (d'ora in poi denominate regole booleane).
Le regole sono modulari ed estensionali. Quando installa una nuova applicazione, l'applicazione può aggiungere regole aggiungendo nuovi moduli. Gli utenti possono anche aggiungere o sottrarre manualmente le regole.
Nel sistema CentOS 7, ci sono tre insiemi di policy, ovvero:
1. mirato: Controlla la maggior parte dei processi di servizio di rete. Questa è la politica utilizzata dal sistema di default (tutte quelle qui sotto sono utilizzate).
2. Minimo: In base al target, sono regolamentati solo alcuni processi di servizio di rete. Generalmente no.
3. MLS: Protezione di sicurezza multilivello. Regola tutti i processi. Questa è la politica più severa e la configurazione è molto difficile. Generalmente, non viene utilizzata a meno che non ci siano requisiti di sicurezza estremamente elevati.
Le policy possono essere impostate in /etc/selinux/config.
3.4 Contesto di sicurezza
Il contesto della sicurezza è al centro di SELinux.
Contesto di sicurezza lo divido in "contesto di sicurezza dei processi" e "contesto di sicurezza documentale".
Un Contesto di Sicurezza del Processo corrisponde tipicamente a più Contesti di Sicurezza dei Documenti.
Solo quando il contesto di sicurezza corrisponde a entrambi può un processo accedere al file. La loro corrispondenza è determinata dalle regole della polizza.
Il contesto di sicurezza dei file è determinato da dove il file è stato creato e dal processo che lo ha creato. E il sistema ha un insieme di valori predefiniti, e gli utenti possono anche impostare i valori predefiniti.
È importante notare che semplicemente spostare i file non cambia il contesto di sicurezza dei tuoi file.
La struttura e il significato del contesto di sicurezza
Il contesto di sicurezza ha quattro campi, separati da due punti. Forma come: system_u:object_r:admin_home_t:s0.
3.5 Modalità di Funzionamento SELinux
SELinux ha tre modalità di funzionamento, ovvero:
1. applicazione: modalità forzata. Le violazioni delle regole SELinux verranno bloccate e registrate nei log.
2. Permissivo: modalità tolleranza. Le violazioni delle regole SELinux sono registrate solo nei log. Generalmente per il debug.
3. disabilitato: Disattiva SELinux.
La modalità di funzionamento SELinux può essere impostata in /etc/selinux/config.
Se vuoi passare da disabile a applicazione o permissivo, dovrai riavviare il sistema. E viceversa.
Le modalità di applicazione e permissive possono essere rapidamente commutate con il comando Setenforce 1|0.
È importante notare che se il sistema è stato in esecuzione con SELinux disattivato per un po', il primo riavvio dopo l'accensione di SELinux può essere più lento. Perché il sistema deve creare un contesto sicuro per i file sul disco (ho detto che avevo riavviato per circa 10 minuti e pensavo fosse morto...... )。
I log SELinux devono essere registrati con l'aiuto di auditd.service, per favore non disabilitarlo.
3.6 Flusso di lavoro SELinux
Ecco una citazione da una foto, senza molte spiegazioni.
Nota: Il testo di sicurezza sopra si riferisce al contesto di sicurezza.
4. Operazioni di base di SELinux
4.1 Interroga il contesto di sicurezza di un file o di una directory
Uso di base dei comandi
ls -z
Esempi di utilizzo
Consulta il contesto di sicurezza di /etc/hosts.
ls -Z /ecc/hosts
Risultati dell'esecuzione
-r-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts
4.2 Interroga il contesto di sicurezza del processo
Uso di base dei comandi
ps auxZ | grep -v grep | grep
Esempi di utilizzo
Interroga il contesto di sicurezza dei processi correlati a Nginx.
ps auxZ | grep -v grep | Grep Nginx
Risultati dell'esecuzione
system_u:system_r:httpd_t:s0 root 7997 0.0 0.0 122784 2156 ? Ss 14:31 0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: processo lavoratore
4.3 Modificare manualmente il contesto di sicurezza di un file o di una directory
Uso di base dei comandi
CHCON [...]
Funzione opzione -u Modifica il campo utente del contesto di sicurezza -r Modifica il campo ruolo del contesto di sicurezza -t Modifica il campo tipo del contesto di sicurezza -l Modifica il campo livello del contesto di sicurezza --riferimento Modifica il contesto di sicurezza coerente con il file o la directory specificato -R Operazione ricorsiva -h Modifica il contesto di sicurezza del soft link (modifica il file corrispondente del soft link senza questa opzione)
Esempi di utilizzo
Modifica il contesto di sicurezza del test in aaa_u:bbb_r:ccc_t:s0.
test chcon -u aaa_u -r bbb_r -t ccc_t
4.4 Ripristinare il contesto di sicurezza di un file o di una directory al suo valore predefinito
Uso di base dei comandi
RestoreCon [Opzioni] [...]
Funzione Opzione - Procedura di Operazione di Stampa V - Operazione Ricorsiva R
Esempi di utilizzo
Dopo aver aggiunto alcuni file web alla directory del tuo server Nginx, imposta il contesto di sicurezza corretto per questi nuovi file.
restorecon -R /usr/share/nginx/html/
4.5 Consulta le regole booleane e il loro stato nel sistema
Uso di base dei comandi
getsebool -a
Poiché il comando interroga tutte le regole o solo una, di solito interroga prima tutte le regole e poi filtra con grep.
Esempi di utilizzo
Consulta le regole booleane relative a httpd.
getsebool -a | grep httpd
Risultati dell'esecuzione
httpd_anon_write --> via
httpd_builtin_scripting -->
httpd_can_check_spam --> fuori
httpd_can_connect_ftp --> fuori
#以下省略
4.6 Cambio di regola booleana
Uso di base dei comandi
setsebool [opzione]
Funzione opzione -P riavvio è ancora in vigore
Esempi di utilizzo
Attiva httpd_anon_write regole.
setsebool -P httpd_anon_write on
4.7 Aggiungere un contesto di sicurezza predefinito per una directory
Uso di base dei comandi
semanage fcontext -a -t "(/.*)?"
Nota: Il contesto di sicurezza predefinito di una directory o di un file può essere visualizzato utilizzando il comando semanage fcontext -l insieme al filtraggio grep.
Esempi di utilizzo
Dopo aver aggiunto una nuova directory del sito /usr/share/nginx/html2 su Nginx, devi impostare lo stesso contesto di sicurezza predefinito della directory originale.
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
4.8 Aggiungere porte consentite da alcuni tipi di processi
Uso di base dei comandi
Porta SEMANAGE -A -T -P
Nota: I numeri di porta consentiti per vari tipi di servizio possono essere visualizzati utilizzando il comando semanage port -l con filtraggio grep.
Esempi di utilizzo
Per Nginx, devi usare la porta 10080 per i servizi HTTP.
Porta SEMANAGE -A -T http_port_t -P TCP 10080
5. Analisi e risoluzione degli errori SELinux
5.1 Comprendere i registri SELinux
Quando SELinux è abilitato, alcuni comportamenti normali di molti servizi sono considerati una violazione (sia nel titolo che negli errori sottostanti).
Al momento, dobbiamo utilizzare i log delle violazioni SELinux per analizzarle e risolverle.
I log delle violazioni SELinux sono salvati in /var/log/audit/audit.log.
/var/log/audit/audit.log 的内容大概是这样的。
type=LOGIN msg=audit(1507898701.391:515): pid=8523 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(nessuno) old-ses=4294967295 ses=25 res=1
Tipo=USER_START MSG=Audit(1507898701.421:516): PID=8523 UID=0 AUID=0 SES=25 Subj=system_u:system_r:crond_t:S0-S0:C0.C1023 MSG='op=PAM:session_open Grantors=pam_loginuid,pam_ keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=successo'
...
Il file è molto contenuto, ed è mescolato con molti log di audit di sistema che non hanno nulla a che fare con errori SELinux. Useremo l'utilità sealert per aiutare con l'analisi (se il prompt non trova il comando, installa il pacchetto setroubleshoot).
5.2 Analizza gli errori con sealert
Uso di base dei comandi
SeAlert -A /var/log/audit/audit.log
Dopo aver eseguito il comando, il sistema deve prendersi del tempo per analizzare le violazioni nei log e fornire un rapporto di analisi. |