如何在Linux系统中记录所有来源的特定危险命令执行行为
嘿,这个需求抓得很准——毕竟恶意操作太容易通过脚本包装起来躲避开shell历史记录了。要搞定这个,核心思路是从系统调用层面追踪命令执行,而不是只盯着终端输入。下面给你推荐最靠谱的方案,用Linux原生的审计系统auditd:
一、使用auditd实现全链路危险命令审计
auditd是Linux内核自带的审计框架,能追踪所有进程的系统调用——不管你是直接在bash敲命令,还是通过Python/Perl脚本间接调用,只要最终执行了目标命令,它都能抓得到。而且日志默认只有root能访问,完美符合你的要求。
1. 安装并启动auditd
如果你的系统还没装auditd,先补装一下:
- Debian/Ubuntu系:
sudo apt update && sudo apt install auditd - RHEL/CentOS系:
sudo yum install auditd
安装完成后把服务设为开机自启并启动:sudo systemctl enable --now auditd
2. 添加危险命令审计规则
我们需要给每个危险命令添加审计规则,比如你提到的rm、kill、systemctl stop,还可以扩展到其他高危命令(比如shutdown、dd、chmod等)。
方法1:按进程名追踪(覆盖软链接/别名场景)
如果担心用户用软链接或者自定义别名调用命令(比如/usr/bin/rm或者自己改的快捷命令),用进程名匹配更全面:
# 追踪rm命令 sudo auditctl -a always,exit -F comm=rm -F perm=x -F auid>=1000 -k dangerous_commands # 追踪kill命令 sudo auditctl -a always,exit -F comm=kill -F perm=x -F auid>=1000 -k dangerous_commands # 追踪systemctl命令 sudo auditctl -a always,exit -F comm=systemctl -F perm=x -F auid>=1000 -k dangerous_commands # 可选:添加其他高危命令,比如shutdown sudo auditctl -a always,exit -F comm=shutdown -F perm=x -F auid>=1000 -k dangerous_commands
参数说明:
-a always,exit:无论命令执行成功还是失败,都记录退出事件-F comm=rm:指定要追踪的进程名(比如执行rm时的进程名就是rm)-F perm=x:只追踪执行(execute)权限的调用-F auid>=1000:只追踪普通用户(UID≥1000)的操作,要监控root的话可以去掉这条-k dangerous_commands:给这条规则打个标记,方便后续快速查询日志
方法2:按命令路径追踪(精准匹配)
如果只需要追踪特定路径下的命令,比如系统默认的/bin/rm,可以用路径匹配:
sudo auditctl -a always,exit -F path=/bin/rm -F perm=x -F auid>=1000 -k dangerous_commands
3. 永久保存规则
上面的临时规则重启auditd后会消失,所以要把规则写到配置文件里:
创建规则文件:sudo nano /etc/audit/rules.d/dangerous-cmds.rules
把刚才的规则复制进去(去掉sudo auditctl前缀),比如:
-a always,exit -F comm=rm -F perm=x -F auid>=1000 -k dangerous_commands -a always,exit -F comm=kill -F perm=x -F auid>=1000 -k dangerous_commands -a always,exit -F comm=systemctl -F perm=x -F auid>=1000 -k dangerous_commands -a always,exit -F comm=shutdown -F perm=x -F auid>=1000 -k dangerous_commands
保存后重启auditd让规则生效:sudo systemctl restart auditd
4. 查询审计日志
用ausearch工具可以快速筛选标记过的日志:sudo ausearch -k dangerous_commands
你会看到每条记录包含:执行命令的用户ID、进程ID、父进程ID(比如如果是Python脚本调用的,父进程就是python3)、命令参数等详细信息,完全能追溯到操作来源。
原始日志文件存在/var/log/audit/audit.log,这个文件默认权限是600,只有root能读写,普通用户根本没法删除或修改。
二、额外的加固建议
- 监控root操作:如果需要监控root用户的危险命令,去掉规则里的
-F auid>=1000参数即可。但要注意root可以停止auditd服务,要是想完全防止root篡改,可把auditd配置成不可停止(比如systemctl mask auditd,操作前要谨慎测试),或者把审计日志转发到远程日志服务器。 - 扩展高危命令列表:除了你提到的三个,还可以添加这些命令:
dd(磁盘写入操作)、chmod/chown(修改文件权限)、rmdir(删除目录)、mv(移动/重命名关键文件)等。 - 日志轮转:auditd默认会自动轮转日志,避免文件过大,你可以在
/etc/audit/auditd.conf里调整轮转策略。
备注:内容来源于stack exchange,提问作者George Y




