Vyhledávání na webu

Implementace povinného řízení přístupu pomocí SELinux nebo AppArmor v Linuxu


K překonání omezení a ke zvýšení bezpečnostních mechanismů poskytovaných standardními ugo/rwx oprávněními a seznamy řízení přístupu navrhla Národní bezpečnostní agentura Spojených států (NSA) flexibilní < metodaMandatory Access Control (MAC) známá jako SELinux (zkratka pro Security Enhanced Linux), aby se mimo jiné omezila schopnost procesů přistupovat nebo provádět jiné operace se systémovými objekty (jako jsou soubory, adresáře, síťové porty atd.) s co nejmenším oprávněním, přičemž stále umožňuje pozdější úpravy tohoto modelu.

Dalším oblíbeným a široce používaným MAC je AppArmor, který kromě funkcí poskytovaných SELinux zahrnuje režim učení, který umožňuje systému „učit se “, jak se chová konkrétní aplikace, a nastavit limity konfigurací profilů pro bezpečné používání aplikací.

V CentOS 7 je SELinux začleněn do samotného jádra a je standardně povolen v režimu Vynucování (více o tom v další části), na rozdíl od openSUSE a Ubuntu, které používají AppArmor.

V tomto článku vysvětlíme základy SELinux a AppArmor a jak jeden z těchto nástrojů využít ve svůj prospěch v závislosti na vámi zvolené distribuci.

Úvod do SELinux a jak jej používat na CentOS 7

Security Enhanced Linux může fungovat dvěma různými způsoby:

  1. Vynucování: SELinux odepře přístup na základě pravidel zásad SELinux, což je soubor pokynů, které řídí bezpečnostní jádro.
  2. Permisivní: SELinux neodmítá přístup, ale zaznamenává se odmítnutí akcí, které by byly odepřeny, kdyby byly spuštěny v režimu vynucení.

SELinux lze také zakázat. Ačkoli se nejedná o provozní režim sám o sobě, je to stále možnost. Naučit se tento nástroj používat je však lepší, než jej jen ignorovat. Mějte to na paměti!

Chcete-li zobrazit aktuální režim SELinux, použijte getenforce. Chcete-li přepnout provozní režim, použijte setenforce 0 (nastavte jej na Permisivní) nebo setenforce 1 (Vynucování silný>).

Protože tato změna nepřežije reboot, budete muset upravit soubor /etc/selinux/config a nastavit proměnnou SELINUX na některou z vynucování, povolující nebo zakázáno za účelem dosažení stálosti po restartování:

Na okraj, pokud getenforce vrátí Disabled, budete muset upravit /etc/selinux/config na požadovaný operační režim a restartovat. Jinak nebudete moci nastavit (nebo přepnout) provozní režim pomocí setenforce.

Jedno z typických použití setenforce spočívá v přepínání mezi režimy SELinux (od vynucení po povolující nebo naopak) k odstraňování problémů s aplikací, která chová se špatně nebo nefunguje podle očekávání. Pokud to po nastavení SELinuxu na Permisivní režim funguje, můžete si být jisti, že se díváte na problém s oprávněními SELinux.

Dva klasické případy, kdy se s největší pravděpodobností budeme muset vypořádat se SELinuxem, jsou:

  1. Změna výchozího portu, na kterém démon naslouchá.
  2. Nastavení direktivy DocumentRoot pro virtuálního hostitele mimo /var/www/html.

Podívejme se na tyto dva případy pomocí následujících příkladů.

PŘÍKLAD 1: Změna výchozího portu pro démona sshd

Jedna z prvních věcí, kterou většina systémových administrátorů dělá, aby zabezpečila své servery, je změna portu, na kterém SSH démon naslouchá, většinou proto, aby odradili skenery portů a externí útočníky. K tomu použijeme direktivu Port v /etc/ssh/sshd_config následovanou novým číslem portu následovně (v tomto případě použijeme port 9999):


Port 9999

Po pokusu o restartování služby a kontrole jejího stavu uvidíme, že se nepodařilo spustit:


systemctl restart sshd
systemctl status sshd

Pokud se podíváme na /var/log/audit/audit.log, uvidíme, že sshd nebylo možné spustit na portu 9999 od SELinux, protože se jedná o vyhrazený port pro službu JBoss Management (zprávy protokolu SELinux obsahují slovo “AVC”, aby mohly být snadno identifikované z jiných zpráv):


cat /var/log/audit/audit.log | grep AVC | tail -1

V tuto chvíli by většina lidí pravděpodobně deaktivovala SELinux, ale my to neuděláme. Uvidíme, že existuje způsob, jak SELinux a sshd naslouchající na jiném portu spolu žít v harmonii. Ujistěte se, že máte nainstalovaný balíček policycoreutils-python a spusťte jej:


yum install policycoreutils-python

Zobrazení seznamu portů, na kterých SELinux umožňuje sshd naslouchat. Na následujícím obrázku také vidíme, že port 9999 byl rezervován pro jinou službu, a proto jej prozatím nemůžeme použít ke spuštění jiné služby:


semanage port -l | grep ssh

Samozřejmě bychom si mohli vybrat jiný port pro SSH, ale pokud jsme si jisti, že nebudeme muset tento konkrétní stroj používat pro žádné služby související s JBoss, můžeme upravit stávající pravidlo SELinux a místo toho přiřadit tento port SSH:


semanage port -m -t ssh_port_t -p tcp 9999

Poté můžeme pomocí prvního příkazu semanage zkontrolovat, zda byl port správně přiřazen, nebo pomocí voleb -lC (zkratka pro vlastní seznam):


semanage port -lC
semanage port -l | grep ssh

Nyní můžeme restartovat SSH a připojit se ke službě pomocí portu 9999. Všimněte si, že tato změna přežije restart.

PŘÍKLAD 2: Výběr DocumentRoot mimo /var/www/html pro virtuálního hostitele

Pokud potřebujete nastavit virtuálního hostitele Apache pomocí jiného adresáře než /var/www/html jako DocumentRoot (řekněme například /websrv/sites /gabriel/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

Apache odmítne poskytnout obsah, protože index.html byl označen typem default_t SELinux, ke kterému Apache nemá přístup:


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

Stejně jako v předchozím příkladu můžete použít následující příkaz k ověření, že se skutečně jedná o problém související se SELinuxem:


cat /var/log/audit/audit.log | grep AVC | tail -1

Chcete-li změnit štítek /websrv/sites/gabriel/public_html rekurzivně na httpd_sys_content_t, postupujte takto:


semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

Výše uvedený příkaz udělí Apache přístup pouze pro čtení k tomuto adresáři a jeho obsahu.

A konečně, chcete-li použít zásady (a změnit štítek okamžitě v platnost), proveďte:


restorecon -R -v /websrv/sites/gabriel/public_html

Nyní byste měli mít přístup k adresáři:


wget http://localhost/index.html

Další informace o SELinuxu najdete v příručce Fedora 22 SELinux and Administrator.