SELinux: integrace se Zabbixem a dalšími nástroji

Co nás čeká?

V tomto článku se podrobně seznámíme se základy SELinuxu, jeho správnou integrací se Zabbixem a ukážeme si, jak efektivně vytvářet vlastní SELinux politiky pro řešení nejčastějších problémů. Dále si předvedeme, jak SELinux monitorovat přímo v Zabbixu, což vám pomůže zvýšit bezpečnost vašich systémů a zároveň usnadní každodenní administraci.

Návod je určen pro distribuce na bázi RPM. (RHEL, CentOS, Rocky Linux, ALMA, Fedora,…)

Co je SELinux a jak funguje?

SELinux (Security-Enhanced Linux) je bezpečnostní modul Linuxu, který implementuje povinné řízení přístupu (Mandatory Access Control, MAC). Na rozdíl od standardního řízení přístupu (Discretionary Access Control, DAC), kde uživatelé určují práva ke svým souborům, MAC definuje bezpečnostní politiky spravované administrátorem, které omezují akce programů a uživatelů na základě jasně definovaných pravidel.

SELinux pracuje ve třech režimech:

  • Enforcing – politiky jsou vynucovány, přístup je aktivně blokován při porušení pravidel.
  • Permissive – SELinux je aktivní, ale neblokuje přístup, pouze loguje porušení pravidel.
  • Disabled – SELinux je zcela vypnutý.

Stav SELinux zjistíte příkazem:

sestatus

Příklad výstupu:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      33
  • enabled – SELinux je aktivní.
  • enforcing – Politika je vynucována.
  • targeted – Používá se standardní cílená politika.

Zabbix balíček zabbix-selinux-policy

Balíček zabbix-selinux-policy obsahuje specifická pravidla SELinuxu potřebná pro hladký běh Zabbix serveru, proxy a agenta, aniž by bylo nutné SELinux vypínat. Balíček je dostupný v oficiálním Zabbix repozitáři.

Instalace balíčku:

dnf install zabbix-selinux-policy

Dočasné vypnutí SELinuxu

Pokud potřebujete SELinux rychle deaktivovat, použijte:

setenforce 0
  • 0 znamená přepnutí do režimu Permissive (vše povoleno, incidenty se pouze logují).
  • 1 znamená přepnutí zpět do režimu Enforcing (incidenty se blokují a logují).

Změna je platná jen do restartu systému. Ověřit aktuální režim:

getenforce

Permanentní vypnutí SELinuxu

Pro trvalé vypnutí SELinuxu upravte /etc/selinux/config:

nano /etc/selinux/config

Změňte:

SELINUX=enforcing

na

SELINUX=disabled

Restartujte systém:

reboot

Opětovné zapnutí SELinuxu a relabel

Pro opětovné aktivování SELinuxu je doporučeno nejprve nastavit režim permissive, ověřit správnost politik a teprve poté přejít do režimu enforcing. Nastavte tedy nejprve:

SELINUX=permissive

Poté nastavte relabel:

touch /.autorelabel
reboot

Soubor .autorelabel vytvořte přímo v /. Tento proces po restartu nastaví správné SELinux kontexty. Kontext souborů označuje metadata, která definují, jaká SELinux pravidla se na daný soubor vztahují. Pokud by relabel neproběhl, soubory (např. /etc/passwd) budou mít nesprávný nebo žádný kontext, což může vést k nemožnosti přihlášení.

Po ověření režimu permissive můžete přejít na enforcing. Nejprve změňte konfiguraci v souboru /etc/selinux/config:

SELINUX=enforcing

Tato změna se aplikuje po restartu systému. Pro okamžitou aplikaci změny bez restartu použijte příkaz:

setenforce 1

Vytváření vlastních politik SELinux

Pokud SELinux blokuje operaci aplikace zabbix_server, zjistíte to z logů auditd:

grep AVC /var/log/audit/audit.log | grep zabbix_server

Příklad záznamu:

type=AVC msg=audit(1743521737.355:209): avc: denied { name_bind } for pid=1620 comm="zabbix_server" src=10055 scontext=system_u:system_r:zabbix_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0

Tato chyba ukazuje, že SELinux brání Zabbix serveru použít port 10055. K vytvoření pravidla, které tuto akci povolí, nainstalujte nástroj audit2allow:

dnf install policycoreutils policycoreutils-python-utils -y

Vytvořte politiku pro Zabbix server

Spusťte příkaz:

grep zabbix_server /var/log/audit/audit.log | audit2allow -m zabbix_server_policy > zabbix_server_policy.te

Co dělají jednotlivé části:

  • grep zabbix_server /var/log/audit/audit.log: Vybere z audit logu pouze záznamy týkající se Zabbix serveru.
  • audit2allow -m zabbix_server_policy: Analyzuje výstup a vytvoří návrh politiky SELinuxu

Ukázka obsahu souboru zabbix_server_policy.te:

