Sistemi di sicurezza Linux

Uno dei motivi dell'enorme successo del sistema operativo Linux su dispositivi e server mobili incorporati è il livello piuttosto elevato di sicurezza del kernel, dei servizi e delle applicazioni correlati. Ma se dai un'occhiata più da vicino all'architettura del kernel Linux, è impossibile trovare in esso un quadrato responsabile della sicurezza in quanto tale. Dove si nasconde il sottosistema di sicurezza Linux e in cosa consiste?

Background sui moduli di sicurezza Linux e SELinux

Security Enhanced Linux è un insieme di regole e meccanismi di accesso basati su modelli di accesso obbligatori e basati sui ruoli per proteggere i sistemi Linux da potenziali minacce e correggere le carenze del Discretionary Access Control (DAC), il tradizionale sistema di sicurezza Unix. Il progetto è nato nelle viscere della National Security Agency degli Stati Uniti ed è stato sviluppato direttamente principalmente dagli appaltatori Secure Computing Corporation e MITRE, nonché da una serie di laboratori di ricerca.

Sistemi di sicurezza Linux
Moduli di sicurezza Linux

Linus Torvalds ha fatto una serie di commenti sui nuovi sviluppi della NSA in modo che potessero essere inclusi nel kernel Linux principale. Ha descritto un ambiente generale, con una serie di intercettori per controllare le operazioni con oggetti e una serie di determinati campi protettivi nelle strutture dati del kernel per memorizzare gli attributi corrispondenti. Questo ambiente può quindi essere utilizzato dai moduli del kernel caricabili per implementare qualsiasi modello di sicurezza desiderato. LSM è entrato completamente nel kernel Linux v2.6 nel 2003.

Il framework LSM include campi di guardia nelle strutture dati e chiamate a funzioni di intercettazione nei punti critici del codice del kernel per manipolarli ed eseguire il controllo degli accessi. Aggiunge inoltre funzionalità per la registrazione dei moduli di sicurezza. L'interfaccia /sys/kernel/security/lsm contiene un elenco di moduli attivi sul sistema. Gli hook LSM vengono memorizzati in elenchi richiamati nell'ordine specificato in CONFIG_LSM. La documentazione dettagliata sugli hook è inclusa nel file header include/linux/lsm_hooks.h.

Il sottosistema LSM ha permesso di completare la piena integrazione di SELinux con la stessa versione del kernel Linux stabile v2.6. Quasi subito SELinux divenne lo standard de facto per un ambiente Linux sicuro e fu incluso nelle distribuzioni più popolari: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glossario di SELinux

  • identità — L'utente SELinux non è lo stesso ID utente Unix/Linux; possono coesistere sullo stesso sistema, ma sono essenzialmente completamente diversi. Ogni account Linux standard può corrispondere a uno o più in SELinux. L'identità SELinux fa parte del contesto di sicurezza generale, che determina a quali domini puoi e non puoi unirti.
  • domini - In SELinux, un dominio è il contesto di esecuzione di un soggetto, cioè un processo. Il dominio determina direttamente l'accesso di cui ha un processo. Un dominio è fondamentalmente un elenco di cosa possono fare i processi o cosa può fare un processo con tipi diversi. Alcuni esempi di domini sono sysadm_t per l'amministrazione del sistema e user_t che è un normale dominio utente non privilegiato. Il sistema init viene eseguito nel dominio init_t e il processo denominato viene eseguito nel dominio denominato_t.
  • ruolo — Ciò che funge da intermediario tra i domini e gli utenti SELinux. I ruoli determinano a quali domini può appartenere un utente e a quali tipi di oggetti può accedere. Questo meccanismo di controllo dell'accesso previene la minaccia di attacchi di escalation dei privilegi. I ruoli sono scritti nel modello di sicurezza Role Based Access Control (RBAC) utilizzato in SELinux.
  • tipi — Un attributo dell'elenco Type Enforcement assegnato a un oggetto e che determina chi può accedervi. Simile alla definizione di dominio, tranne per il fatto che il dominio si applica a un processo e il tipo si applica a oggetti come directory, file, socket, ecc.
  • Soggetti e oggetti - I processi sono soggetti e vengono eseguiti in un contesto specifico, o dominio di sicurezza. Le risorse del sistema operativo: file, directory, socket, ecc., sono oggetti a cui viene assegnato un certo tipo, in altre parole, un livello di privacy.
  • Politiche SELinux — SELinux utilizza una varietà di politiche per proteggere il sistema. La policy SELinux definisce l'accesso degli utenti ai ruoli, i ruoli ai domini e i domini ai tipi. Innanzitutto l'utente viene autorizzato ad ottenere un ruolo, poi il ruolo viene autorizzato ad accedere ai domini. Infine, un dominio può avere accesso solo a determinati tipi di oggetti.

