auditd能精确捕获execve系统调用(如谁在何时执行何程序),但默认不记录完整命令行字符串;需配置arch=b64/b32规则、启用enriched日志格式并结合auid归因,才能还原用户实际执行的命令,且无法记录shell内建命令或多行交互内容。

Auditd 本身不记录用户在终端里“敲了什么”,它只审计内核级事件,比如 execve() 系统调用——也就是“谁在什么时候执行了哪个程序”,但默认不保存原始命令行字符串(如 cp -r /tmp/a /home/user/)。要接近“记录终端输入内容”的目标,必须组合配置、理解限制,并做合理取舍。
✅ 明确目标:记录“用户实际执行的命令”而非“按键流”
Auditd 能做到的是:
- 精确捕获每个
execve调用(含可执行路径、参数个数、部分参数内容) - 关联真实 UID、AUID(登录时固定审计 ID)、TTY、会话 ID、时间戳
- 不受
HISTFILE、unset、sudo -i、ssh user@host 'cmd'等绕过影响
但它做不到:
- 记录未触发 execve 的 shell 内建命令(如
cd、export、alias) - 还原多行编辑、历史展开(
!!)、管道组合(ls | grep x是两个 execve) - 捕获被
exec替换掉的进程后续输入(如exec python后的所有交互)
所以,“记录终端会话输入内容”的务实做法是:启用 execve 参数记录 + 用 auid 区分真实登录者 + 配合 bash history/syslog 做补充还原。
? 启用 execve 参数记录(关键步骤)
要让 auditd 日志中出现 argv[0], argv[1] 等字段,需同时满足:
内核启动参数含
audit=1
检查:cat /proc/cmdline | grep audit=1
若无,需在 GRUB 配置(如/etc/default/grub)中添加audit=1,再sudo update-grub && sudo reboot-
审计规则明确指定
-S execve并带-k标签
在/etc/audit/rules.d/cmd.rules中写入:-a always,exit -F arch=b64 -S execve -k cmd_exec -a always,exit -F arch=b32 -S execve -k cmd_exec
注意:不要加
-F uid!=0类过滤,改用auid查询更可靠;文件名必须以.rules结尾。 -
确保 auditd 配置支持参数日志
检查/etc/audit/auditd.conf中:log_format = ENRICHED # RHEL 8+/CentOS 8+/Ubuntu 20.04+ 默认开启
旧系统若为
RAW,改为ENRICHED并重启服务。 -
验证是否生效
执行一条命令(如date "+%F"),然后运行:sudo ausearch -m execve -i | grep -A5 "comm="
若输出含
argc=2、argv[0]=date、argv[1]=+%F,说明参数已记录;否则检查audit_backlog_limit(建议 ≥ 8192)和内核模块加载状态。
? 使用 auid 准确归因到登录会话
普通 uid 在 su 或 sshd 子进程中可能不可靠,而 auid(Audit UID)从用户首次登录起就固定不变:
宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。
-
查某用户所有命令(例如
john):sudo ausearch -m execve -ui $(id -u john) --raw | aureport -f -i
-
查某次登录会话(如 session ID 为
12345):sudo ausearch -m execve --session 12345 --raw | aureport -f -i
-
查 auid 对应的用户名(需
/etc/passwd可读):sudo ausearch -m execve -auid 1001 --raw | aureport -f -i
提示:
last -i或loginctl list-sessions可帮你找到活跃 session ID;ausearch -m USER_LOGIN可查登录事件本身。
?️ 补充加固与替代方案(提升完整性)
单纯依赖 auditd 仍有盲区(如内建命令、高并发丢参)。生产环境推荐组合策略:
-
强制记录 shell 历史到 syslog(稳定还原输入)
在/etc/bash.bashrc或/etc/skel/.bashrc中添加:export HISTTIMEFORMAT="%Y-%m-%d %T " export PROMPT_COMMAND='history -a; logger -p local6.info -t "bash[$$]" "$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")"'
再配置 rsyslog 将
local6.*转发至远程日志服务器。 -
锁定审计日志防篡改
sudo chattr +a /var/log/audit/audit.log
-
转发日志至 SIEM
编辑/etc/rsyslog.d/audit.conf:$IncludeConfig /etc/rsyslog.d/*.conf :programname, isequal, "auditd" /var/log/audit/remote.log *.* @your-siem-server:514
-
避免全局监控引发性能问题
如非必要,不启用全量execve;可按需聚焦高危路径:-w /bin/rm -p x -k dangerous -w /usr/bin/python3 -p x -k script_exec
不复杂但容易忽略










