GNU/Linux >> Znalost Linux >  >> Linux

Mastering systemd:Zabezpečení a sandboxing aplikací a služeb

Tato série článků prozkoumá některé z mých oblíbených funkcí Red Hat Enterprise Linux (RHEL) 8, které jsou povoleny systemd . Tato řada tedy předpokládá obeznámenost se základními pojmy systemd . Pokud potřebujete dobrý úvod, na zákaznickém portálu Red Hat i na stránce projektu je k dispozici velké množství produktové dokumentace. Případně je na YouTube k dispozici řada prezentací, které vás také zastihnou, než budete pokračovat.

Systemd poskytuje značné množství funkcí zabezpečení, které lze použít k izolaci služeb a aplikací od sebe navzájem i od základního operačního systému. V mnoha případech systemd poskytuje snadný přístup ke stejným mechanismům poskytovaným jádrem Linuxu, které se také používají k vytvoření izolace pro kontejnery Linux. Schopnost poskytovat kontejnerovou izolaci pro tradiční aplikace a služby je výkonná, protože je nyní snadné zlepšit zabezpečení a izolaci pracovních zátěží bez provozního dopadu, který kontejnery vyžadují. Stojí za zmínku, že provozní a organizační změny inspirované přijetím kontejnerů jsou skutečně zdravé a užitečné. I v těch nejnáročnějších podnicích však existuje velké množství tradičních nasazení Linuxu, kde je bezpečnost nejvyšší prioritou. Jak uvidíme, pracovní zátěž na těchto systémech může těžit z několika úprav odpovídajících souborů jednotek.

Možnosti zabezpečení společné pro Red Hat Enterprise Linux 7 a 8

Většina níže prozkoumaných možností přijímá binární true nebo false konfiguraci, která usnadňuje jejich aktivaci. Existuje několik, které obsahují další možnosti, a nejvýznamnější z nich jsou zobrazeny také. Další podrobnosti naleznete v úplné dokumentaci a manuálových stránkách. Pokud vás nezajímá hloubka těchto možností, klidně přeskočte na další část, kde tyto možnosti dáme dohromady, abychom získali koherentnější příklady:

Možnost Popis
PrivateTmp=yes Vytváří jmenný prostor souborového systému pod /tmp/systemd-private-*-[unit name]-*/tmp spíše než sdílený /tmp nebo /var/tmp . Mnoho souborů jednotek dodávaných s Red Hat Enterprise Linux obsahuje toto nastavení a odstraňuje celou třídu zranitelností kolem predikce a nahrazování souborů používaných v /tmp .
PrivateNetwork= Poskytuje síťový jmenný prostor pro službu s dostupným pouze rozhraním zpětné smyčky. Skvělá volba pro aplikace, které nevyžadují externí síťovou komunikaci.
SELinuxContext= Spustí aplikaci v konkrétním kontextu. Tato možnost je dobrým nápadem pro definování, kdy je zásada dostupná pro aplikace dodávané mimo RHEL. Dobrý primer SELinux je k dispozici zde.
NoNewPrivileges= Zabraňuje službě a souvisejícím podřízeným procesům eskalovat oprávnění.
ProtectSystem=yes Vytváří /usr a /boot pouze pro čtení do aplikace. Nastavení této možnosti na full také dělá /etc pouze ke čtení. V Red Hat Enterprise Linux 8 existuje další možnost nazvaná strict to také dělá /dev , /proc a /sys pouze pro čtení.
ProtectHome=yes Vytváří /home , /root a /run/user se objeví prázdné. Další možností je read-only , který dělá přesně to, co říká. Také novinka v RHEL 8, tmpfs bude v těchto bodech překrývat zapisovatelný, pomíjivý souborový systém. Protože se tyto adresáře používají k ukládání klíčů SSH a dalších potenciálně citlivých informací, je dobré zakázat aplikacím přístup.
ProtectDevices=yes Vytvoří soukromý /dev jmenný prostor obsahující pouze pseudo zařízení jako /dev/null a /dev/random , které neumožňují přístup ke skutečnému hardwaru. Také deaktivuje CAP_MKNOD aby nebylo možné vytvářet nové uzly zařízení.
CapabilityBoundingSet= Přijímá bílou listinu a černou listinu privilegovaných funkcí pro jednotku. Možnosti Linuxu narušují přístup uživatelů root k systému, takže privilegovaný přístup lze lépe určit. Klasický příklad je pro NTP nebo chrony abyste mohli konfigurovat systémové hodiny, ale neprováděli žádné další privilegované akce. Další podrobnosti jsou k dispozici v manuálové stránce schopností (7).

