GNU/Linux >> Linux Esercitazione >  >> Linux

Risoluzione dei problemi e insidie ​​di SELinux

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:

  1. Etichettatura.
  2. SELinux ha bisogno di sapere.
  3. La politica di SELinux e/o l'applicazione potrebbero avere dei bug.
  4. 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:


Linux
  1. Procedura:MTR – Comprensione e risoluzione dei problemi di connettività di rete

  2. Risoluzione dei problemi di base di Nginx

  3. Esempio di configurazione e risoluzione dei problemi di logrotate

  4. Lampone Pi 4 e Kali

  5. Cosa sono gli utenti SELinux e come mappare gli utenti Linux agli utenti SELinux

Una raccolta di utilità per semplificare la risoluzione dei problemi di rete Linux e l'ottimizzazione delle prestazioni

17 migliori comandi di rete e risoluzione dei problemi di Linux per principianti

Backup nel cloud:risoluzione dei problemi di base su Windows Server 2012, 2016 e 2019

Glusterfs – Suggerimenti e trucchi per la risoluzione dei problemi avanzati

Risoluzione dei problemi relativi a errori e timeout del gateway:502, 504

Debug di iptables e insidie ​​comuni del firewall?