GNU/Linux >> Linux Esercitazione >  >> Linux

Mastering systemd:protezione e sandbox di applicazioni e servizi

Questa serie di articoli esplorerà alcune delle mie funzionalità preferite di Red Hat Enterprise Linux (RHEL) 8 abilitate da systemd . Pertanto, questa serie presuppone familiarità con i concetti di base di systemd . Se hai bisogno di una buona introduzione, c'è un'ampia documentazione sul prodotto sia sul Red Hat Customer Portal che sul sito del progetto. In alternativa, su YouTube sono disponibili diverse presentazioni per tenerti aggiornato prima di continuare.

Systemd fornisce un numero significativo di funzionalità di sicurezza che possono essere utilizzate per isolare servizi e applicazioni l'uno dall'altro, nonché dal sistema operativo sottostante. In molti casi, systemd fornisce un facile accesso agli stessi meccanismi forniti dal kernel Linux utilizzati anche per creare l'isolamento per i container Linux. Avere la capacità di fornire un isolamento in stile container per applicazioni e servizi tradizionali è potente perché ora è facile migliorare la sicurezza e l'isolamento dei carichi di lavoro senza l'impatto operativo richiesto dai container. Vale la pena notare che i cambiamenti operativi e organizzativi ispirati dall'adozione dei container sono davvero salutari e utili. Tuttavia, anche nelle aziende più esperte di container, esiste un gran numero di implementazioni Linux tradizionali in cui la sicurezza è una priorità assoluta. Come vedremo, i carichi di lavoro su questi sistemi possono trarre vantaggio da poche modifiche ai file di unità corrispondenti.

Opzioni di sicurezza comuni a Red Hat Enterprise Linux 7 e 8

La maggior parte delle opzioni esplorate di seguito accetta un binario true o false configurazione che li rende facili da abilitare. Ce ne sono alcuni che contengono opzioni aggiuntive e vengono mostrate anche le più significative. Fare riferimento alla documentazione completa e alle pagine man per ulteriori dettagli. Se non ti interessa il nocciolo della questione di queste opzioni, sentiti libero di passare alla sezione successiva in cui metteremo insieme queste opzioni per esempi più coerenti:

Opzione Descrizione
PrivateTmp=yes Crea uno spazio dei nomi di file system in /tmp/systemd-private-*-[unit name]-*/tmp piuttosto che un /tmp condiviso o /var/tmp . Molti dei file unit forniti con Red Hat Enterprise Linux includono questa impostazione e rimuove un'intera classe di vulnerabilità relative alla previsione e alla sostituzione dei file utilizzati in /tmp .
PrivateNetwork= Fornisce uno spazio dei nomi di rete per il servizio con solo un'interfaccia di loopback disponibile. Un'ottima opzione per le applicazioni che non richiedono la comunicazione di rete esterna.
SELinuxContext= Esegue l'applicazione in un contesto specifico. Questa opzione è una buona idea per definire quando una policy è disponibile per le applicazioni spedite al di fuori di RHEL. Un buon primer per SELinux è disponibile qui.
NoNewPrivileges= Impedisce al servizio e ai relativi processi figlio di aumentare i privilegi.
ProtectSystem=yes Rende /usr e /boot sola lettura per l'applicazione. Impostando questa opzione su full fa anche /etc sola lettura. In Red Hat Enterprise Linux 8, c'è un'opzione aggiuntiva chiamata strict che rende anche /dev , /proc e /sys di sola lettura.
ProtectHome=yes Crea /home , /root e /run/user apparire vuoto. Un'opzione aggiuntiva è read-only , che fa esattamente quello che dice. Nuovo anche per RHEL 8, tmpfs in questi punti si sovrapporrà a un file system effimero scrivibile. Poiché queste directory vengono utilizzate per archiviare chiavi SSH e altre informazioni potenzialmente sensibili, è una buona idea vietare l'accesso alle applicazioni.
ProtectDevices=yes Crea un /dev privato spazio dei nomi contenente solo pseudo dispositivi come /dev/null e /dev/random , che non danno accesso all'hardware effettivo. Disabilita anche CAP_MKNOD in modo che non possano essere creati nuovi nodi dispositivo.
CapabilityBoundingSet= Accetta una whitelist e una blacklist di capacità privilegiate per l'unità. Le funzionalità di Linux interrompono l'accesso dell'utente root al sistema in modo che l'accesso privilegiato possa essere individuato meglio. L'esempio classico è per NTP o chrony per poter configurare l'orologio di sistema ma non eseguire altre azioni privilegiate. Maggiori dettagli sono disponibili nella pagina man delle capacità (7).

