Portál AbcLinuxu, 29. května 2024 06:19

Nagios + Nrpe + SELinux

5.10.2022 23:42 | Přečteno: 2917× | linux | poslední úprava: 5.10.2022 23:46

Jak detekovat problémy s SELinux a jak je řešit?

BFU řešení?

Většinou bývá na začátku různých návodů deaktivace SELinuxu. Nebo v případě, že něco nejde, tak se jde a deaktivuje SELinux a dál už se to neřeší. Takže takto ne. Teď si ukážeme, jak problémy dohledat a řešit. Tento zápisek vznikl jako pokračování zápisku: Střípky z IT - (9) : Nagios : Uhádnete, kde byl problém?

Ve zmíněném zápisku to může chvilku vypadat beznadějně, ale ve skutečnosti je to celkem jednoduché.


Diagnostika

Budeme si vše ukazovat na AlmaLinux 8.x. Když máme nějaký problém s oprávněními, tak šup se podívat do logu. Bezpečnostní věci se logují do audit logu, tj. do "/var/log/audit/audit.log". V případě zmíněného kvízu tam uvidíme něco jako toto:

tail -n 50 /var/log/audit/audit.log |grep -i AVC
type=AVC msg=audit(1664983293.312:637187): avc:  denied  { getattr } for  pid=1461003 comm="sh" path="/usr/bin/sudo" dev="dm-2" ino=20254 scontext=system_u:system_r:nrpe_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0
type=AVC msg=audit(1664983293.312:637188): avc:  denied  { getattr } for  pid=1461003 comm="sh" path="/usr/bin/sudo" dev="dm-2" ino=20254 scontext=system_u:system_r:nrpe_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file permissive=0

Co teď? Nu, evidentně je to problém SELinuxu. Můžeme si zkusit ho dočasně vypnout a ověřit funkčnost takto:

# deaktivace SELinux (logy se budou tvořit dále, ale politiky se nebudou uplatňovat)
setenforce 0

# ověříme, že je deaktivováno
getenforce

# provedeme akci, která nám nešla

# následně znovu povolíme SELinux (restarty apod.  nejsou třeba, vše funguje hned)
setenforce 1
getenforce

nrpe-selinux

Systém není postaven hloupě, s SELinux se počítá. Proto existuje balíček "nrpe-selinux". Tento balíček by měl doplnit kompatibilitu nagios modulů s SELinux. Stačí jen nainstalovat balíček:

dnf install nrpe-selinux

Tento balíček nainstaluje SELinux politiku, takže pak v modulech uvidíme "nrpe_epel" :

emodule -l |grep nrpe
nrpe_epel

Po instalaci tohoto modulu je potřeba zapnout ještě fci na povolení volání sudo:

# povolíme
setsebool -P nagios_run_sudo on

# ověříme nastavení
getsebool -a |grep -i nagi
logging_syslogd_run_nagios_plugins --> off
nagios_run_pnp4nagios --> off
nagios_run_sudo --> on
nagios_use_nfs --> off

Problém je, že i tak nám to nebude fungovat. Důvod je ten, že tyto politiky nepočítají s moduly třetích stran. Jsou stavěny jen na moduly dodávané s ditribucí / repositářem apod. My ale chceme používat 3rd modul, který volá systemctl apod. Chybu, kterou v našem případě pak dostaneme bude:

# původní chyba (setsebool -P nagios_run_sudo off):
NRPE: Unable to read output

# aktuální chyba (setsebool -P nagios_run_sudo on)
UNKNOWN: nagiosplugin.error.CheckError: [Errno 13] Permission denied: 'systemctl'

SELinux politiky

Na práci s SELinuxem máme nějaké nástroje, které nejsou by default součástí instalace (např. audit2allow), takže doinstalujeme:

dnf install setroubleshoot

Nyní si můžeme udělat přehledný výpis chyb z logu, ze kterých pak můžeme vyrobit SELinux politiku:

# vyhledání záznamů v logu
ausearch -m AVC --start 02/04/2019 17:00:00 --end 02/04/2019 18:00:00

# konverze do čitelnějšího formátu
ausearch -m AVC --start 02/04/2019 17:00:00 --end 02/04/2019 18:00:00 | audit2allow

#============= nrpe_t ==============

#!!!! This avc is allowed in the current policy
allow nrpe_t chkpwd_exec_t:file { execute execute_no_trans map open read };
allow nrpe_t gconf_home_t:dir search;
allow nrpe_t init_t:unix_stream_socket connectto;
allow nrpe_t initrc_var_run_t:file { lock open read };
allow nrpe_t self:capability dac_read_search;

#!!!! This avc is allowed in the current policy
allow nrpe_t self:capability audit_write;

#!!!! This avc is allowed in the current policy
allow nrpe_t self:netlink_audit_socket { create nlmsg_relay };

#!!!! This avc has a dontaudit rule in the current policy
allow nrpe_t shadow_t:file { getattr open read };

#!!!! This avc is allowed in the current policy
allow nrpe_t sudo_exec_t:file { execute execute_no_trans getattr map open read };

#!!!! This avc can be allowed using the boolean 'domain_can_mmap_files'
allow nrpe_t systemd_systemctl_exec_t:file map;
allow nrpe_t systemd_systemctl_exec_t:file { execute execute_no_trans open read };

Znalý člověk SELinuxu si všiml, že výše je chyba. Tou chybou je vyhledávání logů ohledně AVC. Existuje totiž ještě USER_AVC. Takže celé by to mělo být (za přesnost výpisu neručím, jsou to starší poznámky, možná neúplné, je třeba to brát jako příklad, jak postupovat):

ausearch -m AVC,USER_AVC --start 10/05/2022 17:00:00 --end 10/05/2022 18:00:00 | audit2allow

#============= nrpe_t ==============

#!!!! This avc is allowed in the current policy
allow nrpe_t chkpwd_exec_t:file { execute execute_no_trans map open read };

#!!!! This avc is allowed in the current policy
allow nrpe_t gconf_home_t:dir search;
allow nrpe_t init_t:system status;

#!!!! This avc is allowed in the current policy
allow nrpe_t init_t:unix_stream_socket connectto;

#!!!! This avc is allowed in the current policy
allow nrpe_t initrc_var_run_t:file { lock open read };

#!!!! This avc is allowed in the current policy
allow nrpe_t self:capability { audit_write dac_read_search };

#!!!! This avc is allowed in the current policy
allow nrpe_t self:netlink_audit_socket { create nlmsg_relay };

#!!!! This avc is allowed in the current policy
allow nrpe_t shadow_t:file { getattr open read };

#!!!! This avc is allowed in the current policy
allow nrpe_t sudo_exec_t:file { execute execute_no_trans getattr map open read };

#!!!! This avc is allowed in the current policy
allow nrpe_t systemd_logind_t:dbus send_msg;

#!!!! This avc can be allowed using the boolean 'domain_can_mmap_files'
allow nrpe_t systemd_systemctl_exec_t:file map;
allow nrpe_t systemd_systemctl_exec_t:file { execute execute_no_trans open read };

#!!!! This avc is allowed in the current policy
allow nrpe_t systemd_unit_file_t:service status;

#============= systemd_logind_t ==============

#!!!! This avc is allowed in the current policy
allow systemd_logind_t nrpe_t:dbus send_msg;

Vygenerujeme si policy pro SELinux a provedeme import

# vygenerování policy / modulu
ausearch -m AVC,USER_AVC --start 10/05/2022 17:00:00 --end 10/05/2022 18:00:00 | audit2allow -a -M nrpe_systemd

# výstupem jsou dva soubory:
nrpe_systemd.te # čitelný, ze kterého se vyrábí nečitelný modul
nrpe_systemd.pp # modul jako výstup z ".te" souboru

# import modulu
semodule -i nrpe_systemd.pp

# ověření, že byl naimportován
semodule -l |grep nrpe
nrpe_epel
nrpe_systemd

Po naimportování modulu začne fungovat i vzdálené volání "check_systemd" a vše šlape.


Závěr

V zápisku jsme si ukázali, jak jednoduše najít, kde je problém, jaký je postup pro jeho řešení apod. Pokud použijeme předpřipravené nástroje, není to nic složitého.

Zdar Max        

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

5.10.2022 23:57 X
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Odpovědět | Sbalit | Link | Blokovat | Admin
Muzes zavrit ten bug ;)..
Max avatar 6.10.2022 00:44 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Není zřejmé, že jde o to samé. Nebo jsem něco přehlédl?
Zdar Max
Měl jsem sen ... :(
6.10.2022 09:59 X
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
ano
6.10.2022 12:54 X
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Piste laskave za sebe ok? Hm?
6.10.2022 10:31 alkoholik | skóre: 40 | blog: Alkoholik
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Je strasne jednoduche se podivat do logu, jestli ta hlaska zmizela.
Ja bych si tipnul ze ne, protoze jde o jiny problem.
Ruža Becelin avatar 6.10.2022 10:38 Ruža Becelin | skóre: 40 | blog: RuzaBecelinBlog
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Odpovědět | Sbalit | Link | Blokovat | Admin
> tail -n 50 /var/log/audit/audit.log |grep -i AVC

Projde jenom pod rootem a jeste je tam zbytecna pipe, radeji tedy:

sudo grep -i AVC /var/log/audit/audit.log

Navic proc grepovat, kdyz mame audit2why?

;-)
Max avatar 6.10.2022 12:58 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Tak audit2why není standardní součástí distribuce, takže proto. Grep přes pajpu dělám ze zvyku a většinou kvůli i omezení počtu řádků, proto ten "tail -n 50". Na druhou stranu, v některých případech ale dělám i rovnou grep (když něco hledám v adresáři a podadresářích).
Zdar Max
Měl jsem sen ... :(
Ruža Becelin avatar 6.10.2022 13:45 Ruža Becelin | skóre: 40 | blog: RuzaBecelinBlog
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Hmm, ja ho teda v Alme 8 mam:
policycoreutils-python-utils-2.9-19.el8.noarch : SELinux policy core python utilities
Repo        : baseos
Matched from:
Filename    : /usr/bin/audit2why
Coz je mimochodem uplne ten samy balik, ktery obsahuje audit2allow.

To s tim omezenim poctu radku nechapu - takhle, asi bych ev. grepoval primo ten proces, takze grep sudo /var/log/audit/audit.log, ale i tak davam prednost audit2why.
Max avatar 6.10.2022 14:19 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Překouknul jsem se, myslel jsem audit2allow, který by měl být součástí setroubleshoot.
No, mám velký log, chci si parsovat jen posledních x řádků, nechci ten soubor prohledávat celý. A grep posledních 50 řádků udělám jednoduše přes tail -n 50 |grep...
Zdar Max
Měl jsem sen ... :(
Max avatar 6.10.2022 14:22 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Tak ne, asi je fakt součástí policycoreutils-python-utils. Každopádně nebylo nainstalováno by default.
Zdar Max
Měl jsem sen ... :(
9.10.2023 15:33 tlamik | skóre: 21 | Karvina
Rozbalit Rozbalit vše Re: Nagios + Nrpe + SELinux
Odpovědět | Sbalit | Link | Blokovat | Admin
Narazil jsem na podobnou chybu, resp. v Nagiosu používám plugin , který jednoduše zkontroluje dostupnost aktualizací. Přestože je u pluginu napsáno, že nepotřebuje roota ani sudo, tak sudo pro nrpe mám nastaveno (hlavně pro jiné pluginy).

No a teď to přijde, mám několik serverů, které mají stejnou verzi OS, kernelu, atp. a vůči jednomu z nich mi Nagios vypisuje dostupnost aktualizací a vůči ostatním ne. V messages žádná selinux chyba, sealert taky čistý a přesto, když dám setenforce 0, tak mi to funguje i na zbylých.

Zkoušel jsem pomocí sesearch porovnávat selinuxí výjimky, ale k ničemu to nevedelo.

Když jsem v nrpe.cfg zapnul debug, tak mi to samozřejmě píše tu známou bug chybu "nrpe[2009411]: WARNING: my_system() seteuid(0): Operation not permitted", nicméně to píše i na serveru, kde to funguje.

Nagios server jede na C7 a klienti jsou RHEL8.

Info na závěr je, že mě to samozřejmě fungovalo na všech serverech ani nevím kdy to na některých fungovat přestalo (možná nějaké aktualizace).

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.