Introduzione
SELinux è un'architettura modulare inclusa dal kernel 2.6.x in Linux, ideata e sviluppata dalla comunity SELinux e dalla NSA al fine di aumentare la sicurezza dei sistemi Linux. Occorre precisare che SELinux non è né un firewall, né un software antivirus, né tanto meno una soluzione di sicurezza omnicomprensiva. Tutti i processi e i file sono contrassegnati con un tipo, esso definisce un dominio per i processi. Ogni processo è isolato rispetto agli altri processi e file, ciò è possibile perché l'esecuzione è effettuata all'interno del proprio dominio d'esecuzione, le regole SELinux definiscono come i processi ed i file possono interagire tra di loro.
Il sistema alla base del funzionamento di SELinux è quello MAC, acronimo di "Mandatory Access Control", ogni processo viene eseguito con i permessi associati all'utente proprietario del task, in tal modo il sistema viene protetto dai processi che mirano a destabilizzare la sicurezza del sistema. SELinux se eseguito è completamente invisibile agli utenti, solo gli amministratori, infatti, avranno la possibilità di impostare le policy e solo essi riceveranno delle notifiche. Ogni qualvolta che un'applicazione crea un oggetto (ad esempio un file), il server responsabile della sicurezza SELinux in esecuzione in modalità demone nel kernel di Linux, controllerà le policy memorizzate all'interno dell'AVC (Access Vector Cache) dove sono immagazzinati i permessi degli oggetti e dei soggetti coinvolti.
La richiesta è propagata sino a che non è rilevata una policy adeguata all'azione da compiere. SELinux è incluso in tutte le distribuzioni Red Hat e derivate, può essere amministrato sia da riga di comando che da GUI, un esempio di utilizzo tramite GUI viene visualizzato in figura, nel caso in esame usufruiamo dell'interfaccia grafica minimale SELinux offerta da Centos 5.
I Log SELinux
Ad ogni richiesta, come accennato in precedenza, viene controllato automaticamente l'AVC, nel caso in cui "il contesto d'esecuzione" venga rifiutato, SELinux manterrà traccia dell'operazione di "denied" all'interno del file di log ospitato in /var/log/messages, naturalmente la lettura di tale file è consentita ai soli utenti root per default. SELinux potrebbe creare più di un file di log, dipende della quantità di log creati.
Le modalità d'esecuzione
SELinux prevede due modalità d'esecuzione alle quali si aggiunge naturalmente l'opzione "disabilitato", optando per la disabilitazione SELinux non effettuerà alcun controllo di protezione sui processi eseguiti. Mentre se abilitato SELinux potrà funzionare in modalità "enforcing" oppure "permissive", in quest'ultima modalità non è attiva alcuna restrizione, ma l'AVC viene controllato ugualmente e tutti gli accessi che non rispettino la policy (denied) saranno registrati. Nella modalità enforcing SELinux, impostata la propria policy di sicurezza e contemporaneamente vieta gli accessi alle risorse o processi che non soddisfino la policy.
Mettiamoci all'opera
Dopo una doverosa descrizione teorica siamo pronti ad utilizzare SELinux, per illustrarne il funzionamento utilizzeremo la shell di Linux, naturalmente potete installare le diverse GUI presenti nelle varie distribuzioni. Il primo passo da compiere e verificare in quale modalità SELinux è in esecuzione, per compiere tale operazione utilizzeremo il seguente comando
$ /usr/sbin/getenforce
Il comando getenforce restituirà secondo la modalità d'esecuzione attuale di SELinux Enforcing, Permissive o Disabilitato, nell'esempio visualizzato in figura 2 la modalità attiva è Permissive, il che significa che il nostro SELinux è attivo ma non abbiamo ancora configurato alcuna policy, rendendo quindi valide le sole regole DAC.
Per la verifica dello stato di SELinux e delle relative policy presenti si utilizzerà il comando:
/usr/sbin/sestatus
Configurazione ed abilitazione di SELinux
Il file /usr/selinux/config visualizzabile con qualsiasi editor di testo contiene al suo interno lo stato di SELinux, in particolare focalizziamo la nostra attenzione sulla direttiva SELINUX, tramite la quale sarà possibile in qualsiasi momento visualizzare lo stato in cui SELinux opera, nell'esempio mostrato in figura, esso viene posto nello stato "disabled".
All'interno del file config al fine di attivare le funzionalità di SELinux si dovrà impostare il valore di SELINUX=premissive, per far ciò potremo utilizzare ancora una volta un normale editor, eseguita la modifica come utente root occorrerà effettuare un reboot del sistema, tale operazione è resa necessaria al fine di poter assegnare una contesto ai vari file.
Le booleane SELinux
Un modo semplice per l'impostazione delle policy SELinux è quello di utilizzare le booleane, esse offrono la possibilità di modificare parti delle policy a runtime, particolarmente utili risultano nella concessione di permessi ai servizi che hanno la necessità di accedere al file NFS senza dover ricaricare e ricompilare l'intera policy SELinux. È possibile visualizzare le booleane impostate all'interno del nostro sistema richiamando come utente root il comando:
getsebool –a
È altresì possibile interrogare una singola booleana utilizzando il comando:
getsebool nome_booleana
Supponendo di voler verificare il valore della booleana httpd_can_network_connect_db digiteremo:
getsebool http_can_network_connect_db
Questa booleana indica agli script ed ai moduli di Apache di potersi connettersi ai server di database (per default la booleana in oggetto è impostata su off). Per una lista completa delle booleane settabili, consiglio di visualizzare l'apposita pagina wiki SelinuxBoolean messa a disposizione dagli sviluppatori di CentOS.
Un semplice esempio di policy SELinux
Proponiamo un semplicissimo esempio di policy SELinux avvalendoci delle booleane. Supponiamo di utilizzare una Linux box per ospitare il server web Apache, il quale dovrà gestire un singolo sito web costituito da sole pagine statiche (.html o .htm), il nostro obiettivo sarà quello di impedire al demone httpd di accedere alle home directory degli utenti, oppure di aprire socket verso database. Per scelta la policy SELinux sui sistemi Fedora e CentOS permette ad Apache di eseguire script CGI e leggere la home directory degli utenti, per modificare tale comportamento impartiamo i seguenti comandi:
setsebool httpd_enable_cgi false setsebool httpd_enable_homedirs false
Tramite le setsebool indichiamo al sistema che httpd non dovrà abilitare la lettura alle home directory degli utenti e non dovrà eseguire alcun script CGI, naturalmente impostando a true le setsebool sopraindicate abiliteremo sia la lettura che l'esecuzione dei CGI.
Conclusioni
SELinux offre una sicurezza aggiuntiva al nostro sistema. SELinux può risultare ostico sia dal punto di vista della gestione, sia dal punto di vista dell'implementazione, esistono diversi tools grafici che semplificano la vita agli amministratori di sistema, uno di questi è SEEdit, utilizzabile sia in Fedora 8 che CentOS 5. SELinux è un prodotto sviluppato da Hitachi Software e prelevabile nell'area download del sito ufficiale SEEdit.