Architettura LSM e SELinux

Nonostante il nome, gli LSM non sono generalmente moduli Linux caricabili. Tuttavia, come SELinux, è direttamente integrato nel kernel. Qualsiasi modifica al codice sorgente LSM richiede una nuova compilazione del kernel. L'opzione corrispondente deve essere abilitata nelle impostazioni del kernel, altrimenti il ​​codice LSM non verrà attivato dopo l'avvio. Ma anche in questo caso può essere abilitato tramite l'opzione bootloader del sistema operativo.

Sistemi di sicurezza Linux
Stack di controllo LSM

LSM è dotato di hook nelle funzioni principali del kernel che possono essere rilevanti per i controlli. Una delle caratteristiche principali degli LSM è che sono impilati. Pertanto, i controlli standard vengono ancora eseguiti e ogni livello di LSM aggiunge solo controlli e controlli aggiuntivi. Ciò significa che il divieto non può essere annullato. Ciò è mostrato nella figura; se il risultato dei controlli DAC di routine è un fallimento, il problema non raggiungerà nemmeno gli hook LSM.

SELinux adotta l'architettura di sicurezza Flask del sistema operativo di ricerca Fluke, in particolare il principio del privilegio minimo. L'essenza di questo concetto, come suggerisce il nome, è quella di concedere all'utente o al trattamento solo i diritti necessari per eseguire le azioni previste. Questo principio è implementato utilizzando la tipizzazione ad accesso forzato, quindi il controllo dell'accesso in SELinux è basato sul modello dominio => tipo.

Grazie alla tipizzazione ad accesso forzato, SELinux ha capacità di controllo degli accessi molto maggiori rispetto al modello DAC tradizionale utilizzato nei sistemi operativi Unix/Linux. Ad esempio, puoi limitare il numero di porta di rete a cui si connetterà il server ftp, consentire la scrittura e la modifica dei file in una determinata cartella, ma non la loro eliminazione.

I componenti principali di SELinux sono:

  • Server di applicazione delle politiche — Il meccanismo principale per organizzare il controllo degli accessi.
  • Database delle politiche di sicurezza del sistema.
  • Interazione con l'intercettatore di eventi LSM.
  • Selinuxfs - Pseudo-FS, lo stesso di /proc e montato in /sys/fs/selinux. Popolato dinamicamente dal kernel Linux in fase di esecuzione e contenente file contenenti informazioni sullo stato di SELinux.
  • Accedi alla cache dei vettori — Un meccanismo ausiliario per aumentare la produttività.

Sistemi di sicurezza Linux
Come funziona SELinux

Funziona tutto così.

  1. Un certo soggetto, in termini di SELinux, esegue un'azione consentita su un oggetto dopo un controllo DAC, come mostrato nell'immagine in alto. Questa richiesta di eseguire un'operazione va all'intercettatore di eventi LSM.
  2. Da lì, la richiesta, insieme al contesto di sicurezza dell'oggetto e dell'oggetto, viene passata al modulo SELinux Abstraction and Hook Logic, che è responsabile dell'interazione con LSM.
  3. L’autorità decisionale sull’accesso di un soggetto a un oggetto è il Policy Enforcement Server e riceve i dati da SELinux AnHL.
  4. Per prendere decisioni sull'accesso o sul rifiuto, Policy Enforcement Server si rivolge al sottosistema di caching Access Vector Cache (AVC) per le regole più utilizzate.
  5. Se nella cache non viene trovata una soluzione per la regola corrispondente, la richiesta viene inoltrata al database della politica di sicurezza.
  6. Il risultato della ricerca dal database e da AVC viene restituito al Policy Enforcement Server.
  7. Se la policy trovata corrisponde all'azione richiesta, l'operazione è consentita. In caso contrario l'operazione è vietata.

Gestione delle impostazioni di SELinux

SELinux opera in una delle tre modalità:

  • Applicazione: aderenza rigorosa alle politiche di sicurezza.
  • Permissivo: è consentita la violazione delle restrizioni; una nota corrispondente viene inserita nel diario.
  • Disabilitato: le policy di sicurezza non sono attive.

Puoi vedere in quale modalità si trova SELinux con il seguente comando.

[admin@server ~]$ getenforce
Permissive

Modificare la modalità prima del riavvio, ad esempio impostandola su applicazione o 1. Il parametro permissivo corrisponde al codice numerico 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

Puoi anche cambiare la modalità modificando il file:

[admin@server ~]$ cat /etc/selinux/config

# 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 values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

SELINUXTYPE=destinazione

