如何配置auditd 以打印ppid 名称,而不仅仅是ppid?

如何配置auditd 以打印ppid 名称,而不仅仅是ppid?

操作系统是Debian。我已经设置了auditd来尝试确定是什么正在重新启动系统。

我有以下规则:

-a exit,always -F arch=b64 -S execve -F path=/bin/systemctl -k debug_test

创建规则/usr/sbin/reboot不起作用,因为它是 的符号链接/bin/systemctl,但此规则运行良好,它会捕获每次执行重新启动命令的时间。然后我可以使用命令搜索这些重新启动:ausearch -k debug_test | grep reboot。 (请注意,规则键不包含字符串“rebo​​ot”,因为这是我需要 grep 的内容)

但是,这只是打印负责的进程的 ppid,我正在寻找 ppid 的进程名称。是否可以配置auditd来记录这个?或者我是否必须编写某种守护进程来每 15 秒左右记录所有 pid + 进程名称?

答案1

我一直在回顾审核文件一些。

Auditd不使用诸如 之类的占位符%{process.value}。基于值列表:

uid,  auid,  gid, pid, subj_user, subj_role, subj_type, subj_sen, subj_clr, msgtype,  and  executable  name.

我认为直接在规则键中记录父进程名称是不可能的。我认为使用“可执行名称”是systemctl&遇到的问题reboot

“您可以通过审计日志中打印的父进程ID(ppid)找到父进程名称。”(这基本上是我的第一个答案,terdon;-))

我发现您可以使用ausearch原始ppid的 来查找创建此流程的事件。它将被记录在execve系统调用中。这意味着PID' 不久就消失了!

在与 PPID 相同的日志行中,查找type=EXECVE“make”命令所使用的参数列表(a0、a1...):

type=EXECVE msg=audit(1622816736.650:123456): argc=3 a0="sh" a1="-c" a2="reboot"

这表明父进程是一个 shell ( sh),使用参数-c运行命令 ( reboot)。现在,ausearch我的第一个建议是可以举办婚礼。

#!/bin/bash

# Assuming ausearch command outputs lines with the format id=VAL
for ppid_line in $(your_actual_ausearch_command_here); do
    ppid_to_match=$(echo "$ppid_line" | grep -Eo 'id=[0-9]{1,}')

    # Extract the process information and commands
    process_info=$(sudo cat /var/log/audit/audit.log | grep -i "$ppid_to_match" | grep -Ei 'a0=.*')

    echo "$ppid_to_match is: $process_info"
done

exit 0

您的ausearch命令以 id=VAL、isolate 的形式检索 PPID id=,然后提取以 开头的相应信息a0=,这些信息导致实际命令。

相关内容