K SYSCALL dojde vždy, když uživatel provede příkaz, který požaduje, aby jádro Linuxu poskytlo službu. Existuje několik SYSCALL jako mount, umount, kill, open atd. Tyto SYSCALL mohou být monitorovány auditovaným systémem. Vezměme si jako příklad „zabít“ SYSCALL.
Uživatel chce zachytit, kdo zabil určitý proces v systému. Toho lze snadno dosáhnout napsáním auditovaného pravidla, které dokáže zachytit zabití SYSCALL kdykoli je zavoláno.
Instalace a konfigurace auditovaného
auditd je většinou předinstalovaný v distribucích Linuxu. V případě, že není k dispozici, můžete jej nainstalovat pomocí příslušného správce balíčků OS. Například v případě CentOS/RHEL:
# yum install auditd
Povolte auditované službě spuštění při startu a spusťte ji pomocí příkazu „service“.
# systemctl enable auditd # service start auditd
Konfigurace auditovaného pravidla pro monitorování SYSCALL
Vytvořme pravidlo pro sledování „zabíjení“ SYSCALL, které lze použít k nalezení všech zabíjejících procesů.
1. Přidejte níže uvedené pravidlo do konfiguračního souboru auditovaných pravidel /etc/audit/rules.d/audit.rules :
# vi /etc/audit/rules.d/audit.rules -a exit,always -F arch=b64 -S kill -k kill_ruleNa CentOS/RHEL 6 je konfigurační soubor /etc/audit/audit.rules místo /etc/audit/rules.d/audit.rules.
Tady,
-výstup,vždy – Tady máme akci a seznam. Kdykoli OS ukončí systémové volání, seznam ukončení bude použit k určení, zda je třeba vygenerovat událost auditu.
-F arch=b64 – Volba -F se používá k vytvoření pole pravidla. B64 znamená, že počítač běží s procesorem x86_64. (Nezáleží na tom, zda je to Intel nebo AMD.)
-S kill – Volba -S určuje systémové volání, které chceme monitorovat.
-k – Toto je název pravidla definovaný uživatelem.
2. Restartujte auditovanou službu, aby bylo nové pravidlo účinné.
# service restart auditd
3. Můžete ověřit, zda jsou definovaná pravidla aktivní, pomocí příkazu „auditctl -l“.
# auditctl -l -a always,exit -F arch=b64 -S kill -F key=kill_rule
Ověřit
Podívejme se na příklad, zda pravidlo, které jsme právě vytvořili, skutečně funguje nebo ne. Jednoduše spustíme proces „spánku 500“ a zabijeme ho. To by mělo vygenerovat protokol auditu se všemi podrobnostmi, jako je kdo zabil proces (uid) jakým programem/příkazem atd.
1. Vytvořte jednoduchý proces spánku na pozadí.
# sleep 600 &
2. Zkontrolujte ID procesu spánku a ukončete jej.
# ps -ef | grep sleep root 2089 1784 0 15:12 pts/0 00:00:00 sleep 600
# kill -9 2089
3. Zkontrolujte soubor protokolu auditu /var/log/audit/audit.log pro protokoly auditu ukončení. Protokol by měl vypadat podobně jako níže.
# tail -f /var/log/audit/audit.log type=SYSCALL msg=audit(1529507591.700:304): arch=c000003e syscall=62 success=yes exit=0 a0=829 a1=9 a2=0 a3=829 items=0 ppid=1783 pid=1784 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="kill_rule" type=OBJ_PID msg=audit(1529507591.700:304): opid=2089 oauid=1001 ouid=0 oses=1 obj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ocomm="sleep" type=PROCTITLE msg=audit(1529507591.700:304): proctitle="-bash"
4. Někdy může být obtížné vyhledat protokoly auditu, které nás zajímají. V takovém případě můžete také použít příkaz „ausearch“ s klíčem definovaným v pravidle. Například:
# ausearch -k kill_rule ... time->Wed Jun 20 15:13:11 2018 type=PROCTITLE msg=audit(1529507591.700:304): proctitle="-bash" type=OBJ_PID msg=audit(1529507591.700:304): opid=2089 oauid=1001 ouid=0 oses=1 obj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 ocomm="sleep" type=SYSCALL msg=audit(1529507591.700:304): arch=c000003e syscall=62 success=yes exit=0 a0=829 a1=9 a2=0 a3=829 items=0 ppid=1783 pid=1784 auid=1001 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="bash" exe="/usr/bin/bash" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="kill_rule"