CentOS服务器安全审计中,账号登录行为分析是最容易被低估的环节。很多运维人员习惯用last命令扫一眼就完事,实际上真正有威胁的登录往往藏在几个关键日志的交叉比对里。审计所有账号登录行为,核心要解决三件事:谁在登录、从哪里登录、登录后做了什么。下面直接拆解具体的审计方法和命令。
先确认系统记录的完整性和时间准确性
登录行为审计的前提是日志记录完整、时间戳可靠。CentOS默认使用rsyslog记录认证相关事件,但部分精简安装可能没有开启完整记录。先检查/var/log/secure文件是否存在且持续更新:
ls -lh /var/log/secure* tail -n 20 /var/log/secure
如果发现secure日志缺失或很久没有更新,检查rsyslog服务状态和sshd配置。sshd的日志级别直接影响登录记录的详细程度,建议在/etc/ssh/sshd_config中确认或设置:
LogLevel VERBOSE
修改后重启sshd服务。同时用chronyc tracking或ntpq -p确认时间同步正常,时间偏差会导致审计时无法准确关联事件顺序。
快速掌握所有账号的登录历史
last命令读取/var/log/wtmp,能列出所有成功登录的记录。要审计全部账号,直接用:
last -a -F
-a参数把主机名放在最后一列,-F显示完整时间。这个输出会包含reboot记录和所有用户。如果想按用户筛选,比如查看root的登录:
last -a -F root
但last只能看到成功登录,失败的尝试需要用lastb:
lastb -a -F
lastb读取的是/var/log/btmp,记录所有失败的登录尝试。很多暴力破解的痕迹会在这里暴露。如果lastb提示文件不存在,说明系统从未记录失败登录,需要手动创建并设置权限:
touch /var/log/btmp chmod 600 /var/log/btmp
创建后sshd的失败尝试会自动写入。这两个命令结合使用,可以快速判断是否有异常账号在活动。
从secure日志中提取认证细节
/var/log/secure是审计登录行为的核心数据源。它记录了sshd、su、sudo等所有通过PAM认证的事件。直接查看所有sshd相关记录:
grep sshd /var/log/secure
输出会包含Accepted password、Failed password、Connection closed等关键信息。要统计所有成功登录的账号和来源IP,可以用:
grep "Accepted" /var/log/secure | awk '{print $1,$2,$3,$9,$11}' | sort | uniq -c | sort -rn
这个命令会按出现次数排序,快速找出登录最频繁的账号和IP。对于失败的登录:
grep "Failed" /var/log/secure | awk '{print $1,$2,$3,$9,$11}' | sort | uniq -c | sort -rn
如果某个账号有大量失败记录但最终成功,需要重点排查是否被暴力破解。secure日志默认会轮转,历史记录可能在/var/log/secure-日期.gz中,审计时要加上zcat或zgrep覆盖历史压缩日志。
检查当前在线会话和登录来源
审计不能只看历史,当前在线的会话同样关键。who命令显示当前登录的用户、终端和登录时间:
who -u
w命令能进一步看到每个会话正在执行的命令:
w
如果发现不认识的用户在线,或者某个用户从异常IP登录,立即用ps和strace追踪其进程行为。另外,ss命令可以查看当前所有已建立的SSH连接:
ss -tnp | grep :22
这个命令能直接看到每个SSH连接的本地端口、远程IP和对应的进程PID。结合who的结果,可以精确定位某个登录会话对应的网络连接。
审计账号切换和提权行为
登录行为不止包括SSH登录,还包括su切换和sudo提权。很多入侵者拿到普通账号后,会尝试su到root。su的日志同样在/var/log/secure中:
grep "su:" /var/log/secure
输出会显示谁在什么时间su到了哪个账号,以及是否成功。重点关注authentication failure的su记录。sudo的使用记录在/var/log/secure中也有体现:
grep "sudo" /var/log/secure
更详细的sudo审计可以通过查看/var/log/sudo.log(如果配置了sudo日志)或者直接分析/var/log/secure中的sudo会话。对于提权行为,建议同时检查/var/log/audit/audit.log,如果系统开启了auditd,其中会有更完整的execve和setuid事件记录。
分析账号登录的时间规律和异常模式
把所有登录记录汇总后,需要做模式分析。正常的运维登录通常集中在工作时间,来源IP相对固定。异常的登录往往出现在深夜或凌晨,来源IP可能是陌生地域。用以下命令统计每小时登录次数:
grep "Accepted" /var/log/secure | awk '{print $3}' | cut -d: -f1 | sort | uniq -c
如果发现凌晨2点到5点之间有大量登录,需要高度警惕。同时统计每个账号的登录IP分布:
grep "Accepted" /var/log/secure | awk '{print $9,$11}' | sort | uniq -c | sort -rn
某个账号如果突然从一个从未出现过的IP登录,或者同一个账号在短时间内从多个不同地域的IP登录,基本可以判定账号已经泄露。
利用utmpdump深入解析二进制日志
last和lastb输出的信息有限,utmpdump可以把wtmp和btmp的二进制内容完整导出为文本,方便进一步分析。导出wtmp:
utmpdump /var/log/wtmp
输出会包含每个登录会话的详细字段,包括终端类型、PID、主机名等。导出后可以用grep和awk做更灵活的处理。比如查找所有从特定IP登录的记录:
utmpdump /var/log/wtmp | grep "192.168.1.100"
这个方法对于处理被轮转过的wtmp文件同样有效,只需要指定对应的历史文件路径。
结合cron和计划任务排查持久化后门
登录行为审计的延伸是检查账号是否被用来创建了持久化后门。很多入侵者登录后会修改crontab或者写入/etc/cron.d目录。检查所有用户的crontab:
for user in $(cut -f1 -d: /etc/passwd); do echo "=== $user ==="; crontab -l -u $user 2>/dev/null; done
同时检查系统级cron目录:
ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
如果发现不属于正常维护的脚本,尤其是包含网络连接或下载执行的脚本,要立即隔离并追踪其来源账号。
检查SSH密钥登录的审计盲区
很多安全审计只关注密码登录,忽略了SSH密钥登录。实际上,如果攻击者植入了自己的公钥,后续登录不会在secure日志中留下密码验证记录,只会显示Accepted publickey。检查所有用户的authorized_keys文件:
find /home /root -name authorized_keys -exec ls -la {} \; -exec cat {} \;
重点看是否有不属于正常管理员的公钥。同时检查/root/.ssh/目录的权限和文件修改时间,如果authorized_keys的修改时间与某次异常登录时间吻合,基本可以确定密钥被篡改。
自动化审计脚本的思路
手动执行上述命令适合临时排查,但持续的安全审计需要自动化。可以写一个简单的shell脚本,每天定时执行,汇总关键指标:
#!/bin/bash
echo "=== 昨日成功登录统计 ==="
grep "Accepted" /var/log/secure | grep "$(date -d yesterday +%b\ %e)" | awk '{print $9,$11}' | sort | uniq -c | sort -rn
echo "=== 昨日失败登录统计 ==="
grep "Failed" /var/log/secure | grep "$(date -d yesterday +%b\ %e)" | awk '{print $9,$11}' | sort | uniq -c | sort -rn
echo "=== 当前在线用户 ==="
who -u
echo "=== 当前SSH连接 ==="
ss -tnp | grep :22
把脚本放到/etc/cron.daily/目录下,每天自动输出审计报告。对于规模较大的环境,建议把日志集中到日志服务器,用ELK或类似工具做实时分析和告警。
处理审计中发现的可疑账号
一旦确认某个账号存在异常登录,处理要果断。先锁定账号:
passwd -l 账号名
或者直接删除账号(确认不是系统必要账号):
userdel -r 账号名
同时强制终止该账号的所有活动会话:
pkill -KILL -u 账号名
然后检查该账号的home目录、crontab、authorized_keys,清理所有异常文件。最后修改相关账号的密码,并检查是否有其他账号被波及。
CentOS服务器登录行为审计不是一次性工作,而是需要持续进行的日常运维动作。把上述命令和思路固化成脚本和流程,定期执行并留存记录,才能在发生安全事件时快速定位入侵路径和影响范围。账号登录行为是所有攻击链条的起点,把这一层看住了,后面的提权和横向移动就失去了基础。