ReadWriteDirectories=

ReadOnlyDirectories=

InaccessibleDirectories=

Chová se podobně jako ProtectSystem , ale všechny tři tyto možnosti umožňují jemné řízení přístupu k systému souborů.

Nové možnosti zabezpečení v Red Hat Enterprise Linux 8

Nové možnosti zabezpečení systému dostupné v Red Hat Enterprise Linux 8 jsou:

Možnost Popis
ProtectKernelTunables=yes Zakáže úpravy /proc a /sys .
ProtectKernelModules=yes Zakazuje načítání nebo vyjímání modulů a masek /usr/lib/modules z aplikace.
ProtectControlGroups=yes Zakáže přístup pro zápis do /sys/fs/cgroup/ .
RestrictNamespaces= Omezit všechny jmenné prostory nebo jejich podmnožinu na službu. Přijímá cgroup , ipc , net , mnt , pid , user a uts .
AssertSecurity= Vyžaduje řadu požadavků, které musí systém splnit, aby se služba spustila. Pokud uvedené funkce nejsou dostupné, služba se nespustí a událost se zaprotokoluje. Možnosti jako selinux a uefi-secureboot jsou užitečné pro mnoho prostředí.
MemoryDenyWriteExecute= Zakáže mapování paměti, které je současně zapisovatelné a spustitelné.
RestrictRealtime=yes Zakazuje plánování v reálném čase.
PrivateMounts=yes Způsobuje, že služba běží v soukromém jmenném prostoru připojení.
DynamicUser=yes Efektivně vytváří přechodného uživatele pro aplikaci. Tato možnost pravděpodobně vyžaduje prozkoumání vlastního příspěvku, ale stručně řečeno, systemd implementace je skvělá, protože dynamicky (jak název napovídá) vytváří UID a GID připojením nss modul, který „vytváří“ uživatele za chodu. Tito uživatelé jednoduše neexistují, když služba neběží. Tato funkce je nejužitečnější pro bezstavové aplikace, ale adresáře mohou být mapovány pro zápis.
SystemCallFilter= Umožňuje vám přidat a zakázat jednotlivá systémová volání nebo použít uživatelsky přívětivé skupiny volání, které systemd poskytuje. Pokud jste obeznámeni s seccomp filtrování pomocí kontejnerů poskytuje tato možnost přesně to samé. V obecném smyslu většina uživatelů najde @system-service filtr cenný, který umožňuje relevantní systémová volání potřebná pro většinu služeb. Uživatelé mohou zobrazit seznam skupin a dostupných systémových volání spuštěním systemd-analyze syscall-filter .

[Chcete vyzkoušet Red Hat Enterprise Linux? Stáhněte si ji nyní zdarma.]

Příklad

Pokud jste to dotáhli až sem, možná si říkáte:"Dobře, tohle vypadá opravdu mocně, ale je to hodně k zapamatování." Naštěstí jsme od Red Hat Enterprise Linux 8.1 přidali příkaz, který usnadňuje odkazování a kontrolu stavu těchto možností:

systemd-analyze security [unit]

Tento příkaz vygeneruje rychlý snímek toho, jak systém využívá systemd sandboxing a může také zobrazit jednotlivá nastavení pro jednotku. Tento design usnadňuje identifikaci dostupných možností a také zobrazení jejich použití na podrobné úrovni.

Zde je výstup výchozího httpd.service jednotka:

Tento výstup z systemd-analyze security zobrazuje název, pohodlný popis a hodnocení expozice, které ukazuje spotřebu dostupných nastavení zabezpečení na službu a generuje vážené skóre expozice podle toho, jak izolovaná služba je. Stojí za zmínku, že tento nástroj není určen k poskytování holistického pohledu nebo názoru na zabezpečení kódu nebo aplikace spuštěné v systému. Jen proto, že httpd.service vrátí se jako UNSAFE na výchozí instalaci neznamená, že služba je nezabezpečená.

