„Je důležitým a oblíbeným faktem, že věci nejsou vždy takové, jak se zdají…“
―Douglas Adams, Stopařův průvodce po galaxii
Bezpečnostní. Kalení. Dodržování. Politika. Čtyři jezdci z SysAdmin apokalypsy. Kromě našich každodenních úkolů – monitorování, zálohování, implementace, ladění, aktualizace a tak dále – máme na starosti také zabezpečení našich systémů. Dokonce i ty systémy, kde nám poskytovatel třetí strany říká, abychom deaktivovali vylepšené zabezpečení. Vypadá to jako práce pro Mission Impossible je Ethan Hunt.
Tváří v tvář tomuto dilematu se někteří systémoví správci rozhodnou vzít si modrou pilulku, protože si myslí, že nikdy nebudou znát odpověď na velkou otázku života, vesmíru a všeho ostatního. A jak všichni víme, odpověď je 42 .
V duchu Stopařova průvodce po galaxii , zde je 42 odpovědí na velké otázky o správě a používání SELinuxu s vašimi systémy.
- SELinux je systém LABELING, což znamená, že každý proces má svůj LABEL. Každý soubor, adresář a systémový objekt má LABEL. Pravidla zásad řídí přístup mezi označenými procesy a označenými objekty. Jádro tato pravidla vynucuje.
- Dva nejdůležitější pojmy jsou:Označení (soubory, proces, porty atd.) a vynucení typu (který od sebe izoluje procesy na základě typů).
- Správný formát štítku je
user:role:type:level
(volitelné ).
- Účel vynucení víceúrovňového zabezpečení (MLS) je řídit procesy (domény ) na základě úrovně zabezpečení dat, která budou používat. Tajný proces například nemůže číst přísně tajná data.
- Vynucení zabezpečení více kategorií (MCS) chrání podobné procesy před sebou navzájem (jako jsou virtuální stroje, ozubená kola OpenShift, sandboxy SELinux, kontejnery atd.).
- Parametry jádra pro změnu režimů SELinux při spouštění:
autorelabel=1
→ donutí systém přeznačkovatselinux=0
→ jádro nenačte žádnou část infrastruktury SELinuxenforcing=0
→ zavést v permisivním režimu
- Pokud potřebujete znovu označit celý systém:
# touch /.autorelabel
# rebootPokud označení systému obsahuje velké množství chyb, možná budete muset zavést systém v permisivním režimu, aby bylo automatické označování úspěšné.
-
Chcete-li zkontrolovat, zda je povolen SELinux:
# getenforce
-
Chcete-li dočasně povolit/zakázat SELinux:
# setenforce [1|0]
-
Stavový nástroj SELinux:
# sestatus
-
Konfigurační soubor:
/etc/selinux/config
- Jak SELinux funguje? Zde je příklad označení pro webový server Apache:
- Binární:
/usr/sbin/httpd
→httpd_exec_t
- Konfigurační adresář:
/etc/httpd
→httpd_config_t
- Adresář logfile:
/var/log/httpd
→httpd_log_t
- Adresář obsahu:
/var/www/html
→httpd_sys_content_t
- Spouštěcí skript:
/usr/lib/systemd/system/httpd.service
→httpd_unit_file_d
- Proces:
/usr/sbin/httpd -DFOREGROUND
→httpd_t
- Porty:
80/tcp, 443/tcp
→httpd_t, http_port_t
- Binární:
Proces běžící v httpd_t
kontext může interagovat s objektem pomocí httpd_something_t
štítek.
- Mnoho příkazů přijímá argument
-Z
pro zobrazení, vytvoření a úpravu kontextu:ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
Kontexty se nastavují při vytváření souborů na základě kontextu jejich nadřazeného adresáře (až na několik výjimek). RPM mohou nastavit kontext jako součást instalace.
- Existují čtyři hlavní příčiny chyb SELinux, které jsou dále vysvětleny v bodech 15-21 níže:
- Problémy s označováním
- Něco, co SELinux potřebuje vědět
- Chyba v zásadách/aplikaci SELinux
- Vaše informace mohou být ohroženy
- Problém s označováním: Pokud máte soubory v
/srv/myweb
nejsou správně označeny, přístup může být odepřen. Zde je několik způsobů, jak to opravit:- Pokud znáte štítek:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- Pokud znáte soubor s ekvivalentním označením:
# semanage fcontext -a -e /srv/myweb /var/www
- Obnovte kontext (pro oba případy):
# restorecon -vR /srv/myweb
- Pokud znáte štítek:
- Problém s označováním: Pokud soubor přesunete místo zkopírování, zachová si svůj původní kontext. Chcete-li tyto problémy vyřešit:
-
Změňte kontextový příkaz s popiskem:
$ sudo chcon -t httpd_system_content_t /var/www/html/index.html
-
Změňte kontextový příkaz s referenčním štítkem:
$ sudo chcon --reference /var/www/html/ /var/www/html/index.html
-
Obnovte kontext (pro oba případy):
$ sudo restorecon -vR /var/www/html/
-
-
Pokud to SELinux potřebuje vědět HTTPD naslouchá na portu 8585, řekněte SELinuxu:
$ sudo semanage port -a -t http_port_t -p tcp 8585
-
SELinux to potřebuje vědět booleans umožňují měnit části zásad SELinux za běhu bez znalosti psaní zásad SELinux. Pokud například chcete, aby httpd odeslal e-mail, zadejte:
$ sudo setsebool -P httpd_can_sendmail 1
- SELinux to potřebuje vědět Booleany jsou pouze nastavení vypnutí/zapnutí pro SELinux:
- Chcete-li zobrazit všechny logické hodnoty:
# getsebool -a
- Chcete-li zobrazit popis každého z nich:
# semanage boolean -l
- Chcete-li nastavit logické provedení:
# setsebool [_boolean_] [1|0]
- Chcete-li jej nakonfigurovat trvale, přidejte
-P
. Například:
# setsebool httpd_enable_ftp_server 1 -P
- Chcete-li zobrazit všechny logické hodnoty:
- Zásady/aplikace SELinux mohou obsahovat chyby, včetně:
- Neobvyklé cesty kódu
- Konfigurace
- Přesměrování
stdout
- Uniklé deskriptory souborů
- Spustitelná paměť
- Špatně sestavené knihovny
- Vaše informace mohou být ohroženy pokud máte omezené domény, které se snaží:
- Načtěte moduly jádra
- Vypněte režim vynucení SELinux
- Napište do
etc_t/shadow_t
- Upravit pravidla iptables
- Nástroje SELinux pro vývoj modulů zásad:
$ yum -y install setroubleshoot setroubleshoot-server
Restartujte nebo restartujte
auditd
po instalaci.
- Použijte
journalctl
pro výpis všech protokolů souvisejících ssetroubleshoot
:$ sudo journalctl -t setroubleshoot --since=14:20
- Použijte
journalctl
pro výpis všech protokolů souvisejících s konkrétním štítkem SELinux. Například:$ sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
-
Použijte
setroubleshoot
log, když dojde k chybě SELinux a navrhněte některá možná řešení. Například zjournalctl
:Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
SELinux is preventing 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_syscontent_t.
Then you can restorecon.
Do
# /sbin/restorecon -v /var/www/html/index.html
- Protokolování:SELinux zaznamenává informace všude:
/var/log/messages
/var/log/audit/audit.log
/var/lib/setroubleshoot/setroubleshoot_database.xml
-
Protokolování:Hledání chyb SELinux v protokolu auditu:
$ sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
-
Chcete-li vyhledat zprávy SELinux Access Vector Cache (AVC) pro konkrétní službu:
$ sudo ausearch -m avc -c httpd
- Položka
audit2allow
obslužný program shromažďuje informace z protokolů zakázaných operací a poté generuje pravidla SELinux policy-allow. Například:- Chcete-li vytvořit lidsky čitelný popis, proč byl přístup odepřen:
# audit2allow -w -a
- Chcete-li zobrazit pravidlo vynucení typu, které umožňuje odepřený přístup:
# audit2allow -a
- Chcete-li vytvořit vlastní modul:
# audit2allow -a -M mypolicy
-M
volba vytvoří soubor pro vynucení typu (.te) se zadaným názvem a zkompiluje pravidlo do balíčku zásad (.pp):mypolicy.pp mypolicy.te
- Instalace vlastního modulu:
# semodule -i mypolicy.pp
- Chcete-li vytvořit lidsky čitelný popis, proč byl přístup odepřen:
- Chcete-li nakonfigurovat jeden proces (doménu), aby spouštěl povolený provoz:
# semanage permissive -a httpd_t
- Pokud již nechcete, aby byla doména povolena:
# semanage permissive -d httpd_t
-
Zakázání všech povolených domén:
$ sudo semodule -d permissivedomains
-
Povolení zásad SELinux MLS:
$ sudo yum install selinux-policy-mls
V
/etc/selinux/config:
SELINUX=permissive
SELINUXTYPE=mlsUjistěte se, že SELinux běží v permisivním režimu:
$ sudo setenforce 0
Použijte
fixfiles
skript, který zajistí, že soubory budou při příštím restartu znovu označeny:$ sudo fixfiles -F onboot
$ sudo reboot
-
Vytvořte uživatele s konkrétním rozsahem MLS:
$ sudo useradd -Z staff_u tux
Pomocí
useradd
příkaz, namapujte nového uživatele na stávajícího uživatele SELinuxu (v tomto případěstaff_u
).
-
Chcete-li zobrazit mapování mezi uživateli SELinuxu a Linuxu:
$ sudo semanage login -l
-
Definujte konkrétní rozsah pro uživatele:
$ sudo semanage login --modify --range s2:c100 tux
-
Oprava štítku v domovském adresáři uživatele (v případě potřeby):
$ sudo chcon -R -l s2:c100 /home/tux
-
Seznam aktuálních kategorií:
$ sudo chcat -L
-
Chcete-li upravit kategorie nebo začít vytvářet vlastní, upravte soubor následovně:
/etc/selinux/_<selinuxtype>_/setrans.conf
-
Chcete-li spustit příkaz nebo skript v konkrétním souboru, roli a uživatelském kontextu:
$ sudo runcon -t initrc_t -r system_r -u user_u yourcommandhere
- -t je kontext souboru
- -r je kontext role
- -u je kontext uživatele
- Kontejnery běžící se zakázaným SELinux:
- S Podmanem:
# podman run --security-opt label=disable …
- S Dockerem:
# docker run --security-opt label=disable …
- S Podmanem:
- Pokud potřebujete udělit kontejneru úplný přístup k systému:
- S Podmanem:
# podman run --privileged …
- S Dockerem:
# docker run --privileged …
- S Podmanem:
A s tímto už znáte odpověď. Takže prosím: Nepropadejte panice a zapněte SELinux .
Zdroje:
- SELinux od Dana Walshe
- Váš vizuální návod pro prosazování zásad SELinux také od Dana Walshe
- Security Enhanced Linux pro pouhé smrtelníky od Thomase Camerona
- Omalovánky SELinux od Máirín Duffy
- Uživatelská a administrátorská příručka SELinux — Red Hat Enterprise Linux 7