Ubuntu服务器的安全审计,最直接有效的切入点就是检查谁在什么时间登录了系统,以及哪些账户的权限发生了变更。这不需要复杂的第三方工具,系统自带的日志和命令就能提供完整的证据链。当服务器出现异常负载、文件丢失或配置被篡改,第一时间应该排查的就是登录记录和权限变更历史。
从日志入手锁定异常登录源头Ubuntu系统记录登录行为主要依赖几个核心日志文件。首先查看当前登录用户,直接执行w命令,输出会显示登录用户、来源IP、登录时间以及正在执行的命令。这个命令能快速判断是否有陌生账户正在活动。
w 10:30:01 up 15 days, 2:15, 3 users, load average: 0.08, 0.03, 0.01 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.100 09:15 1:20 0.05s 0.05s -bash ubuntu pts/1 10.0.0.5 10:20 3.00s 0.02s 0.02s vim /etc/nginx/nginx.conf
如果发现可疑IP或未知用户,立刻查看历史登录记录。last命令读取/var/log/wtmp文件,按时间倒序列出所有成功登录会话。配合lastb命令查看/var/log/btmp中记录的错误登录尝试,这两个命令结合使用能还原攻击者尝试爆破的完整过程。
last -n 20
lastb -n 50 | awk '{print $3}' | sort | uniq -c | sort -nr
第二行命令统计失败登录次数最多的IP地址,如果某个IP尝试了上百次登录,基本可以确定是暴力破解攻击。进一步分析/var/log/auth.log,这里记录了所有认证相关事件,包括SSH登录、sudo提权、密码修改等。使用grep过滤SSH相关记录,重点关注Accepted和Failed关键字。
grep "sshd" /var/log/auth.log | grep "Accepted"
grep "sshd" /var/log/auth.log | grep "Failed" | awk '{print $(NF-3)}' | sort | uniq -c
对于系统采用journald管理日志的情况,使用journalctl直接查询SSH服务日志,时间范围和过滤条件更灵活。查看最近一小时的SSH登录事件,或者查询特定用户的认证记录。
journalctl -u ssh --since "1 hour ago" | grep "Accepted" journalctl -t sshd -o json-pretty | grep "invalid user"检测异常登录行为的特征指标
正常管理员的登录时间通常有规律可循,比如工作日白天时段。如果凌晨三四点出现root账户登录,或者从境外IP登录,就需要高度警惕。分析登录时间分布,使用last命令结合awk提取登录时间戳,快速识别非工作时间的登录行为。
last -F | awk '{print $5, $6, $7, $8}' | sort | uniq -c
登录来源的地理位置分析同样关键。虽然不依赖外部服务,但可以通过IP段归属初步判断。例如内网服务器如果出现公网IP登录,或者生产环境出现非运维网段的地址,都属于异常信号。查看当前监听端口和已建立的连接,确认SSH服务是否绑定了非预期接口。
ss -tlnp | grep 22 ss -tnp | grep ESTAB | grep :22
还有一种隐蔽性较高的异常登录方式是通过植入SSH公钥实现免密登录。攻击者获取权限后,往往会在authorized_keys文件中添加自己的公钥,以便持久化控制。检查所有用户的authorized_keys文件,重点关注修改时间和文件内容。
find /home -name "authorized_keys" -exec ls -la {} \;
find /root -name "authorized_keys" -exec ls -la {} \;
cat /home/*/.ssh/authorized_keys
cat /root/.ssh/authorized_keys
如果发现未知公钥或文件修改时间与正常操作不符,立即删除可疑公钥并重置相关账户密码。同时检查SSH配置是否允许密钥认证,以及是否限制了密钥登录的用户范围。
追踪用户权限变更的完整路径Ubuntu系统中用户权限变更涉及多个层面,包括用户组变更、sudo权限授予、文件所有权转移以及SUID/SGID位设置。系统管理员需要掌握每个层面的审计方法。
用户组信息变更记录在/var/log/auth.log中,搜索groupadd、usermod、gpasswd等关键词。重点关注将普通用户加入sudo组或admin组的操作,这是提权最直接的途径。
grep -E "groupadd|usermod|gpasswd" /var/log/auth.log grep "added to group sudo" /var/log/auth.log
查看当前拥有sudo权限的用户列表,确认是否存在未经授权的账户。同时检查/etc/sudoers文件和/etc/sudoers.d/目录下的配置,攻击者可能直接修改这些文件赋予自己sudo权限。
grep -Po '^sudo:.*:\K.*$' /etc/group grep -v "^#" /etc/sudoers | grep -v "^$" ls -la /etc/sudoers.d/ cat /etc/sudoers.d/*
特别注意NOPASSWD配置项,如果某个用户被设置为无需密码即可执行所有sudo命令,这是一个严重的安全隐患。检查方法如下,输出中如果包含ALL=(ALL) NOPASSWD:ALL,说明该用户拥有无密码的完全root权限。
grep -r "NOPASSWD" /etc/sudoers /etc/sudoers.d/文件权限异常的深度排查
攻击者提权后常通过设置SUID位来维持后门。SUID允许普通用户以文件所有者权限执行程序,如果/bin/bash或/bin/sh被设置了SUID位,任何用户都能获得root shell。扫描系统中所有SUID文件,并与已知安全基线对比。
find / -perm -4000 -type f 2>/dev/null find / -perm -2000 -type f 2>/dev/null
将输出结果与系统初始安装时的SUID文件列表比对,重点关注/usr/bin、/bin、/tmp等目录下出现的非预期SUID文件。常见的恶意后门会隐藏在/tmp或/dev/shm目录中。同时检查近期修改过的SUID文件,时间戳异常的文件需要进一步分析。
find / -perm -4000 -type f -mtime -7 2>/dev/null
文件所有权的变更同样值得关注。攻击者可能通过chown命令将关键系统文件的所有者改为自己,以便后续修改。检查/etc/passwd、/etc/shadow、/etc/sudoers等敏感文件的所有者和权限。
ls -la /etc/passwd /etc/shadow /etc/sudoers /etc/group stat /etc/passwd
正常的/etc/passwd权限应为644,所有者为root:root。/etc/shadow权限应为640,所有者为root:shadow。如果这些文件的权限或所有者发生变化,说明系统已被深度入侵。
建立持续监控与自动告警机制手动检查只能发现历史问题,建立自动化监控才能实时响应安全事件。使用auditd守护进程监控关键文件和系统调用,设置规则记录所有用户权限变更操作。
apt install auditd -y auditctl -w /etc/passwd -p wa -k passwd_changes auditctl -w /etc/sudoers -p wa -k sudoers_changes auditctl -w /etc/group -p wa -k group_changes auditctl -w /bin/su -p x -k su_execution
这些规则会记录对/etc/passwd、/etc/sudoers、/etc/group文件的写入和属性变更,以及su命令的执行。查询审计日志时使用ausearch命令,按关键词过滤相关事件。
ausearch -k passwd_changes --start today ausearch -k su_execution -i
对于SSH登录的实时监控,可以编写脚本解析auth.log,检测到异常登录后发送邮件或系统通知。以下脚本示例监控SSH成功登录事件,当检测到root直接登录或非白名单IP登录时触发告警。
#!/bin/bash
tail -f /var/log/auth.log | while read line; do
if echo "$line" | grep -q "sshd.*Accepted"; then
user=$(echo "$line" | awk '{print $9}')
ip=$(echo "$line" | awk '{print $11}')
if [ "$user" == "root" ]; then
echo "警告:root账户从 $ip 登录" | wall
fi
fi
done
更完善的方案是配置fail2ban自动封禁暴力破解IP,同时设置SSH登录的邮件通知。修改/etc/ssh/sshd_config,启用LoginGraceTime和MaxAuthTries限制,降低爆破成功率。PermitRootLogin设置为no禁止root直接登录,改用普通用户加sudo的方式管理服务器。
入侵后的应急响应与证据固定如果确认系统已被入侵,首要任务是保留证据并隔离受影响主机。使用script命令记录所有操作过程,然后通过netstat或ss命令查看当前网络连接,识别攻击者是否仍在线。使用ps命令列出所有进程,重点关注名称异常或占用CPU较高的进程。
ps auxf lsof -i netstat -anp | grep ESTABLISHED
检查计划任务和启动项,攻击者常通过这些途径维持持久化访问。查看所有用户的crontab以及系统级别的定时任务目录。
cat /etc/crontab ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2>/dev/null; done
检查systemd服务单元,攻击者可能创建伪装成系统服务的后门。重点关注最近修改过的服务文件以及描述信息可疑的单元。
systemctl list-units --type=service --state=running find /etc/systemd/system -name "*.service" -mtime -3
完成证据收集后,最安全的做法是从已知良好的备份恢复系统,并重置所有凭据。保留受感染系统的磁盘镜像用于事后分析,但不要在生产环境中尝试修复被深度入侵的系统,因为无法确保所有后门都被清除干净。
Ubuntu系统的安全审计是一个持续的过程,登录检查和权限监控只是基础环节。将这些检查命令融入日常运维流程,配合自动化告警机制,才能在安全事件发生的第一时间做出响应,最大限度降低损失。
