Ubuntu服务器日常安全运维巡检的核心不是装个防火墙就完事,而是建立一套可重复、可追溯、能落地的检查流程。多数服务器被入侵的根源并非0day漏洞,而是弱口令、未修补的高危组件、异常的计划任务以及被忽略的日志告警。巡检的目的就是在攻击者造成实际损失前发现这些异常痕迹。
账号与认证安全巡检
先检查系统中有没有不该存在的账号。执行awk -F: '($3==0){print $1}' /etc/passwd可以列出所有UID为0的超级用户,正常情况下只应该有root。如果出现其他账号,立即核查来源。接着用lastlog查看所有账号的最后登录时间,长期未登录但突然活跃的账号需要重点关注。检查/etc/passwd中是否存在空口令账号,执行awk -F: '($2==""){print $1}' /etc/shadow,输出结果必须为空。
SSH配置是Ubuntu服务器最常被攻击的入口。检查/etc/ssh/sshd_config中是否设置PermitRootLogin no、PasswordAuthentication no、MaxAuthTries 5。如果业务允许,建议改为仅密钥登录。同时检查~/.ssh/authorized_keys文件,确认没有陌生的公钥被植入。很多入侵者会通过写入自己的公钥维持访问权限,巡检时必须逐一核对公钥注释和指纹。
系统更新与软件漏洞巡检
Ubuntu的软件包漏洞修复依赖及时的apt更新。巡检时先执行apt update刷新软件源索引,然后执行apt list --upgradable查看可升级的软件包列表。重点标记带有security字样的更新源,这些属于Ubuntu安全公告覆盖的漏洞修复。对于无法立即升级的软件包,可以用ubuntu-security-status命令查看系统中有多少包处于安全支持范围内,多少已经失去安全更新。
内核版本也需要关注。执行uname -r查看当前运行内核,再执行dpkg -l | grep linux-image查看已安装的内核包。如果当前运行内核版本明显落后于已安装的最新内核,说明服务器可能很久没有重启,存在已知内核漏洞未生效修复的情况。巡检报告中应记录当前内核版本和最新可用内核版本,并建议在维护窗口重启。
网络连接与端口监听巡检
执行ss -tulnp查看所有监听端口。Ubuntu服务器默认安装后不应有除SSH外的其他对外监听服务。如果发现未知端口在监听,立即用ps -p PID -o cmd=定位对应进程。特别注意高端口上的反向连接,很多挖矿木马和远控后门会使用8080、4444、5555等端口。执行ss -tnp查看当前所有已建立的TCP连接,重点关注与外部IP建立的持久连接,尤其是连接到非业务相关地区的连接。
防火墙规则也需要逐条核对。执行iptables -L -n -v查看当前规则,确认默认策略是否为DROP,入站规则是否只放行必要端口。如果使用ufw,执行ufw status verbose查看状态。注意检查是否有可疑的放行规则,例如对所有来源开放22端口以外的管理端口,或者存在对特定IP的全端口放行。
进程与计划任务巡检
执行ps aux --sort=-%cpu | head -20查看CPU占用最高的进程。挖矿木马通常会伪装成正常进程名,如kworkerds、systemd-network等,但CPU占用会异常高。检查进程的启动路径,执行ls -l /proc/PID/exe可以查看进程的真实可执行文件位置。如果路径指向/tmp、/var/tmp、/dev/shm等可写目录,基本可以判定为恶意进程。
计划任务是Linux服务器持久化攻击的重灾区。依次检查/etc/crontab、/etc/cron.d/、/var/spool/cron/crontabs/以及各用户的crontab。执行for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l 2>/dev/null; done可以列出所有用户的计划任务。重点排查包含curl、wget、base64、python等关键字的条目,这些经常被用于下载和执行恶意脚本。同时检查/etc/rc.local、/etc/init.d/、/etc/systemd/system/下的自启动服务,确认没有异常的自启动项。
文件系统与权限巡检
检查/tmp、/var/tmp、/dev/shm目录中是否有可疑的可执行文件。执行find /tmp -type f -perm -111 -mtime -7可以找出最近7天内创建的具有执行权限的文件。攻击者经常利用这些可写目录存放恶意工具。检查/usr/bin、/usr/sbin、/bin、/sbin下最近被修改的二进制文件,执行find /usr/bin /usr/sbin /bin /sbin -type f -mtime -15,如果出现系统核心命令在非维护时间被修改,需要立即排查是否被替换为木马版本。
SUID和SGID文件也是巡检重点。执行find / -perm -4000 -type f 2>/dev/null列出所有SUID文件。正常情况下只有passwd、su、sudo等少数命令具有SUID权限。如果发现/tmp下的文件或者不属于系统默认的二进制文件具有SUID权限,说明可能被植入了提权后门。对于可写的系统关键目录,执行find /etc -type f -writable -not -user root检查是否有非root用户可写的配置文件。
日志审计与异常行为分析
日志是巡检中最有价值但最容易被忽略的部分。首先检查/var/log/auth.log中的认证失败记录,执行grep "Failed password" /var/log/auth.log | tail -50查看最近的失败登录尝试。如果某个IP出现大量失败尝试,说明正在遭受暴力破解。执行grep "Accepted" /var/log/auth.log | tail -50查看成功登录记录,核对登录时间、来源IP和用户名是否与已知运维操作匹配。特别注意非工作时间的成功登录。
检查/var/log/syslog中是否有异常的服务重启或内核报错。执行grep -i "error\|fail\|warn" /var/log/syslog | tail -100可以快速定位近期系统异常。如果服务器上运行了Web服务,还需要检查对应的访问日志和错误日志,查找异常的文件访问请求,如对/etc/passwd、/proc/self/environ等敏感路径的请求,以及包含SQL注入特征的URL参数。
自动化巡检脚本建议
将上述检查项固化为脚本可以大幅提高巡检效率和一致性。以下是一个基础巡检脚本框架,可以根据实际环境扩展:
#!/bin/bash
echo "=== 账号检查 ==="
awk -F: '($3==0){print "UID 0用户: "$1}' /etc/passwd
awk -F: '($2==""){print "空口令账号: "$1}' /etc/shadow
echo "=== SSH配置 ==="
grep -E "^(PermitRootLogin|PasswordAuthentication|MaxAuthTries)" /etc/ssh/sshd_config
echo "=== 可升级安全更新 ==="
apt list --upgradable 2>/dev/null | grep -i security
echo "=== 监听端口 ==="
ss -tulnp | grep -v "127.0.0.1\|::1"
echo "=== 高CPU进程 ==="
ps aux --sort=-%cpu | head -6
echo "=== 可疑计划任务 ==="
grep -rE "curl|wget|base64|python" /etc/cron* /var/spool/cron/crontabs/ 2>/dev/null
echo "=== SUID文件 ==="
find / -perm -4000 -type f 2>/dev/null | grep -vE "^/(usr/bin|usr/sbin|bin|sbin)/"
echo "=== 最近登录记录 ==="
last -20
echo "=== 失败登录TOP5 IP ==="
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -5
脚本输出结果应保存为带时间戳的文件,便于历史对比。建议将巡检脚本加入cron定期执行,并将关键告警项接入邮件或消息通知。
巡检频率与记录规范
日常巡检建议每天执行一次快速检查,包括登录记录、CPU异常进程、新增计划任务和端口变化。每周执行一次全面检查,包括软件更新状态、SUID文件、日志深度分析。每次巡检结果必须形成书面记录,包含检查时间、检查人、发现的问题、处理措施和遗留风险。对于无法立即处理的问题,应建立跟踪机制,明确修复期限和责任人。
Ubuntu服务器的安全运维巡检本质上是一个持续对抗的过程。攻击者的手法在变,但留下的痕迹类型相对固定。只要坚持执行系统化的检查流程,并对每一条异常记录保持敏感,绝大多数入侵都能在早期被发现和阻断。