Nyní, když víme, jak se dotazovat na jednotky a zjistit, které ovládací prvky se používají, podívejme se, jak je aplikovat na jednoduchý webový server. Tento obecný příklad slouží jako snadný výchozí bod pro další služby a aplikace.

Zapnout možnosti zabezpečení

Nejprve vytvořte drop-in systemd a přidejte možnosti zabezpečení. Pro Red Hat Enterprise Linux 8 spusťte:

# systemctl edit httpd

Nebo, pokud chcete, ručně vytvořte /etc/systemd/system/httpd.service.d/security.conf .

Bez ohledu na to, jakým způsobem jste k souboru přistupovali, nyní přidejte:

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

Pro Red Hat Enterprise Linux 7 můžeme použít podobnou šablonu:

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

Jakmile uložíte soubor a restartujete službu, httpd služba bude výrazně izolována od zbytku operačního systému. Pokud dojde někdy ke kompromitaci služby, výrazně se sníží možnost narušení a následného poškození.

Výše uvedené příklady jsou skvělým výchozím bodem pro uzamčení služeb, aplikací a jednotek spuštěných ve vašem systému. Měli byste je samozřejmě otestovat, abyste se ujistili, že jsou vhodné pro váš případ použití, než je zavedete do celého svého vozového parku. Pokud bychom například chtěli poskytovat obsah z domovských adresářů uživatelů, nezahrnuli bychom ProtectHome=yes , ale místo toho použijte ProtectHome=read-only . Za zmínku také stojí, že není na škodu zahrnout novější možnosti přidané v RHEL 8 do souboru jednotky, který je spuštěn v RHEL 7. Bude vydána zpráva s upozorněním a možnost bude ignorována.

Zobrazit výsledky

Nyní můžeme zobrazit používané možnosti spuštěním systemd-analyze httpd :

Můžete vidět, že na webovém serveru se nyní prosazuje řada možností. Hodnocení se také změnilo z UNSAFE na MEDIUM . I když je zcela možné povolit více možností a službu dále uzamknout, odchýlili bychom se od cíle poskytnout praktický příklad, který bude úspěšně použit pro mnoho služeb a aplikací v reálném světě. Nikdy předtím nebylo tak jednoduché omezit přístup tradiční služby k základnímu OS.

Závěr

Pro vývojáře, kteří se zajímají o zabezpečení vašeho vlastního softwaru, mohou být příslušné možnosti zabezpečení snadno přidány do souborů jednotky, které jsou součástí vaší aplikace. Red Hat důrazně doporučuje vývojářům, aby ve výchozím nastavení „zapekli“ co nejvíce zabezpečení, a toto je jeden z nejjednodušších způsobů, jak tohoto cíle dosáhnout.

Pro ty, kteří se zajímají o to, zda jsou zde zobrazené bezpečnostní funkce nadbytečné se SELinuxem, dochází k překrývání funkcí, ale jsou do značné míry nezávislé. Tato nastavení budou platit bez ohledu na to, zda je SELinux používán nebo ne. Tato funkce je obrovská hodnota, když SELinux není životaschopnou volbou kvůli požadavkům politik nebo aplikací pro určité systémy. V ideálním světě by se tyto používaly with SELinux jako součást vrstveného přístupu k zabezpečení.

Doufám, že se vám líbilo, jak snadné je izolovat pracovní zátěže izolovaného prostoru nainstalované na Red Hat Enterprise Linux 8 pomocí systemd . Nyní pokračujte a tam, kde je to vhodné, aplikujte tyto znalosti ve svém prostředí (prostředích). V dalším článku této série se podíváme na používání ovládacích skupin Linuxu, neboli cgroups , prostřednictvím systemd k ochraně cenných systémových zdrojů a vyřešení problému „hlučného souseda“.


Linux
  1. Rozdíl mezi Gtk a Qt aplikacemi?

  2. Jak vypsat Systemd Services v Linuxu

  3. Jak odstranit systémové služby

  1. StartLimitIntervalSec a StartLimitBurst společnosti Systemd nikdy nefungují

  2. Systemd Unit File - WantedBy a After

  3. Závislosti Systemd a pořadí spouštění

  1. Spuštění, zastavení a restartování služeb na systémovém serveru RHEL 7 Linux

  2. Jak spravovat a vypisovat služby v Linuxu

  3. Jak spravovat služby Systemd pomocí Systemctl v systému Linux