module zabbix_server_policy 1.0;

require {
	type krb5_keytab_t;
	type unreserved_port_t;
	type zabbix_t;
	class dir search;
	class tcp_socket name_bind;
}

#============= zabbix_t ==============
allow zabbix_t krb5_keytab_t:dir search;

#!!!! This avc can be allowed using the boolean 'nis_enable

Tento soubor obsahuje pravidla, která povolují Zabbix serveru:

  • Používat konkrétní porty (např. nerezervované porty),
  • Prohledávat adresáře se soubory Kerberos klíčů (krb5_keytab_t).

module zabbix_server_policy 1.0;
→ Název a verze modulu.

require { ... }
→ Modul potřebuje přístup k těmto věcem:

  • krb5_keytab_t → soubory s Kerberos klíči (např. /etc/krb5.keytab)
  • unreserved_port_t → běžné síťové porty
  • zabbix_t → proces Zabbix serveru
  • dir search → umožňuje procházet adresáře
  • tcp_socket name_bind → umožňuje bindnout se na TCP port

allow zabbix_t krb5_keytab_t:dir search;
→ Zabbix může procházet adresář s Kerberos klíčem.

#!!!! This avc can be allowed using the boolean 'nis_enable'
→ Komentář: něco podobného by šlo povolit pomocí booleanu 'nis_enable'.

Bezpečnostní poznámka:
Tento příklad zároveň ukazuje potenciální nevýhodu automatizovaného vytváření pravidel pomocí audit2allow.
Může dojít k tomu, že se spolu s potřebnými pravidly omylem povolí i přístupy, které nejsou žádoucí – například k souborům s Kerberos klíči.
Proto je důležité výstup ze audit2allow pečlivě zkontrolovat a upravit, než se politika zkompiluje a aplikuje.

Dále pravidlo zkompilujte a aplikujte:

checkmodule -M -m -o zabbix_server_policy.mod zabbix_server_policy.te
semodule_package -o zabbix_server_policy.pp -m zabbix_server_policy.mod
semodule -i zabbix_server_policy.pp
  • checkmodule -M -m: Zkompiluje .te soubor do .mod modulu.
  • semodule_package: Převede .mod soubor na .pp instalační balíček.
  • semodule -i: Instaluje vytvořený balíček politik do systému SELinux.

Ověření aplikace politiky:

semodule -l | grep zabbix_server_policy

Výstup by měl ukázat nainstalovanou politiku zabbix_server_policy, což potvrzuje její úspěšnou aplikaci do systému SELinux.

Pro vylistování SELinux politik například pro Zabbix použijte

semodule -l | grep zabbix

Tento příkaz zobrazí všechny aktuálně nainstalované SELinux moduly, které mají v názvu „zabbix“.

zabbix
zabbix_server_policy

Chcete-li si zobrazit, jaká pravidla obsahuje konkrétní SELinux modul (např. zabbix_server_policy), můžete použít následující postup:

mkdir -p /tmp/policyview && \
cd /tmp/policyview && \
semodule --extract zabbix_server_policy && \
strings zabbix_server_policy.pp

Doplnění existující SELinux politiky o nové pravidlo

Pokud potřebujete později doplnit existující politiku o další pravidlo, upravte existující .te soubor (např. přidejte další allow pravidlo) a opakujte celý postup kompilace a aplikace politiky:

checkmodule -M -m -o zabbix_server_policy.mod zabbix_server_policy.te
semodule_package -o zabbix_server_policy.pp -m zabbix_server_policy.mod
semodule -i zabbix_server_policy.pp

SELinux automaticky aktualizuje existující politiku novými pravidly, aniž by bylo nutné původní politiku odstraňovat.

grep zabbix_server /var/log/audit/audit.log | audit2allow -m zabbix_server_policy > zabbix_server_policy.te

Jak odstraním vlastní SELinux politiku?

Použijte příkaz semodule:

semodule -r zabbix_server_policy

Monitoring SELinux AVC denials pomocí Zabbixu

Abychom mohli SELinux monitorovat, musíme nejdříve získat oprávnění ke čtení příslušného log souboru. Bezpečnou cestou je přesměrovat jeho obsah do samostatného souboru, který bude vytvořen speciálně pro náš účel a dostupný pro Zabbix agenta – nikoliv změnou oprávnění na původních systémových souborech, čímž zachováme bezpečnostní standardy systému.

Zprávy AVC denial vypadají v logu takto:

type=AVC msg=audit(1744268323.007:2345954): avc: denied { search } for pid=2102180 comm="zabbix_server" name="krb5" ...

Tyto zprávy se zapisují do audit logu:
/var/log/audit/audit.log
Budeme monitorovat právě tyto zprávy.

Nejprve vytvořte skript, který bude průběžně sledovat audit.log a vybírat z něj pouze AVC zprávy:

nano /usr/local/bin/selinux-denial-logger.sh

Obsah skriptu:

#!/bin/bash

tail --follow=name /var/log/audit/audit.log | grep --line-buffered -E "avc:\s+denied" >> /var/log/selinux_denials.log

Poté nastavte spustitelná oprávnění skriptu:

chmod +x /usr/local/bin/selinux-denial-logger.sh

Automatické spouštění skriptu pomocí systemd

Aby byl vytvořený skript spouštěn automaticky po restartu systému a běžel kontinuálně, je nutné vytvořit odpovídající systemd službu.
Vytvořte novou systemd službu příkazem:

nano /etc/systemd/system/selinux-denial-logger.service

Obsah souboru systemd služby:

[Unit]
Description=SELinux AVC Denial Logger by initMAX s.r.o.
After=auditd.service

[Service]
Type=simple
ExecStart=/usr/local/bin/selinux-denial-logger.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Aktivujte a spusťte nově vytvořenou službu:

systemctl daemon-reload 
systemctl enable selinux-denial-logger.service --now

Zkontrolujte, zda služba běží bez problémů:

systemctl status selinux-denial-logger.service

Nastavení rotace logů pomocí log rotate

Aby bylo zajištěno, že logovací soubor nenaroste příliš, je vhodné použít nástroj logrotate k jeho pravidelné rotaci.
Vytvořte konfiguraci rotace logu pomocí příkazu:

nano /etc/logrotate.d/selinux_denials

Obsah konfigurace logrotate:

/var/log/selinux_denials.log {
    weekly
    rotate 4
    missingok
    notifempty
    compress
    delaycompress
    create 0644 root root
    sharedscripts
    postrotate
        systemctl restart selinux-denial-logger.service > /dev/null 2>&1 || true
    endscript
}

Tato konfigurace zajistí týdenní rotaci logů, zachová 4 týdny historie, logy budou komprimovány a po každé rotaci bude služba restartována, aby pokračoval zápis do správného logu.

Import šablony a požadavky

Pro monitoring SELinux pomocí Zabbixu jsme připravili vlastní šablonu SELinux, kterou lze snadno importovat do vašeho Zabbix serveru.

Požadavky

  • Zabbix verze: 7.0 a vyšší
  • Zabbix agent: doporučeno používat Zabbix agent 2 (nutné pro systemd.unit.info a jednodušší integraci)
  • Zabbix agent: Pro použití klíčů log* je nutné, aby agent běžel v aktivním režimu (active checks).
  • Systém s SELinuxem: např. RHEL, AlmaLinux, CentOS Stream, Fedora apod.
  • Agent: musí mít přístup k následujícím souborům (mívá povoleno ve výchozím nastavení):
    • /sys/fs/selinux/enforce
    • /etc/selinux/config
    • /var/log/selinux_denials.log – soubor generovaný externím skriptem (viz výše)

Šablonu lze stáhnout z našeho repozitáře zde: https://git.initmax.cz/initMAX-Public/zabbix-templates/-/tree/production/free/SELinux_by_Zabbix_Agent_2

Import šablony

V Zabbix frontend přejděte do části Data collection → Templates.

Klikněte na Import.

Vyberte soubor template_SELinux_by_Zabbix_Agent_2.yaml z našeho repozitáře a potvrďte import.

Po importu připojte šablonu k hostu s povolenou aktivní komunikací – ta je nezbytná pro zpracování logů pomocí log[*].

Správnost nastavení si můžete zkontrolovat přes Monitoring > Latest data u daného hosta.

Pokud dojde k detekci blokace, Zabbix vytvoří problémovou událost. Ta se automaticky uzavře, pokud po dobu 30 minut nedojde k žádné další blokaci.

Tento časový interval lze upravit pomocí uživatelského makra {$TRIGGER.CLOSE.TIME}, a to buď přímo v šabloně, nebo individuálně na úrovni konkrétního hosta.

Každý záznam problému obsahuje v názvu informace o PIDu, názvu procesu (Comm) a typu objektu (Class), který byl blokován. Díky tomu lze problém snadno identifikovat už na první pohled.

Zároveň jsou k události přiřazeny tagy jako commclasspid a source, které umožňují efektivní filtrování událostí, směrování notifikací a zobrazení v přehledných dashboardech.

Na obrázku níže je vidět, jak se SELinux události zobrazují v sekci „Monitoring → Problems“.

Doporučení: SELinux je důležitou součástí zabezpečení systému a obecně není doporučeno jej vypínat. Balíček zabbix-selinux-policy řeší většinu běžných problémů se Zabbixem, ale nestandardní operace (např. specifické porty nebo přístup k nestandardním souborům) musí administrátor řešit vlastními politikami, jak je popsáno výše. Doporučujeme investovat čas do pochopení fungování SELinuxu, abyste mohli bezpečnostní politiky efektivně spravovat.

×Košík

Your cart is empty.