Security-Enhanced Linux (SELinux) per comuni mortali

Security-Enhanced Linux (SELinux) è un software che fornisce una serie di strumenti per attuare e monitorare politiche di sicurezza sui sistemi Linux. Sviluppato in origine dalla NSA (National Security Agency) nel 2000 come patch per il kernel, e adottato dalla comunità Linux nel 2003, dopo che l’Agenzia Governativa Statunitense lo ha rilasciato con licenza GNU/GPL. SELinux è un’implementazione del MAC (Mandatory Access Control). Storicamente i sistemi Linux/Unix usano il DAC (Discretionary Access Control), che identifica un meccanismo di controllo degli accessi alle risorse messe a disposizione da un sistema, nel quale i soggetti possiedono l’ownership degli oggetti da loro creati e possono concedere o revocare a loro discrezione alcuni privilegi ad altri soggetti. In un sistema nel quale è realizzata una politica di controllo degli accessi di tipo DAC, l’autorizzazione degli accessi alle risorse del sistema è basata sull’identità degli utenti e/o sul gruppo utenti di appartenenza.

Come funziona SELinux
E’ possibile determinare quale policy il sistema sta utilizzando, guardando il file di configurazione /etc/selinux/config. Di default questo risulta avere il seguente settaggio:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

Il primo parametro (SELINUX=enforcing) significa che il sistema è protetto da SELinux, mentre il secondo parametro (SELINUXTYPE=targeted) fa riferimento alla politica adottata. La politica MLS (Multi-level Security Protection), generalmente molto più complessa, non verrà presa in considerazione in questo articolo.

Può essere utilizzato per verificare i settaggi anche il link simbolico /etc/sysconfig/selinux. E’ possibile, atresì, verificare le impostazioni di SELinux con il comando /usr/sbin/sestatus, che restituisce un output simile:

[dandy@localhost ~]$ /usr/sbin/sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28

o tramite il comando /usr/sbin/getenforce (1 significa che SELinux è abilitato, mentre 0 significa che è disabilitato) .
SELinux si basa su due concetti fondamentali: il “labeling” (applicato a file, directory, processi, porte) e il “type enformcement”. Il formato utilizzato dal labeling è il seguente: user:role:type:level.
Di seguito riportiamo alcuni esempi (la Z maiuscola mostra il labeling corrispondente alle directory prese in esame):

[dandy@localhost ~]$ ls -dZ /etc/httpd/
drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 /etc/httpd/

[dandy@localhost ~]$ ls -dZ /var/log/httpd/
drwx——. root root system_u:object_r:httpd_log_t:s0 /var/log/httpd/

[dandy@localhost ~]$ ls -dZ /var/www/html/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

La Z maiuscola può essere applicata anche al comando netstat, come di seguito riportato:

netstat -tnlpZ | grep httpd
tcp6 0 0 :::80 :::* LISTEN 12060/httpd system_u:system_r:httpd_t:s0

Con il comando semanage port -l verifichiamo quali porte sono disponibili per il servizio http:

semanage port -l | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989

Verifichiamo il labeling applicato a un file:
[dandy@localhost ~]$ ls -Z /etc/shadow
———-. root root system_u:object_r:shadow_t:s0 /etc/shadow

Il type enforcement, invece, è quella parte della policy che spiega come, ad esempio, un processo avviato con l’etichetta httpd_t può avere accesso in lettura a un file etichettato con httpd_config_t.

Per verificare il contesto in cui opera SELinux, si utilizza l’argomento -Z associato a molti comandi Linux. Ad esempio:
[dandy@localhost ~]$ ls -Z
[dandy@localhost ~]$ id -Z
[dandy@localhost ~]$ ps -Z
[dandy@localhost ~]$ netstat -Z

Come si gestisce il labeling?
Esistono due comandi, chcon (esempio: chcon -t httpd_sys_content_t /var/www/html/index.html) e restorecon (esempio: restorecom -vR /var/www/html), che permettono il primo di cambiare il contesto di un file e il secondo di restituire il contesto originario ad un file. Il comando chcon può essere usato con l’argomento –reference per utilizzare il contesto di una directory e applicarlo ad un file all’interno di quella directory. Esempio: chcon –reference /var/www/html /var/www/html/index.html.

I contesti vengono impostati anche quando vengono creati i file, sulla base del contesto della loro directory madre (a parte alcune eccezioni). Anche i pacchetti RPM possono essere configurati con i contesti come parte della loro installazione.

Il comando semanage può essere utilizzato per gestire la configurazione SELinux per:
-login
-utenti
-porte
-interfacce
-moduli
-nodi
-contesto dei file
-booleani
-cambiare lo stato da enforcing a permissive

Esempio di utilizzo di semanage:
semanage fcontext -a -t httpd_sys_content_t “/foo(/.*)?”
Questo comando aggiunge il contesto “httpd_sys_content_t” a tutti i file appartenenti alla directory foo. Il seguente comando viene utilizzato se si vuole trasferire il contesto di una directory (es. /var/www) in un’altra (es. /foo/).
Esempio:
semanage fcontent -a -e /var/www/ /foo/
Se si vuole ritornare alla situazione di partenza, di seguito il comando da usare:
restore -vR /foo/

Cosa sono i booleani?
I booleani sono delle impostazioni on/off per SELinux. Per vedere tutti i booleani, usare il comando getsebool -a. Per impostare un valore booleano, utilizzare il comando setsebool [boolean] [0|1]. Per rendere il valore permanente, utilizzare l’argomento -P. Es: setsebool -P [boolean] [0|1]. Nel caso si stiano sviluppando dei nuovi moduli e si vogliano impostare le policy su di essi, si consiglia di installare i tool setroubleshoot e setroubleshoot-server. Questi installano una pletora di strumenti in grado di effettuare diagnosi e correggere i problemi con SELinux. Una volta installati questi tool, è necessario riavviare il daemon auditd.

[dandy@localhost ~]$ yum -y install setroubleshoot setroubleshoot-server
[dandy@localhost ~]$ systemctl restart auditd

Come verificare quali valori booleani sono stati impostati?
I boolean impostati si trovano all’interno del file booleans.local:
cat /etc/selinux/targeted/active/booleans.local

Se i booleani e il labeling non risolvono il problema, potresti dover creare un modulo di policy.
Vediamo un esempio concreto. Dopo aver installato il client di posta Squirrelmail, l’accesso viene negato. La prima cosa da verificare è il file /var/log/audit/messages. Si avvii il comando setenforce con il parametro 0 per disabilitare SELinux. Una volta disabilitato, si potrà utilizzare normalmente il client di posta Squirrelmail. Il suo utilizzo genererà una serie di warning in “/var/log/messages” che indicheranno in che modo creare il modulo di policy.
Esempio:
grep httpd /var/log/audit/audit.log | audit2allow -M squirrellocal
Per rendere il modulo di policy attivo:
semodule -i squirrellocal.pp
Riattivare SELinux sulla propria macchina:
setenforce 1

Abilitare il tool grafico per SELinux
Per abilitare il tool grafico di SELinux, è necessario installare i seguenti pacchetti: xorg-x11-xauth, un font (si può usare il comando yum groupinstall fonts), e policycoreutils-gui. In tal modo si può avviare system-config-selinux ed avere un tool grafico per la gestione di SELinux.