La differenza con setenfoce è che all'avvio del sistema operativo, la modalità SELinux verrà impostata in base al valore del parametro SELINUX nel file di configurazione. Inoltre, le modifiche all'applicazione <=> disabilitato diventano effettive solo modificando il file /etc/selinux/config e dopo un riavvio.

Visualizza un breve rapporto sullo stato:

[admin@server ~]$ sestatus

SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31

Per visualizzare gli attributi SELinux, alcune utilità standard utilizzano il parametro -Z.

[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL                             PID TTY          TIME CMD
system_u:system_r:httpd_t:s0     2914 ?        00:00:04 httpd
system_u:system_r:httpd_t:s0     2915 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2916 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2917 ?        00:00:00 httpd
...
system_u:system_r:httpd_t:s0     2918 ?        00:00:00 httpd

Rispetto al normale output di ls -l, ci sono diversi campi aggiuntivi nel seguente formato:

<user>:<role>:<type>:<level>

L'ultimo campo denota qualcosa come una classificazione di sicurezza e consiste in una combinazione di due elementi:

  • s0 - significatività, scritta anche come intervallo di livello basso-alto
  • c0, c1… c1023 - categoria.

Modifica della configurazione di accesso

Usa semodule per caricare, aggiungere e rimuovere moduli SELinux.

[admin@server ~]$ semodule -l |wc -l #список всех модулей
408
[admin@server ~]$ semodule -e abrt #enable - активировать модуль
[admin@server ~]$ semodule -d accountsd #disable - отключить модуль
[admin@server ~]$ semodule -r avahi #remove - удалить модуль

Prima squadra accesso al semanage collega l'utente SELinux all'utente del sistema operativo, il secondo visualizza un elenco. Infine, l'ultimo comando con l'opzione -r rimuove la mappatura degli utenti SELinux sugli account del sistema operativo. Una spiegazione della sintassi per i valori dell'intervallo MLS/MCS si trova nella sezione precedente.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol

Squadra utente semanage utilizzato per gestire le mappature tra utenti e ruoli SELinux.

[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Parametri del comando:

  • -una voce aggiuntiva per la mappatura dei ruoli personalizzata;
  • -l elenco di utenti e ruoli corrispondenti;
  • -d elimina la voce di mappatura dei ruoli utente;
  • -R elenco dei ruoli associati all'utente;

File, porte e valori booleani

Ogni modulo SELinux fornisce una serie di regole di tagging dei file, ma puoi anche aggiungere le tue regole se necessario. Ad esempio, vogliamo che il server web abbia i diritti di accesso alla cartella /srv/www.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

Il primo comando registra nuove regole di marcatura e il secondo reimposta, o meglio imposta, i tipi di file secondo le regole attuali.

Allo stesso modo, le porte TCP/UDP sono contrassegnate in modo tale che solo i servizi appropriati possano ascoltarle. Ad esempio, affinché il server Web sia in ascolto sulla porta 8080, è necessario eseguire il comando.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Un numero significativo di moduli SELinux hanno parametri che possono assumere valori booleani. L'intero elenco di tali parametri può essere visualizzato utilizzando getsebool -a. Puoi modificare i valori booleani usando setsebool.

[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off

Workshop, accedi all'interfaccia web di Pgadmin

Vediamo un esempio pratico: abbiamo installato pgadmin7.6-web su RHEL 4 per amministrare il database PostgreSQL. Abbiamo camminato un po' Quest con le impostazioni di pg_hba.conf, postgresql.conf e config_local.py, imposta i permessi delle cartelle, installa i moduli Python mancanti da pip. Tutto è pronto, lanciamo e riceviamo 500 Errore interno del server.

Sistemi di sicurezza Linux

Iniziamo con i tipici sospetti, controllando /var/log/httpd/error_log. Ci sono alcune voci interessanti lì.

[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690] [timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.

A questo punto, la maggior parte degli amministratori Linux saranno fortemente tentati di eseguire setencorce 0, e tutto finirà lì. Francamente, l'ho fatto proprio la prima volta. Naturalmente anche questa è una via d'uscita, ma tutt'altro che la migliore.

Nonostante il design complicato, SELinux può essere facile da usare. Basta installare il pacchetto setroubleshoot e visualizzare il registro di sistema.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Tieni presente che il servizio auditd deve essere riavviato in questo modo e non utilizzando systemctl, nonostante la presenza di systemd nel sistema operativo. Nel registro di sistema sarà indicato non solo il fatto del blocco, ma anche il motivo e modo per superare il divieto.

Sistemi di sicurezza Linux

Eseguiamo questi comandi:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

Controlliamo l'accesso alla pagina web pgadmin4-web, tutto funziona.

Sistemi di sicurezza Linux

Sistemi di sicurezza Linux

Fonte: habr.com

Aggiungi un commento