You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Linux系统中记录所有来源的特定危险命令执行行为

如何在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. 添加危险命令审计规则

我们需要给每个危险命令添加审计规则,比如你提到的rmkillsystemctl stop,还可以扩展到其他高危命令(比如shutdownddchmod等)。

方法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能读写,普通用户根本没法删除或修改。

二、额外的加固建议

  1. 监控root操作:如果需要监控root用户的危险命令,去掉规则里的-F auid>=1000参数即可。但要注意root可以停止auditd服务,要是想完全防止root篡改,可把auditd配置成不可停止(比如systemctl mask auditd,操作前要谨慎测试),或者把审计日志转发到远程日志服务器。
  2. 扩展高危命令列表:除了你提到的三个,还可以添加这些命令:dd(磁盘写入操作)、chmod/chown(修改文件权限)、rmdir(删除目录)、mv(移动/重命名关键文件)等。
  3. 日志轮转:auditd默认会自动轮转日志,避免文件过大,你可以在/etc/audit/auditd.conf里调整轮转策略。

备注:内容来源于stack exchange,提问作者George Y

火山引擎 最新活动