ReadWriteDirectories=

ReadOnlyDirectories=

InaccessibleDirectories=

Si comporta in modo simile a ProtectSystem , ma tutte e tre queste opzioni consentono un controllo dettagliato dell'accesso al file system.

Nuove opzioni di sicurezza in Red Hat Enterprise Linux 8

Le nuove opzioni di sicurezza del sistema disponibili in Red Hat Enterprise Linux 8 sono:

Opzione Descrizione
ProtectKernelTunables=yes Disabilita la modifica di /proc e /sys .
ProtectKernelModules=yes Proibisce il caricamento o lo scaricamento di moduli e maschere /usr/lib/modules dall'applicazione.
ProtectControlGroups=yes Disabilita l'accesso in scrittura a /sys/fs/cgroup/ .
RestrictNamespaces= Limita tutti o un sottoinsieme di spazi dei nomi al servizio. Accetta cgroup , ipc , net , mnt , pid , user e uts .
AssertSecurity= Richiede una serie di requisiti che devono essere soddisfatti dal sistema per l'avvio del servizio. Se le funzionalità elencate non sono disponibili, il servizio non verrà eseguito e l'evento verrà registrato. Opzioni come selinux e uefi-secureboot sono utili per molti ambienti.
MemoryDenyWriteExecute= Disabilita la mappatura della memoria che è contemporaneamente scrivibile ed eseguibile.
RestrictRealtime=yes Proibisce la pianificazione in tempo reale.
PrivateMounts=yes Fa in modo che il servizio venga eseguito in uno spazio dei nomi di montaggio privato.
DynamicUser=yes Crea effettivamente un utente transitorio per l'applicazione. Questa opzione probabilmente garantisce il proprio post per esplorare, ma brevemente, il systemd l'implementazione è brillante perché crea dinamicamente (come suggerisce il nome) un UID e un GID collegando un nss modulo che "crea" l'utente al volo. Questi utenti semplicemente non esistono quando il servizio non è in esecuzione. Questa funzione è particolarmente utile per le applicazioni stateless, ma è possibile mappare le directory in cui scrivere.
SystemCallFilter= Consente di inserire nella whitelist e nella blacklist singole chiamate di sistema o utilizzare i gruppi di chiamate intuitivi che systemd fornisce. Se hai familiarità con seccomp filtrando con i contenitori, questa opzione fornisce esattamente la stessa cosa. In senso generale, la maggior parte degli utenti troverà il @system-service filtro prezioso, che abilita le chiamate di sistema rilevanti necessarie per la maggior parte dei servizi. Gli utenti possono visualizzare l'elenco dei gruppi e delle chiamate di sistema disponibili eseguendo systemd-analyze syscall-filter .

[Vuoi provare Red Hat Enterprise Linux? Scaricalo ora gratuitamente.]

Un esempio

Se sei arrivato così lontano, potresti pensare:"OK, sembra davvero potente, ma è molto da ricordare". Fortunatamente, a partire da Red Hat Enterprise Linux 8.1, abbiamo aggiunto un comando per rendere molto più semplice fare riferimento e controllare lo stato di queste opzioni:

systemd-analyze security [unit]

Questo comando genera una rapida istantanea di come il sistema sta sfruttando systemd sandboxing di e può anche visualizzare le singole impostazioni per unità. Questo design semplifica l'identificazione delle opzioni disponibili e la visualizzazione del loro utilizzo a livello granulare.

Ecco l'output del httpd.service predefinito unità:

Questo output da systemd-analyze security mostra il nome, una descrizione conveniente e una valutazione dell'esposizione, che dimostra il consumo delle impostazioni di sicurezza disponibili per servizio e genera un punteggio di esposizione ponderato da quanto è isolato il servizio. Vale la pena notare che questo strumento non ha lo scopo di fornire una visione olistica o un'opinione sulla sicurezza per il codice o l'applicazione in esecuzione sul sistema. Solo perché httpd.service ritorna come UNSAFE su un'installazione predefinita non significa che il servizio non sia sicuro.

Ora che sappiamo come interrogare le unità e vedere quali controlli sono in uso, diamo un'occhiata ad applicarli a un semplice server web. Questo esempio generico funge da facile punto di partenza per altri servizi e applicazioni.

Attiva le opzioni di sicurezza

Innanzitutto, crea un drop-in systemd per aggiungere le opzioni di sicurezza. Per Red Hat Enterprise Linux 8, eseguire:

# systemctl edit httpd

Oppure, se preferisci, crea manualmente /etc/systemd/system/httpd.service.d/security.conf .

Indipendentemente dal modo in cui hai effettuato l'accesso al file, ora aggiungi:

[Service]
ProtectSystem=strict
ProtectHome=yes
PrivateDevices=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
NoNewPrivileges=yes
PrivateTmp=yes

Per Red Hat Enterprise Linux 7, possiamo utilizzare un modello simile:

[Service]
ProtectSystem=full
ProtectHome=yes
PrivateDevices=yes
NoNewPrivileges=yes
PrivateTmp=yes

Dopo aver salvato il file e riavviato il servizio, httpd il servizio sarà significativamente isolato dal resto del sistema operativo. Se il servizio viene mai compromesso, il rischio di rotture e danni conseguenti viene drasticamente ridotto.

Gli esempi precedenti sono un ottimo punto di partenza per bloccare servizi, applicazioni e unità in esecuzione sul sistema. Ovviamente dovresti testarli per assicurarti che siano appropriati per il tuo caso d'uso prima di distribuirli all'intera flotta. Ad esempio, se volessimo pubblicare contenuti dalle home directory degli utenti, non includeremmo ProtectHome=yes , ma invece, usa ProtectHome=read-only . Vale anche la pena notare che non è dannoso includere le opzioni più recenti aggiunte in RHEL 8 su un file di unità eseguito in RHEL 7. Verrà emesso un messaggio di notifica e l'opzione verrà ignorata.

Visualizza i risultati

Ora possiamo visualizzare le opzioni in uso eseguendo systemd-analyze httpd :

Puoi vedere che una serie di opzioni vengono ora applicate sul server web. Anche la valutazione è cambiata da UNSAFE a MEDIUM . Sebbene sia del tutto possibile abilitare più opzioni e bloccare ulteriormente il servizio, ci allontaneremo dall'obiettivo di fornire un esempio pratico che si applicherà con successo a molti servizi e applicazioni nel mondo reale. Mai prima d'ora è stato così semplice limitare l'accesso di un servizio tradizionale al sistema operativo sottostante.

Conclusione

Per gli sviluppatori interessati a proteggere il proprio software, le opzioni di sicurezza pertinenti possono essere facilmente aggiunte ai file unit inclusi con l'applicazione. Red Hat incoraggia vivamente gli sviluppatori a "integrare" quanta più sicurezza possibile per impostazione predefinita, e questo è uno dei modi più semplici per raggiungere questo obiettivo.

Per coloro che si chiedono se le funzionalità di sicurezza mostrate qui siano ridondanti con SELinux, c'è una sovrapposizione nella funzione ma sono in gran parte indipendenti. Queste impostazioni verranno applicate indipendentemente dal fatto che SELinux venga utilizzato o meno. Questa caratteristica è un valore enorme quando SELinux non è un'opzione praticabile a causa di criteri o requisiti applicativi per determinati sistemi. In un mondo ideale, questi sarebbero usati with SELinux come parte di un approccio alla sicurezza a più livelli.

Spero che ti sia piaciuto apprendere quanto sia facile isolare e sandbox i carichi di lavoro installati su Red Hat Enterprise Linux 8 con systemd . Ora vai avanti e, se del caso, applica questa conoscenza in tutto il tuo ambiente. Nel prossimo articolo di questa serie, esamineremo l'utilizzo dei gruppi di controllo Linux, alias cgroups , tramite systemd per proteggere preziose risorse di sistema e risolvere il problema del "vicino rumoroso".


Linux
  1. Avvia, arresta e riavvia i servizi sul server Linux RHEL 7 systemd

  2. Come gestire i servizi Systemd con Systemctl su Linux

  3. Come elencare i servizi Systemd in Linux

  4. StartLimitIntervalSec e StartLimitBurst di Systemd non funzionano mai

  5. File unità Systemd - WantedBy e After

Avventure al plasma - 5.19.4 collaudato

Come aggiungere e bloccare applicazioni personalizzate in Plasma

E la migliore distribuzione del 2019 è...

Come disinstallare le applicazioni WINE

Servizi di rete e protocolli

Journalctl:come leggere e modificare i log di Systemd