GNU/Linux >> Znalost Linux >  >> Linux

Jak číst a opravovat zprávy o odmítnutí SELinuxu

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.


Linux
  1. Jak dočasně nebo trvale zakázat SELinux

  2. Jak číst a zapisovat na jednotky Windows NTFS jako každý uživatel

  3. Jak číst IP adresu pozpátku?

  1. Jak zakázat SELinux na CentOS?

  2. Jak otevřít, číst a zapisovat ze sériového portu v C?

  3. Jak číst zprávy syslog oom-killer?

  1. Proměnné prostředí Linux:Jak číst a nastavovat na Linux VPS

  2. Jak na to:Replikace a konfigurace DRBD

  3. Co jsou uživatelé SELinuxu a jak mapovat uživatele Linuxu na uživatele SELinuxu