Security Enhanced Linux (SELinux) je bezpečnostní rámec, který umožňuje a zakazuje přístup k aplikacím, souborům atd. v systému Linux. Úplný přehled SELinux najdete v části Co je SELinux.
V tomto článku se podíváme na to, co se stane, když je odepřen přístup k požadovanému souboru nebo aplikaci. Jaké zprávy uvidíte, kde jsou tyto zprávy uloženy a co tyto informace vlastně znamenají? V jakých nenormálních situacích způsobených falešně pozitivními výsledky a popíráním duchů se můžete ocitnout? To vše zde prozkoumáme.
Co je odmítnutí?
Odmítnutí je událost vygenerovaná vždy, když je službě, aplikaci, souboru atd. odepřen přístup systémem SELinux. Když k tomu dojde, odmítnutí se uloží do mezipaměti Access Vector Cache (AVC). Někdy se zobrazí zpráva o zamítnutí označovaná jako odmítnutí AVC .
Kde se zaznamenávají zamítnutí?
Nyní jsou tato zamítnutí AVC, stejně jako vše ostatní v Linuxu, zaznamenána systémem. Místo, kde jsou tyto zprávy protokolovány, se liší v závislosti na tom, které systémové démony běží.
- auditd on - /var/log/audit/audit.log
- audit vypnut; rsyslogd na - /var/log/messages
- setroubleshootd, rsyslogd a auditd on – obě umístění, ačkoli zprávy v /var/log/messages jsou snáze pochopitelné
Jak bude odmítnutí vypadat?
Na ploše se někdy zobrazí upozornění na odmítnutí. Když vyberete možnost zobrazit , toto upozornění vám poskytne podrobnosti o tom, co se pokazilo, a někdy i řešení, jak problém vyřešit.
Další věc, kterou můžete udělat, je spustit následující příkazy k vytažení zpráv o zamítnutí:
[root@server ~]# grep "SELinux is preventing" /var/log/messages
Zde je výstup ve srozumitelnějším jazyce, a pokud budete číst pozorně, je předloženo řešení:
Sep 22 13:35:24 server setroubleshoot[3999]: SELinux is preventing rhsmcertd-worke from read access on the file virt.module. For complete SELinux messages run: sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
Sep 22 13:35:24 server platform-python[3999]: SELinux is preventing rhsmcertd-worke from read access on the file virt.module.#012#012***** Plugin catchall_boolean (89.3 confidence) suggests ******************#012#012If you want to allow daemons to dump core#012Then you must tell SELinux about this by enabling the 'daemons_dump_core' boolean.#012#012Do#012setsebool -P daemons_dump_core 1#012#012***** Plugin catchall (11.6 confidence) suggests **************************#012#012If you believe that rhsmcertd-worke should be allowed read access on the virt.module file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'rhsmcertd-worke' --raw | audit2allow -M my-rhsmcertdworke#012# semodule -X 300 -i my-rhsmcertdworke.pp#012
Tento výstup je skutečně užitečný, protože první výše uvedený záznam nám dává následující:
For complete SELinux messages run: sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
Pokud spustíte navrhovaný příkaz, dostanete velmi podrobný, ale přímočarý souhrn toho, co se stalo a co můžete udělat pro nápravu problému. Viz níže:
[root@server ~]# sealert -l 97a1c0df-81ed-4c08-ba27-41c5067b713b
SELinux is preventing rhsmcertd-worke from read access on the file virt.module.
***** Plugin catchall_boolean (89.3 confidence) suggests ******************
If you want to allow daemons to dump core
Then you must tell SELinux about this by enabling the 'daemons_dump_core' boolean.
Do
setsebool -P daemons_dump_core 1
***** Plugin catchall (11.6 confidence) suggests **************************
If you believe that rhsmcertd-worke should be allowed read access on the virt.module file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'rhsmcertd-worke' --raw | audit2allow -M my-rhsmcertdworke
# semodule -X 300 -i my-rhsmcertdworke.pp
Additional Information:
Source Context system_u:system_r:rhsmcertd_t:s0
Target Context system_u:object_r:root_t:s0
Target Objects virt.module [ file ]
Source rhsmcertd-worke
Source Path rhsmcertd-worke
Port <Unknown>
Host server.example.com
Source RPM Packages
Target RPM Packages
Policy RPM selinux-policy-3.14.3-41.el8_2.5.noarch
Selinux Enabled True
Policy Type targeted
Enforcing Mode Enforcing
Host Name server.example.com
Platform Linux server.example.com
4.18.0-193.13.2.el8_2.x86_64 #1 SMP Mon Jul 13
23:17:28 UTC 2020 x86_64 x86_64
Alert Count 265
First Seen 2020-06-24 13:55:40 EDT
Last Seen 2020-09-22 13:35:09 EDT
Local ID 97a1c0df-81ed-4c08-ba27-41c5067b713b
Raw Audit Messages
type=AVC msg=audit(1600796109.687:168): avc: denied { read } for pid=3912 comm="rhsmcertd-worke" name="virt.module" dev="dm-0" ino=50331783 scontext=system_u:system_r:rhsmcertd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0
Hash: rhsmcertd-worke,rhsmcertd_t,root_t,file,read
[ Čtenáři si také užili: Přístup k dokumentaci zásad SELinux ]
Níže uvedený příkaz můžete použít také pro nezpracované auditní zprávy, i když jsou podstatně méně užitečné (a jsou zahrnuty v sealert
výstup).
[root@server ~]# grep "denied"/var/log/audit/audit.log
Zde je jazyk méně uživatelsky přívětivý a nejsou zde žádné navrhované kroky.
type=AVC msg=audit(1600796109.687:168): avc: denied { read } for pid=3912 comm="rhsmcertd-worke" name="virt.module" dev="dm-0" ino=50331783 scontext=system_u:system_r:rhsmcertd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0
Odepření duchů
Při zvláštních příležitostech (speciální SELinux AVC může odmítnout službu, aniž by upozornil uživatele, že k odmítnutí došlo, stejně jako ve své schopnosti vyvolávat frustraci. Když k tomu dojde, je potřeba trochu forenzního kopání. Nedávno můj kolega a mimořádný spisovatel Ken Hess nainstaloval systém správy dokumentů na virtuální stroj CentOS. Během této instalace se nepodařilo nainstalovat DMS bez vysvětlení. Po dlouhém, frustrujícím procesu odstraňování problémů Ken zjistil, že v /var/log/audit/audit.log
se opakovaně objevují zprávy o zamítnutí .
type=AVC msg=audit(1602171971.334:438): avc: denied { write } for pid=12398 comm="httpd" name="31b32f0dfa1f50d778065b767582bb9b.js" dev="dm-0" ino=553885 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_sys_content_t:s0 tclass=file permissive=0
Při další kontrole /var/log/messages
, našel následující:
Oct 8 12:33:17 dms python: SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25.#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow httpd to can network connect#012Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.#012#012Do#012setsebool -P httpd_can_network_connect 1#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow httpd to can sendmail#012Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean.#012#012Do#012setsebool -P httpd_can_sendmail 1#012#012***** Plugin catchall_boolean (32.5 confidence) suggests ******************#012#012If you want to allow nis to enabled#012Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.#012#012Do#012setsebool -P nis_enabled 1#012#012***** Plugin catchall (4.5 confidence) suggests ***************************#012#012If you believe that httpd should be allowed name_connect access on the port 25 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'httpd' --raw | audit2allow -M my-httpd#012# semodule -i my-httpd.pp#012 Oct 8 12:33:20 dms setroubleshoot: SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. For complete SELinux messages run: sealert -l ce75fc38-5696-4b21-b099-7780db5960f3
Konečně něco užitečného. Potom spustil tento příkaz:
# sealert -l ce75fc38-5696-4b21-b099-7780db5960f3
Která poskytla tyto informace:
[user@host ~] # SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can network connect Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean. Do setsebool -P httpd_can_network_connect 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can sendmail Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean. Do setsebool -P httpd_can_sendmail 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow nis to enabled Then you must tell SELinux about this by enabling the 'nis_enabled' boolean. Do setsebool -P nis_enabled 1 ***** Plugin catchall (4.5 confidence) suggests *************************** If you believe that httpd should be allowed name_connect access on the port 25 tcp_socket by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c 'httpd' --raw | audit2allow -M my-httpd # semodule -i my-httpd.pp Additional Information:
Additional Information: [root@dms dms]# more sealert.txt SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket port 25. ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can network connect Then you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean. Do setsebool -P httpd_can_network_connect 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow httpd to can sendmail Then you must tell SELinux about this by enabling the 'httpd_can_sendmail' boolean. Do setsebool -P httpd_can_sendmail 1 ***** Plugin catchall_boolean (32.5 confidence) suggests ****************** If you want to allow nis to enabled Then you must tell SELinux about this by enabling the 'nis_enabled' boolean. Do setsebool -P nis_enabled 1 ***** Plugin catchall (4.5 confidence) suggests *************************** If you believe that httpd should be allowed name_connect access on the port 25 tcp_socket by default. Then you should report this as a bug. You can generate a local policy module to allow this access. Do allow this access for now by executing: # ausearch -c 'httpd' --raw | audit2allow -M my-httpd # semodule -i my-httpd.pp Additional Information: Source Context system_u:system_r:httpd_t:s0 Target Context system_u:object_r:smtp_port_t:s0 Target Objects port 25 [ tcp_socket ] Source httpd Source Path /usr/sbin/httpd Port 25 Host dms Source RPM Packages Target RPM Packages Policy RPM selinux-policy-3.13.1-252.el7.noarch Selinux Enabled True Policy Type targeted Enforcing Mode Permissive Host Name dms Platform Linux dms 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 Alert Count 2 First Seen 2020-10-08 12:33:15 CDT Last Seen 2020-10-08 12:33:15 CDT Local ID ce75fc38-5696-4b21-b099-7780db5960f3 Raw Audit Messages type=AVC msg=audit(1602178395.253:461): avc: denied { name_connect } for pid=12565 comm="httpd" dest=25 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:smtp_port_t :s0 tclass=tcp_socket permissive=1 Hash: httpd,httpd_t,smtp_port_t,tcp_socket,name_connect
Když jsem Kena požádal, aby zvážil své zkušenosti, řekl:
Je těžké vědět, kdy je chyba nebo absence chyby způsobena SELinuxem. Když jste zkontrolovali výjimky brány firewall, oprávnění souborového systému a předpoklady aplikace, dalším krokem je kontrola problémů s kontextem SELinuxu. Nejběžnějším řešením je deaktivovat SELinux jeho uvedením do Permisivního režimu, což není dobrý nápad, protože to způsobí, že váš systém bude zranitelný. Lepší metodou je zkontrolovat soubory /var/log/messages a /var/log/audit/audit.log pro odmítnutí SELinuxu a pracovat na individuálním odstranění odmítnutí, dokud vaše aplikace nebude fungovat. K tomu musí SELinux zůstat v režimu vynucování.
Seznam řešení problémů při nastavování nové aplikace vypadá takto:
1. Zkontrolujte výjimky brány firewall pro porty vaší aplikace.
2. Zkontrolujte oprávnění souborového systému, abyste se ujistili, že váš servisní účet má správná oprávnění ke čtení, zápisu a spouštění tam, kde je to nutné.
3. Zkontrolujte předpoklady a závislosti vaší aplikace.
4. Zkontrolujte soubory /var/log/messages a /var/log/audit/audit.log, zda neobsahují odmítnutí SELinuxu.
Permisivní režim SELinux lze krátce použít ke kontrole, zda je SELinux viníkem, který brání vaší aplikaci v práci. Jakmile zjistíte, že se jedná o problém, vraťte jej do režimu prosazování a začněte měnit relevantní kontexty. Kontext SELinux naleznete v těchto informacích.
[ Zlepšete své dovednosti při správě a používání SELinuxu pomocí tohoto užitečného průvodce. ]
Sbalit
SELinux je účinný bezpečnostní rámec, který může být při správné implementaci neuvěřitelně užitečný. Stejně jako u každého dobrého bezpečnostního systému budete mít časem zamítnutí. Vědět, co dělat s informacemi, které máte k dispozici, je prvořadé pro řešení jakýchkoli problémů, které se mohou vyskytnout, nebo pro umožnění legitimních procesů v systému. Nyní víte, kde jsou protokoly uchovávány a jak je nejlépe interpretovat. V budoucnu budete moci reagovat na všechna upozornění SELinux, která se objeví ve vašem systému.