Non puoi lasciare che i tuoi fallimenti ti definiscano. Devi lasciare che i tuoi fallimenti te lo insegnino ― Barack Obama
Una delle grandi battaglie, in particolare con i fornitori di soluzioni di terze parti, è mantenere la sicurezza dei nostri server. In molti casi, la sfida è la richiesta di disabilitare SELinux in modo che un'applicazione possa funzionare senza problemi. Fortunatamente, ciò sta accadendo sempre meno.
Nella maggior parte di questi casi, un'analisi è sufficiente per trovare la risoluzione dei problemi o la soluzione giusta.
SELinux è un sistema di etichettatura , che ci dice che ogni file, directory o oggetto nel sistema ha un'etichetta corrispondente . Le politiche controllano l'interazione tra questi elementi. Il kernel applica queste regole.
I due concetti più importanti sono Etichettatura (file, processi, porte, ecc.) e Type Enforcement (che isola i processi gli uni dagli altri in base alla loro tipologia).
Il formato utilizzato dalle etichette è:utente:role:tipo:livello (facoltativo).
Per scoprire la configurazione corrente, esegui getenforce
e sestatus
comandi:
# getenforce
Enforcing
# 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
Memory protection checking: actual (secure)
Max kernel policy version: 32
Le migliori pratiche ci dicono che quando stiamo testando una nuova applicazione di terze parti, dovremmo configurare temporaneamente SELinux in modalità permissiva per determinare quali politiche o booleane (semplici stringhe che cambiano il comportamento) sono necessarie. Esegui il comando:
# setenforce 0
Esaminando i log, puoi scoprire cosa richiede SELinux affinché l'applicazione funzioni correttamente.
Cosa sta cercando di dirmi SELinux?
Ci sono solo quattro cause principali di errori che generano avvisi in SELinux:
- Etichettatura.
- SELinux ha bisogno di sapere.
- La politica di SELinux e/o l'applicazione potrebbero avere dei bug.
- Le tue informazioni potrebbero essere compromesse.
L'ultimo caso è dovuto a modifiche apportate per attaccare vulnerabilità o evitare il tracciamento delle attività, sebbene in entrambi i casi sia essenziale rivedere questi avvisi; per ragioni pratiche, per il momento, non ci occuperemo di loro fino a un eventuale post futuro.
Etichettatura
Problema di etichettatura :File in /srv/myweb
non sono etichettati correttamente e non sono accessibili.
SELinux assegna un'etichetta per ogni elemento coinvolto nello stesso servizio:
- File binario:/usr/sbin/httpd → httpd_exec_t
- File di configurazione:/etc/httpd → httpd_config_t
- File di registro:/var/log/httpd → httpd_log_t
- Cartella dei contenuti:/var/www/html → httpd_sys_content_t
- Script di avvio:/usr/lib/systemd/system/httpd.service → httpd_unit_file_t
- Processo:/usr/sbin/httpd → httpd_t
- Porte:80/tcp, 443/tcp → httpd_t e httpd_port_t
Sul server web, un processo in esecuzione in httpd_t contesto può interagire solo con oggetti con httpd_something_t etichetta .
Soluzione :Etichettare correttamente i file.
Se conosci l'etichetta corretta, esegui :
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
Se conosci un file con l'etichetta equivalente, esegui:
# semanage fcontext -a -e /srv/myweb /var/www
Ripristina il contesto predefinito dei file, in entrambi i casi:
# restorecon -vR /srv/myweb
Problema di etichettatura :Se un file viene spostato, invece di essere copiato, mantiene la sua etichetta originale.
$ mv index.html /var/www/html/
Soluzione :Etichettare correttamente il file.
Modifica il contesto con l'etichetta corretta:
# chcon -t httpd_system_content_t /var/www/html/index.html
Modifica del contesto con un'etichetta di riferimento:
# chcon --reference /var/www/html/ /var/www/html/index.html
Ripristina il contesto predefinito del file, per entrambi i casi:
# restorecon -vR /var/www/html/
[ Potrebbe piacerti anche: Accesso alla documentazione delle norme di SELinux ]
SELinux deve sapere
Personalizzazione del servizio :il server web ascolterà le richieste sulla porta 8585.
Per aggiungere la porta desiderata al contesto, eseguire:
# semanage port -a -t http_port_t -p tcp 8585
Aggiunta di funzionalità al servizio :Il server web sarà in grado di inviare e-mail.
Per abilitare la funzione di invio della posta, attiva il booleano, eseguendo:
# setsebool -P httpd_can_sendmail 1
Il -P
flag rende la modifica permanente nel booleano.
Per ottenere tutti i booleani, esegui:
# getsebool -a
Per controllare lo stato di un booleano, esegui:
# semanage boolean -l
Risoluzione dei problemi relativi alle norme
Alcuni servizi non hanno una politica specifica creata contenente i permessi sufficienti necessari per lavorare con SELinux. Per determinare quali sono queste autorizzazioni, è necessario impostare la modalità permissiva e controllare i log per individuare eventuali errori di accesso.
Servizio non funzionante :wicd viene utilizzato al posto del servizio NetworkManager per gestire le connessioni wireless.
Ispezione di audit.log
file per accesso negato:
# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
create } for pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
create } for pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
ioctl } for pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
ioctl } for pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
setattr } for pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0
Si noti che alcuni elementi sono coinvolti nei contesti NetworkManager_t e ecc_t richiedono diritti e accesso alla creazione di diversi file e socket.
Crea l'imposizione del tipo (.te) file con le autorizzazioni necessarie per la politica:
# vi my_wicd.te
module my_wicd 1.0;
require {
type NetworkManager_t;
type etc_t;
class ipx_socket create;
class ax25_socket { create ioctl };
class appletalk_socket { create ioctl };
class file setattr;
}
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;
Per compilare la policy, installa il pacchetto selinux-policy-devel
e genera il pacchetto di politiche:
# make -f /usr/share/selinux/devel/Makefile my_wicd.pp
Per attivare il modulo appena generato, eseguire:
# semodule -i my_wicd.pp
Messaggio di errore relativo alle norme :Cercando di accedere al mio sito web, trovo errori di SELinux nei log.
Una delle insidie comuni nella risoluzione dei problemi dei messaggi di errore di SELinux è la creazione di politiche in base a tutti i messaggi di errore trovati. Nella maggior parte dei casi, se il setroubleshoot
pacchetto è installato, lo stesso avviso ci fornirà tutte le possibili opzioni di soluzione alternativa, dalla migliore alla meno.
Per rivedere la setroubleshoot
avvisi generati oggi, esegui:
# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
***** Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label
/var/www/html/index.html default label should be httpd_sys_content_t.
Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
Do
# /sbin/restorecon -v /var/www/html/index.html
***** Plugin catchall (1.49 confidence) suggests **************************
If you believe that httpd should be allowed getattr access on the index.html file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -X 300 -i my-httpd.pp
In questo caso, la migliore soluzione possibile è semplicemente correggere l'etichetta del file.
[ Migliora le tue capacità di gestione e utilizzo di SELinux con questa utile guida. ]
Concludi
SELinux può essere difficile da risolvere, ma applicando i concetti qui annotati e comprendendo i componenti del servizio, puoi gestire qualsiasi sfida ti presenti.
Ricorda:
