SELinux

SElinux è un sistema di sicurezza del s.o. Linux basato sulla sicurezza di Unix.
Fornisce una completa e obbligatoria soluzione di sicurezza il cui principio è:
 "se non esplicitamente permesso, viene negato".

Quindi in un ambiente dove è abilitato SELinux, ogni servizio non conosciuto ha necessità di un ulteriore configurazione per essere abilitato.
L'abilitazione e disabilitazione di SElinux avviene a livello di kernel e pertanto è necessario il reboot
Se abilitato può assumere due valori: Enforcing o Permissive e la modifica può essere fatta con il comando setenforce.
Se è impostato Enforcing, è bloccato qualsiasi cosa che non soddisfa le Selinux policy.
La modalità Permissive è temporanea e permette di effettuare il troubleshooting perché il traffico è ancora abilitato, nulla è bloccato ma ancora loggato.


Per visualizzare la modalità attiva:

getenforce

Per passare da Enforcing a Permissive

setenforce permissive

oppure

setenforce 0

Per passare da Permissive a Enforcing

setenforce enforcing 

oppure

setenforce 1

Il file di configurazione è /etc/sysconfig/selinux


Per disabilitare Selinux occorre modificare il file di configurazione e riavviare il server

Impostare SELINUX=disabled

reboot

Una volta riavviato se si esegue il getenforce compare la scritta disabled. Ora non è più possibile forzare selinux a enforcing e permissive.



In SELinux ogni oggetto è etichettato con un Context Label che consiste di tre parti
- user 
- role 
- type : dice che tipo di operazione si può fare sugli oggetti. Definisce quali oggetti sorgenti possono accedere a quali oggetti target 

Usare -Z per mostrare le informazioni di context.

Il comando seguente mostra i processi attivi
ps auxZ
Quelli che hanno unconfined_r non hanno restrizioni Selinux.
ps auxZ | grep ssh

Altro elemento fondamentale è il Boolean che è una sorta di switch on/off  cioè abilita o disabilita specifiche categorie di funzionalità e permette di semplificare l'uso di Selinux.
Per visualizzare la lista dei boolean
getsebool -a
Vediamo il serivzio httpd
getsebool -a | grep httpd
In particolare il valore
getsebool -a | grep httpd_enable_homedir
httpd_enable_homedir --> off
vuole dire che il web server disabilita gli user a scrivere nella home directory context di httpd.

Per modificare il file context label usare il comando semanage fcontext che modifica la Selinux Policy
e poi imporre le policy definite sul file system con  restorecon
oppure touch /.autorelabel per rietichettare tutti i file secondo le specifiche definite nella policy.  

Vediamo un esempio:
Cambiare la DocumentRoot di un server Apache.
Creare la nuova directory e il file index.
# mkdir /web
# touch /web/index.html
Nuovo Server
Modificare il file di configurazione
# vim /etc/httpd/conf/httpd.conf
Modificare DocumentRoot e <Directory "/web">


# systemctl restart httpd
Verifica:
# curl http://localhost
compare anche il vecchio inedx.html perché Selinux è abilitato
# getenforce
Enforcing
Se si passa alla modalità permissive allora il server web funziona
# setenforce permissive


Per farlo funzionare con Selinux abilitato occorre operare a livello di file context.
# man semanage-fcontext


Il primo comando abilita la modifica dell file context della direcotry /web ma il file context della directory /web non è ancora httpd_sys_content


Occorre eseguire il comando 
# restorecon -Rv /web


Ora funziona correttamente con Selinux abilitato perché il processo httpd ha come type "httpd_t" che permette secondo le policy di Selinux di gestire il content type della directory /web.
# ps auxZ | grep httpd 
# ls -ldZ /web



ESEMPIO: cambiare il Selinux Context di un file 
Alcuni file in /etc sono configurati con un context label che non rispecchia il context label definito nella Selinux policy.


I nuovi file in genere ereditano il loro contesto SELinux dalla directory padre, assicurando così che essi
hanno il contesto appropriato.
Ma questa procedura di eredità può cambiare in due modi diversi. 
Se crei un file in una posizione diversa dalla posizione finale prevista e quindi spostare il file MV, il file è ancora presente il contesto SELinux della directory in cui è stato creato, non la directory di destinazione. 
Se invece  si copia CP un file il contesto SELinux riflette la posizione del file originale.

# su - root
# ls -lZ /etc/hosts
Compare il type net_conf_t.
Copiamo il file /etc/hosts nella root directory 
# cp /etc/hosts /root
# ls -lZ hosts
Compare il type admin_home_t.
Cancelliamo il file.
# rm /etc/hosts
Rispostiamo il file dalla root directory sotto /etc.
La mv di un file sposta tutte le proprietà del file e conserva il contextx della directory in cui è stato creato.
# mv hosts /etc/hosts
# ls -lZ /etc/hosts
Compare il type admin_home_t.

Usare  il comando seguente per etichettare nuovamente i context di Selinux policy.
# restorecon -Rv /etc
Verifica che il type sia net_conf_t
# ls -lZ /etc/hosts



2 soluzioni possibili per conservare il Selinux context del file originale:

1) mv file   /dir-destination  + restore -Rv /dir-destination

2) cp file   /dir-destination  

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database