在Ubuntu系统中,想要监控特权命令的执行,最直接有效的方案就是部署auditd审计框架。auditd是Linux内核自带的审计子系统,它能记录所有特权用户(root或具有sudo权限的用户)执行的每一条命令、每一次文件访问、每一个系统调用。具体做法是:先安装auditd服务,然后编写规则文件监控/usr/bin/sudo、/usr/bin/su、/usr/bin/passwd等高风险二进制文件的执行,最后通过ausearch和aureport工具查看审计日志。这套方案不需要额外付费工具,内核级记录几乎无法被绕过,是企业级Linux安全合规的基础设施。
为什么必须监控特权命令执行
Ubuntu作为全球使用最广泛的Linux发行版之一,在服务器、云计算、容器编排等场景中大量部署。一旦攻击者获取了普通用户权限,下一步必然是提权——执行sudo提权、su切换用户、修改passwd文件、执行rm -rf等破坏性命令。如果你没有任何监控手段,这些操作在系统日志里可能只留下一行不起眼的记录,甚至被攻击者清除。auditd的价值在于:它在系统调用层面就记录了行为,攻击者即使清空了/var/log下的日志文件,audit日志依然独立存储,且支持防篡改标记。对于等保2.0、PCI-DSS、ISO 27001等安全合规要求,auditd监控是硬性指标。
Ubuntu上安装和启动auditd服务
Ubuntu 18.04及以后版本默认已经预装了auditd,如果没有,执行以下命令安装:
sudo apt update sudo apt install auditd audispd-plugins
安装完成后,启动服务并设置开机自启:
sudo systemctl enable auditd sudo systemctl start auditd sudo systemctl status auditd
确认状态显示active (running)即可。auditd的主配置文件位于/etc/audit/auditd.conf,日志文件默认存储在/var/log/audit/audit.log。注意,audit.log的权限默认是600,只有root可读,这本身就是一层保护。
编写audit规则监控特权命令
auditd的规则文件放在/etc/audit/rules.d/目录下,建议创建一个独立文件,比如/etc/audit/rules.d/privileged_cmds.rules。规则的基本语法是:
-w /path/to/binary -p x -k privilege_exec
其中-w指定监控的文件路径,-p x表示监控执行(execute)权限,-k是给这条规则打的标签(key),方便后续检索。下面是一套完整的特权命令监控规则:
# 监控sudo命令执行 -w /usr/bin/sudo -p x -k sudo_exec -w /usr/bin/sudoedit -p x -k sudo_exec # 监控su和su命令 -w /usr/bin/su -p x -k su_exec # 监控passwd修改密码 -w /usr/bin/passwd -p x -k passwd_exec # 监控useradd/userdel用户管理 -w /usr/sbin/useradd -p x -k usermod_exec -w /usr/sbin/userdel -p x -k usermod_exec -w /usr/sbin/usermod -p x -k usermod_exec # 监控chmod/chown权限变更 -w /usr/bin/chmod -p x -k perm_change -w /usr/bin/chown -p x -k perm_change # 监控rm删除操作 -w /usr/bin/rm -p x -k file_delete # 监控/etc/passwd和/etc/shadow文件访问 -w /etc/passwd -p rwa -k passwd_file -w /etc/shadow -p rwa -k shadow_file -w /etc/group -p rwa -k group_file # 监控crontab定时任务修改 -w /usr/bin/crontab -p x -k cron_mod # 监控iptables/ufw防火墙规则变更 -w /usr/sbin/iptables -p x -k firewall_change -w /usr/sbin/ufw -p x -k firewall_change # 监控所有特权用户(uid<1000)的命令执行 -a always,exit -F arch=b64 -S execve -F uid<1000 -F euid=0 -k privileged_action
最后一条规则是核心:它监控所有UID小于1000(即系统用户和普通用户)执行的、最终以root身份运行的命令。这条规则覆盖面最广,能捕获sudo提权后的所有行为。写完规则后,需要重新加载:
sudo augenrules --load
或者直接重启auditd服务:
sudo systemctl restart auditd
如何查看和分析audit日志
auditd提供了两个核心命令行工具:ausearch用于按条件搜索,aureport用于生成统计报告。
查看最近所有特权命令执行记录:
sudo ausearch -k privilege_exec -ts recent
查看某个特定用户(比如uid=1001)执行的所有特权操作:
sudo ausearch -f 1001 -ts today
查看今天所有文件删除操作:
sudo ausearch -k file_delete -ts today
生成今日审计报告摘要:
sudo aureport --auth --summary sudo aureport --exec --summary sudo aureport --file --summary
如果你想实时监控,可以用ausearch配合watch命令:
watch -n 5 'sudo ausearch -k sudo_exec -ts recent 2>/dev/null | tail -20'
auditd日志防篡改和长期存储
auditd有一个关键特性:它支持设置日志文件的最大大小和保留策略。编辑/etc/audit/auditd.conf,设置:
max_log_file = 100 max_log_file_action = ROTATE num_logs = 10
这意味着单个日志文件最大100MB,满了自动轮转,保留10个文件。更重要的是,auditd支持将日志远程发送到集中式日志服务器。在/etc/audit/audisp-remote.conf中配置:
remote_server = 192.168.1.100 port = 60 local_port = 61 transport = tcp mode = immediate
这样即使攻击者入侵了Ubuntu主机并试图删除本地日志,远程服务器上依然有完整记录。对于企业环境,建议搭配rsyslog或ELK Stack做集中存储和告警。
进阶技巧:用auditd监控异常行为模式
除了监控特定命令,还可以用auditd设置更智能的规则。比如监控非工作时间的root登录:
-a always,exit -F arch=b64 -S open -F dir=/var/log -F uid=0 -F time>18:00 -F time<08:00 -k after_hours_access
监控短时间内大量文件访问(可能是数据窃取):
-a always,exit -F arch=b64 -S open -F exit=-EACCES -F uid>=1000 -k mass_access
还可以配合audispd插件,当触发特定规则时自动执行脚本告警。在/etc/audit/plugins.d/目录下创建自定义插件:
active = yes direction = out path = /usr/local/bin/audit_alert.sh type = always args = 2 format = string
然后编写/usr/local/bin/audit_alert.sh脚本,当检测到sudo_exec事件时发送邮件或企业微信通知。
常见问题和排错指南
实际部署中经常遇到几个问题。第一,规则不生效:检查是否执行了augenrules --load,以及规则文件权限是否为640、属主为root。第二,日志太大占满磁盘:及时配置远程发送和轮转策略。第三,性能影响:auditd对系统性能影响通常在1%-3%以内,但如果规则过多(超过几百条),建议精简规则,只监控真正高风险的命令。第四,查看日志时出现乱码:使用ausearch -i参数以人类可读格式输出。
总结:auditd是Ubuntu安全监控的基石
在Ubuntu系统安全体系中,auditd不是可选项,而是必选项。它提供内核级的、几乎不可绕过的命令执行审计能力。从安装配置、规则编写、日志分析到远程存储和告警联动,这套体系可以覆盖从基础合规到高级威胁检测的全部需求。建议所有Ubuntu生产环境服务器都部署auditd,并定期通过aureport审查审计报告,及时发现异常行为。安全不是一次性工作,而是持续运营的过程,auditd就是你最可靠的眼睛。
