Linux命令审计需通过rsyslog或auditd实时转发,而非依赖history缓存;rsyslog方案用DEBUG trap捕获命令并经local6日志转发;auditd方案覆盖更全,适用于等保三级等高合规场景。

Linux账户的历史命令记录本身是本地shell缓存,不能直接“同步”到第三方审计系统——必须通过中间机制将命令事件主动转发出去。真正可行的方式不是让history自己推送,而是捕获命令执行动作,并实时发往日志服务(如rsyslog、syslog-ng),再由该服务转发至远程审计平台(如ELK、Splunk、Graylog或自建SIEM)。
用rsyslog实现命令实时转发(推荐)
这是最成熟、无需编译、兼容性强的方案,所有主流发行版原生支持:
- 在
/etc/profile或/etc/profile.d/bash-audit.sh中添加函数:
function log_command {
local cmd=$(fc -ln -0 2>/dev/null | sed 's/^[[:space:]]*//')
[ -n "$cmd" ] && logger -p local6.notice -t "cmd" "user=$USER, tty=$TTY, ip=${SSH_CLIENT%% *}, cmd=$cmd"
}
trap log_command DEBUG
- 配置rsyslog接收并转发:
→ 编辑/etc/rsyslog.d/10-cmd-audit.conf:
local6.* @audit-server.example.com:514 # UDP
# 或用TCP更可靠:
# local6.* @@audit-server.example.com:514
- 重启服务:
sudo systemctl restart rsyslog
用auditd对接集中审计(高可靠性要求)
适用于等保三级、金融、政务等强合规场景,能捕获su、sudo、脚本内命令、非交互式调用等history完全无法覆盖的操作:
- 安装并启用auditd:
sudo apt install auditd(Debian/Ubuntu)或sudo yum install audit(RHEL/CentOS) - 添加持久化规则(写入
/etc/audit/rules.d/execve.rules):
-a always,exit -F arch=b64 -S execve -k cmd_audit
-a always,exit -F arch=b32 -S execve -k cmd_audit
- 确保auditd日志被rsyslog采集(编辑
/etc/rsyslog.d/audit.conf):input(type="imfile" File="/var/log/audit/audit.log" Tag="audit")<br>*.* @audit-server.example.com:514
注意事项与避坑点
避免常见失效情况:
- 不要依赖
HISTFILE文件轮询上传——它不实时、可被删改、多终端会覆盖 - 不要只改
/etc/profile就认为所有用户生效——su -或sudo -i启动的shell可能绕过;应配合/etc/profile.d/或PAM模块(如pam_exec)增强覆盖 - 远程审计服务器需配置接收端口(如514 UDP/TCP),防火墙要放行
- 敏感字段(如密码、token)会在日志中明文出现,建议在rsyslog或接收端做字段脱敏(如用rsyslog的
mmnormalize或Logstash filter)
验证是否生效
执行一条测试命令后检查:
- 本地是否生成日志:
logger -p local6.notice "test from $(whoami)" && tail -n1 /var/log/syslog - 远程服务器是否收到:
sudo tcpdump -i any port 514 -A -c 5 2>/dev/null | grep test - auditd是否捕获:
sudo ausearch -m execve -ts recent -i | grep "$(whoami)"


















