操作系统是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
。 (请注意,规则键不包含字符串“reboot”,因为这是我需要 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=
,这些信息导致实际命令。