auditd仅捕获execve系统调用事件,不记录用户输入命令;需配置参数采集、规则过滤和上下文关联三步实现异常进程指令识别。

一、先让 auditd 能看到完整命令行
默认规则(如 -a always,exit -F arch=b64 -S execve)只记调用动作,不带参数。要还原真实指令(如 /bin/bash -c 'rm -rf /'),必须满足:
- 内核启动参数含
audit=1(检查cat /proc/cmdline) -
/etc/audit/auditd.conf中设置log_format = ENRICHED(RHEL 8+/CentOS 8+ 默认开启;旧系统需手动改) -
/proc/sys/kernel/audit_backlog_limit ≥ 8192,避免高并发时丢参数 - 规则中显式指定架构,并启用 key 标记:
-a always,exit -F arch=b64 -S execve -k execv_args-a always,exit -F arch=b32 -S execve -k execv_args
验证是否生效:ausearch -m execve -i | grep "argv\[0\]",若输出含类似 argv[0]=bash argv[1]=-c,说明参数已记录。
二、聚焦“异常”——用规则过滤高风险 execve 行为
全量记录所有 execve 会爆炸式增长日志,也不利于分析。应基于行为特征设过滤条件:
-
非标准路径执行:监控
/tmp、/dev/shm、/var/tmp下的 execve-a always,exit -F arch=b64 -S execve -F dir=/tmp -k tmp_exec -
特权用户执行非白名单程序:比如 root 执行 python、curl、wget、nc、sh、bash(非登录 shell)
-a always,exit -F arch=b64 -S execve -F uid=0 -F path=/usr/bin/python -k root_python-a always,exit -F arch=b64 -S execve -F uid=0 -F path=/bin/sh -k root_sh -
非交互式 shell 启动:通过
-c或-o pipefail等标志判断脚本执行-a always,exit -F arch=b64 -S execve -F auid!=4294967295 -F key=execv_args | grep -E "(argv\[[0-9]+\]=(sh|bash|dash).*-c|argv\[.*-o.*pipefail)"(该部分需在 ausearch 后处理) -
可疑子进程链:父进程是 sshd、sudo、cron,但子进程执行非常规工具
可用-F ppid=配合ausearch -m execve --start recent -i人工回溯,或写脚本关联ppid和pid
三、补足上下文,降低误报率
单看 execve 很难断定是否异常。需叠加其他审计字段交叉验证:
- 搭配登录会话信息:
ausearch -m USER_LOGIN -i查出 auid 对应的真实用户名和登录终端 - 查命令来源路径是否被篡改:
ausearch -m SYSCALL -f /usr/bin/curl -i看是否有 write 属性变更 - 检查执行者是否属于预期组:
-F gid!=100(排除 wheel 组)或-F auid<1000(排除服务账户) - 对容器环境,优先用
auid而非uid,因 auid 在登录时固定,不受 su / sudo 切换影响
例如一条真正可疑的记录应同时满足:
– auid ≥ 1000(普通用户登录)
– uid = 0(提权执行)
– exe = /usr/bin/sudo
– argv[0] = sudo,argv[1] = /tmp/malware.sh
这种组合比单纯匹配 “execve + /tmp” 更可靠。
四、生产建议:别只靠 auditd
auditd 是内核级证据源,但有局限:参数可能丢失、规则易漏、分析门槛高。更务实的做法是分层记录:
- auditd 层:专注捕获 execve + 参数 + auid + ppid,用于事后溯源和合规留痕
-
shell history + syslog 层:在
/etc/bash.bashrc或用户 profile 中加入:export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$] $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//") [$RETRN_VAL]"'
这能还原真实输入命令,且不依赖内核配置 - EDR/主机IDS 层:用 osquery、Wazuh 或自研 agent 实时比对进程路径哈希、签名、行为模式,主动告警


















