I contesti (context) in Selinux

Una parte fondamentale di SELinux è la comprensione e l’utilizzo dei contesti di SELinux. Tutto, sul tuo sistema, contiene un contesto (context) e questi sono usati per determinare quali utenti, applicazioni e servizi hanno accesso a quali file, directory e applicazioni. Anche senza la comprensione della creazione di una politica dettagliata, la maggior parte degli utenti di SELinux possono gestire i loro sistemi attraverso l’uso e l’alterazione dei contexts.

Ci sono tre tipi di context in SELinux, che sono spiegati meglio visualizzando le autorizzazioni SELinux su un file. Per visualizzare il contesto SELinux di una directory, utilizzare il comando ls con un flag -Z. Questo è per la directory /var/www/:

[vagrant@centos www]$ ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html

la parte che ci interessa dell’output è la seguente:

system_u: object_r: httpd_sys_script_exec_t.

Questi sono i tre contesti di un file. Diamo un’occhiata più approfondita:

 

 

 

User Context

La prima porzione blu è il contesto dell’utente. Questo ha tre valori disponibili: user_u, system_u e root. Ognuno di questi indica quale tipo generale di utente può accedere a questo file, non quale utente in particolare. Con un contesto utente di user_u, gli utenti di accesso medio possono accedere al file (rispetto alle normali autorizzazioni di file); un valore di system_u indica un utente di sistema, come nell’esempio sopra; infine, root significa che solo l’utente root del sistema può accedere al file.

Role Context

Il contesto di ruolo, di color magenta nell’esempio sopra, viene utilizzato principalmente per processi e domini. L’utente medio di SELinux potrebbe non averne bisogno. Per file e directory, questo è sempre object_u.

Type Context

Il tipo di contesto, è probabilmente il contesto più importante su cui concentrarsi quando si impostano le autorizzazioni SELinux. Il Type Context fornisce il controllo associato a SELinux. Il tuo sistema, anche con solo SELinux predefinito abilitato e nessuna modifica apportata, ha un numero consistente di context. Utilizzare il comando semanage fcontext -l per visualizzare tutti i tipi disponibili. Si consiglia di eseguire il pipe su grep quando si esaminano i contesti per specifici file o servizi. L’output utilizza espressioni regolari per indicare se i contesti dati sono ricorsivi.

Ad esempio, qui ci sono tutte le directory con un contesto di tipo httpd_sys_content_t su un’installazione di CentOS 7:

[vagrant@centos ~]$ sudo semanage fcontext -l | grep "httpd_sys_content"
/srv/([^/]*/)?www(/.*)?                            all files          system_u:object_r:httpd_sys_content_t:s0
/var/www(/.*)?                                     all files          system_u:object_r:httpd_sys_content_t:s0
/etc/htdig(/.*)?                                   all files          system_u:object_r:httpd_sys_content_t:s0
/srv/gallery2(/.*)?                                all files          system_u:object_r:httpd_sys_content_t:s0
/var/lib/trac(/.*)?                                all files          system_u:object_r:httpd_sys_content_t:s0
/var/lib/htdig(/.*)?                               all files          system_u:object_r:httpd_sys_content_t:s0
/var/www/icons(/.*)?                               all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/glpi(/.*)?                              all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/htdig(/.*)?                             all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/drupal.*                                all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/z-push(/.*)?                            all files          system_u:object_r:httpd_sys_content_t:s0
/var/www/svn/conf(/.*)?                            all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/icecast(/.*)?                           all files          system_u:object_r:httpd_sys_content_t:s0
/var/lib/cacti/rra(/.*)?                           all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/ntop/html(/.*)?                         all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/doc/ghc/html(/.*)?                      all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/openca/htdocs(/.*)?                     all files          system_u:object_r:httpd_sys_content_t:s0
/usr/share/selinux-policy[^/]*/html(/.*)?          all files          system_u:object_r:httpd_sys_content_t:s0

 

Altering Context

Possiamo cambiare il contesto di una  directory, se lo desideriamo. Questo può essere fatto perché abbiamo bisogno di modificare le autorizzazioni o perché abbiamo spostato un file tra le posizioni – mentre il contesto è ereditato per tutti i file creati all’interno di una cartella, i file spostati mantengono il loro contesto originale.

Diciamo che abbiamo spostato un nuovo file index.html nella nostra directory /var/www /html:

[vagrant@centos ~]$ sudo mv index.html /var/www/html/
[vagrant@centos ~]$ cd /var/www/html/
[vagrant@centos html]$ ls -Z
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:user_home_t:s0 index.html

Questo esempio è particolarmente appropriato, in quanto possiamo vedere gli effetti di SELinux nella pratica. Se dovessimo provare a visualizzare il nostro file index.html tramite il nostro browser web, riceviamo un errore Proibito. Questo perché, come mostrato sopra, mantiene il suo tipo user_home_t originale, non il contesto httpd_sys_content_t di cui ha bisogno. Questo può essere modificato con il comando restorecon:

[vagrant@centos html]$ restorecon index.html
[vagrant@centos html]$ ls -Z
-rw-rw-r--. vagrant vagrant unconfined_u:object_r:httpd_sys_content_t:s0 index.html

restorecon utilizza i contesti predefiniti di SELinux per garantire che tutti i file siano del tipo appropriato. In questo caso, vede che index.html fa parte di /var/www(/.*)? directory e garantisce che erediti i contesti appropriati.

In alternativa, diciamo che abbiamo spostato l’intera directory html/ e abbiamo bisogno di cambiare il contesto di SELinux. Supponiamo, per qualsiasi motivo, che il nostro server non disponga delle policy predefinite necessarie per Apache. Per questo, possiamo usare semanage per cambiare il contesto del tipo:

semanage fcontext -a -t httpd_sys_content_t '/var/www/html(/.*)?'

L’indicatore -t indica il tipo. Inoltre, notare l’inclusione di (/.*)? – questo dice a SELinux che il file e le directory nella directory /var/www/html ereditano anche questo stile.

Se è necessario, possiamo anche eliminare il contesto di una directory:

semanage fcontext -d "/var/www/html(/.*)?"

Anche gestendo il contesto e le autorizzazioni di SELinux, abbiamo appena scalfito la superficie di questo strumento.