在Ubuntu服务器安全加固中,禁用root远程登录是第一道防线,而将sudo操作与审计日志联动则是第二道防线。具体做法是:修改SSH配置文件禁止root通过SSH登录,同时配置rsyslog或auditd系统,将所有sudo提权操作实时记录到独立日志文件中,再通过logwatch、aide或自定义脚本实现异常行为告警。这两步联动起来,既堵住了暴力破解root的通道,又让任何提权行为都有迹可循,形成完整的安全闭环。
很多运维人员只做到了禁用root登录就觉得安全了,实际上攻击者一旦通过普通用户登录后提权到root,如果没有审计日志,你根本不知道服务器已经被入侵。所以这篇文章会把禁用root远程登录的具体操作、sudo审计日志的完整配置、以及两者如何联动告警,全部讲透。
一、为什么必须禁用root远程登录Ubuntu默认安装后,root账户是存在的,但默认情况下root没有设置密码,也不允许直接SSH登录。不过很多人在部署时会手动给root设密码并开启远程登录,这是非常危险的操作。原因很简单:root是所有Linux系统的超级管理员,一旦密码被暴力破解,攻击者直接获得最高权限,可以做任何事情——删库、植入后门、篡改配置,而且很难被发现。
从实际攻击数据来看,针对Linux服务器的暴力破解攻击中,超过80%的尝试都是针对root账户的。禁用root远程登录后,攻击者必须先猜对一个普通用户名,再猜对密码,再想办法提权,攻击成本和难度成倍增加。这不是可选的安全措施,而是基线要求。
二、禁用root远程登录的具体步骤操作非常简单,只需要修改SSH守护进程的配置文件。打开终端,执行以下命令编辑配置:
sudo nano /etc/ssh/sshd_config
在文件中找到PermitRootLogin这一行,将其修改为:
PermitRootLogin no
如果这一行被注释掉了(前面有#号),就去掉注释符并改成no。保存退出后,重启SSH服务使配置生效:
sudo systemctl restart sshd
这里有一个容易忽略的细节:如果你的服务器使用密钥认证而不是密码认证,PermitRootLogin的设置同样生效。也就是说,即使你配置了root的SSH密钥登录,设置为no之后也会被拒绝。另外建议同时检查是否允许空密码登录,找到PermitEmptyPasswords也设为no:
PermitEmptyPasswords no
修改完成后,建议新开一个终端窗口测试SSH连接,确认普通用户可以正常登录,而root登录被拒绝。千万不要在当前会话中直接测试root登录,否则一旦配置出错你会把自己锁在外面。
三、配置sudo审计日志——让每次提权都被记录禁用root登录只是第一步。攻击者如果拿到了一个普通用户的权限,下一步就是通过sudo提权。Ubuntu默认会记录sudo操作到/var/log/auth.log,但这个日志混杂了大量其他认证信息,不方便监控和分析。我们需要单独提取sudo日志并配置实时告警。
Ubuntu使用的是rsyslog日志系统,可以通过配置将sudo日志单独输出到一个文件。编辑rsyslog配置:
sudo nano /etc/rsyslog.d/50-default.conf
在文件末尾添加一行:
authpriv.* /var/log/sudo.log
这会将所有authpriv级别的日志(包括sudo操作)同时写入/var/log/sudo.log。然后重启rsyslog服务:
sudo systemctl restart rsyslog
现在每次有人执行sudo命令,/var/log/sudo.log中都会有一条记录,格式类似:
Jan 15 10:23:45 server01 sudo: deploy : TTY=pts/0 ; PWD=/home/deploy ; USER=root ; COMMAND=/usr/bin/apt update
这条记录包含了执行时间、用户名、终端、工作目录、目标用户和具体命令,信息量非常完整。
四、使用auditd实现更细粒度的sudo审计如果你需要更高级的审计能力,比如记录sudo命令的完整参数、执行前后的文件变化、甚至进程树,那就需要使用Linux审计框架auditd。这是比rsyslog更底层、更强大的审计工具,也是很多合规标准(如等保、PCI-DSS)明确要求的。
首先安装auditd:
sudo apt install auditd audispd-plugins
然后配置审计规则,监控sudo相关的系统调用。创建规则文件:
sudo nano /etc/audit/rules.d/sudo.rules
写入以下内容:
-w /usr/bin/sudo -p x -k sudo_action -w /etc/sudoers -p wa -k sudo_config -a always,exit -F arch=b64 -S execve -C uid!=0 -F euid=0 -k privilege_escalation
这三条规则的含义分别是:监控/usr/bin/sudo文件的执行和属性变更、监控/etc/sudoers配置文件的修改、监控任何非root用户执行后获得root权限的行为。加载规则并重启auditd:
sudo augenrules --load sudo systemctl restart auditd
查看审计日志使用ausearch或aureport命令:
sudo ausearch -k sudo_action sudo aureport -x --summary
auditd的优势在于它记录的是内核级别的系统调用,攻击者即使清理了日志文件,只要audit服务在运行,记录就不会丢失(因为audit日志是追加写入且有完整性保护的)。
五、禁用root登录与sudo审计的联动告警方案单独配置好这两项还不够,真正的安全价值在于联动。也就是说,当检测到异常的sudo行为时,系统能自动告警。这里提供一个实用的方案:使用inotifywait监控sudo日志文件的变化,一旦有新的sudo记录就触发分析脚本。
首先安装inotify-tools:
sudo apt install inotify-tools
创建监控脚本:
sudo nano /usr/local/bin/sudo_monitor.sh
#!/bin/bash
LOGFILE="/var/log/sudo.log"
ALERT_EMAIL="admin@example.com"
SUSPICIOUS_COMMANDS="rm -rf|dd if=|chmod 777|wget |curl |nc |bash -i"
inotifywait -m -e modify "$LOGFILE" | while read path action file; do
LATEST=$(tail -1 "$LOGFILE")
if echo "$LATEST" | grep -qiE "$SUSPICIOUS_COMMANDS"; then
echo "ALERT: Suspicious sudo command detected: $LATEST" | \
mail -s "Security Alert: Suspicious Sudo Activity" "$ALERT_EMAIL"
fi
done
给脚本执行权限并设置为systemd服务:
sudo chmod +x /usr/local/bin/sudo_monitor.sh sudo nano /etc/systemd/system/sudo-monitor.service
[Unit] Description=Sudo Activity Monitor After=network.target [Service] Type=simple ExecStart=/usr/local/bin/sudo_monitor.sh Restart=always [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable sudo-monitor.service sudo systemctl start sudo-monitor.service
这个方案会实时监控sudo日志,一旦发现包含rm -rf、wget下载、反弹shell等高危命令的sudo操作,立即发邮件告警。当然,你也可以把告警方式换成企业微信、钉钉机器人或者SIEM系统对接。
六、几个容易踩的坑和进阶建议第一,禁用root远程登录后,日常运维怎么办?答案是用普通用户登录,再通过sudo执行管理命令。但要注意,不是所有用户都应该有sudo权限。检查/etc/sudoers,只给真正需要的用户授权,并且尽量限制他们能执行的命令范围。用visudo编辑,给特定用户只开放特定命令:
deploy ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/apt update
第二,日志文件会越来越大,必须配置logrotate。编辑/etc/logrotate.d/sudo-log:
/var/log/sudo.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
}
第三,如果服务器有多个管理员,建议配置sudo会话录像。在/etc/sudoers中添加:
Defaults log_output Defaults!/usr/bin/passwd !log_output
这样sudo执行的所有命令输出都会被记录,配合I/O日志插件甚至可以回放整个操作过程。
第四,定期审查。每周至少检查一次/var/log/sudo.log和audit日志,用grep过滤异常时间(比如凌晨3点)的sudo操作,用aureport生成周报。安全不是配置一次就完事的,是持续运营的过程。
七、总结Ubuntu安全加固的核心思路就是"最小权限+全程可追溯"。禁用root远程登录切断了最直接的攻击路径,sudo审计日志确保了任何提权行为都被记录在案,两者联动告警则让你在第一时间发现异常。这三层防护配合起来,即使攻击者拿到了普通用户权限,也很难在不被发现的情况下完成横向移动和持久化驻留。对于生产环境的Ubuntu服务器,这套方案是基础中的基础,没有理由不做。
