服务器被入侵后如何排查:日志分析完整指南
<p class="subtitle">2026-03-22 · 约 20 分钟阅读</p>
<div class="info">
<div class="info-title">💡 背景</div>
今天早上 6 点,我们的阿里云服务器被暴力破解了 root 密码。本文记录完整的排查思路和命令,供大家学习和参考。
</div>
<h2>📋 排查清单速览</h2>
<div class="section">
<p>发现服务器被入侵后,按这个顺序检查最有效率:</p>
<ol>
<li><strong>断开网络 / 停止对外服务</strong>(如果情况严重)</li>
<li><strong>查看登录记录</strong>——谁在什么时候登录的?</li>
<li><strong>查看命令历史</strong>——他们执行了什么?</li>
<li><strong>查看网络连接</strong>——有没有正在进行的远程控制?</li>
<li><strong>查看用户列表</strong>——有没有新增的管理员账号?</li>
<li><strong>查看定时任务</strong>——有没有定时任务在搞事?</li>
<li><strong>查看服务列表</strong>——有没有新增的可疑服务?</li>
<li><strong>查看安装历史</strong>——有没有装新软件?</li>
<li><strong>查看启动项</strong>——有没有开机自启的后门?</li>
<li><strong>查看文件改动</strong>——关键配置文件有没有被改?</li>
</ol>
</div>
<h2>1️⃣ 查看登录记录</h2>
<div class="section">
<p>登录记录是最重要的突破口。可以告诉你:谁、从哪个IP、什么时间登录的、待了多久。</p>
<h3>查看成功登录记录</h3>
<pre><code>last</code></pre>
<p>输出示例:</p>
<pre><code>elliot pts/0 139.226.130.70 Tue Mar 17 18:15 - 20:27 (02:11)
root pts/0 39.97.253.143 Sun Mar 22 06:08 - 06:08 (00:00)
reboot system boot 6.8.0-100-generi Wed Mar 18 12:12 still running
重点关注:陌生的 IP 地址、非正常时段的登录、root 账号的异常登录。
<h3>过滤特定IP段(排除自己的正常IP)</h3>
<pre><code># 查看非正常IP的成功登录(把你的IP段替换进去)
last | grep -v "139.226|139.227|223.166|你的IP段"
<h3>查看失败登录记录</h3>
<pre><code>sudo lastb</code></pre>
<p>这个命令列出所有失败的登录尝试。攻击者在密码被改之前会一直尝试,看到大量失败记录很正常。</p>
<h3>查看 auth.log 中的 Accepted 记录</h3>
<pre><code>sudo grep "Accepted" /var/log/auth.log
sudo grep "Accepted" /var/log/auth.log.1 # 昨天的日志
这是最直接的——只要看到 Accepted password for root from 陌生IP,就说明有人成功登录了。
<h3>限定时间范围查看日志</h3>
<pre><code># 查看某个时间段的所有认证记录
sudo journalctl --since "2026-03-22 06:00" --until "2026-03-22 09:30" | grep -i "accepted|failed"
journalctl 是 systemd 日志的查看工具,比直接读文件更方便,支持时间范围过滤。
<h2>2️⃣ 查看命令历史</h2>
<div class="section">
<p>攻击者登录后通常会执行一些命令来探测环境。命令历史是重要的突破口。</p>
<h3>查看 bash 历史</h3>
<pre><code>sudo cat /root/.bash_history</code></pre>
<div class="warning">
<div class="warning-title">⚠️ 注意</div>
如果攻击者执行了 <code>rm -rf ~/.bash_history</code> 或设置了 <code>HISTORY=0</code>,历史记录会被清空。清空本身就是一个危险信号!
</div>
<h3>关键词过滤</h3>
<pre><code># 搜索可疑命令关键词
grep -E "wget|curl|chmod|useradd|deluser|ssh|scp|tar|zip|rm |python|perl|bash" /root/.bash_history
攻击者常做的事:下载工具(wget/curl)、改权限(chmod)、创建账号(useradd)、内网渗透(ssh)、下载后门(python/perl 脚本)。
<h2>3️⃣ 查看网络连接</h2>
<div class="section">
<p>如果攻击者正在连接你的服务器,或者服务器正在向外发起连接,这些都能看到。</p>
<h3>查看所有 TCP/UDP 连接</h3>
<pre><code>sudo ss -tunap</code></pre>
<p>参数说明:<code>-t</code> TCP,<code>-u</code> UDP,<code>-n</code> 显示IP而非域名,<code>-a</code> 所有,<code>-p</code> 显示进程</p>
<h3>重点关注</h3>
<ul>
<li><code>ESTABLISHED</code> — 正在进行的连接,尤其是对外部IP的</li>
<li><code>LISTEN</code> — 服务器在监听的端口,有没有新增的监听端口</li>
<li>陌生的外部 IP,尤其是连接到一些非常见端口(如 4444、5555、6666 等 Metasploit 默认端口)</li>
</ul>
<h3>查看端口对应的进程</h3>
<pre><code>sudo lsof -i :端口号</code></pre>
<p>比如 <code>sudo lsof -i :5901</code> 可以查看 VNC 端口被哪个进程占用。</p>
<h3>检查对外连接</h3>
<pre><code># 查看服务器主动向外建立的连接(排除正常内网通信)
sudo ss -tunap | grep ESTAB | grep -v "127.0.0.1|172.21|100.100|内网IP段"
<h2>4️⃣ 查看用户列表</h2>
<div class="section">
<p>攻击者入侵后通常会创建一个自己的管理员账号,方便下次回来。</p>
<h3>查看所有用户</h3>
<pre><code>cat /etc/passwd | grep -v "^_" | grep "sh$"</code></pre>
<p>只显示有 shell 的用户(能登录的账号)。重点关注陌生的账号。</p>
<h3>查看新增用户</h3>
<pre><code># 查看 UID >= 1000 的用户(正常新建用户从这个UID开始)
awk -F: '{ if($3 >= 1000) print $1, $3 }' /etc/passwd
<h3>查看用户组(有没有被加进 sudo 或 root 组)</h3>
<pre><code>getent group sudo
getent group root
getent group admin
<h3>查看 shadow 文件(看哪些账号有密码)</h3>
<pre><code>sudo cat /etc/shadow | grep -v "!" | grep -v ":\*$:"</code></pre>
<p>如果看到陌生账号有密码 hash,说明这个账号可以被登录。</p>
</div>
<h2>5️⃣ 查看定时任务</h2>
<div class="section">
<p>定时任务(cron job)是保持持久化最常用的手段。攻击者会设置一个定时任务,每分钟或每小时执行一次后门程序。</p>
<h3>查看当前用户的 cron</h3>
<pre><code>crontab -l
sudo crontab -l
<h3>查看系统级 cron 任务</h3>
<pre><code>sudo cat /var/spool/cron/crontabs/root
sudo ls -la /etc/cron.d/
sudo ls -la /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/
<h3>查看 systemd 定时器(timer)</h3>
<pre><code>systemctl list-timers --all</code></pre>
<p>除了 cron,systemd 也有自己的定时器机制。</p>
<h3>关键词搜索</h3>
<pre><code># 在 cron 配置里搜索可疑关键词
grep -r "wget|curl|python|bash|sh " /etc/cron* /var/spool/cron/ 2>/dev/null
<h2>6️⃣ 查看服务列表</h2>
<div class="section">
<p>攻击者可能会在服务器上安装一个新的服务,开机自动运行,比 cron 更隐蔽。</p>
<h3>查看正在运行的服务</h3>
<pre><code>systemctl list-units --type=service --state=running</code></pre>
<p>重点关注:名字奇怪的、不认识的、非系统自带的。</p>
<h3>查看所有服务(含未启动的)</h3>
<pre><code>systemctl list-units --type=service --all | grep -v "loaded\|systemd\|ssh\|cron\|network"</code></pre>
<h3>检查服务状态</h3>
<pre><code>systemctl status 服务名
sudo systemctl status 可疑服务名
<h2>7️⃣ 查看软件安装历史</h2>
<div class="section">
<p>如果攻击者用包管理器安装了工具,可以通过安装历史查到。</p>
<h3>apt 安装历史(Debian/Ubuntu)</h3>
<pre><code>cat /var/log/apt/history.log | tail -100
cat /var/log/apt/history.log.1.gz | zcat | tail -100
可以看到什么时间安装了什么包。如果发现可疑的软件(如 nmap、netcat、hydra 等黑客工具),要警惕。
<h3>查看 dpkg 安装记录</h3>
<pre><code>dpkg -l | grep "^ii" | tail -50</code></pre>
<p>列出所有已安装的包。重点关注不认识的包。</p>
<h3>yum/dnf 安装历史(CentOS/RHEL)</h3>
<pre><code>cat /var/log/yum.log
sudo yum history
<h2>8️⃣ 查看文件改动</h2>
<div class="section">
<p>如果攻击者修改了系统文件(如 <code>/etc/passwd</code>、<code>/etc/shadow</code>、<code>/etc/sudoers</code>),可以通过文件的修改时间查到。</p>
<h3>查看某个时间点附近修改的文件</h3>
<pre><code># 查找 2026-03-22 06:00 到 09:30 之间修改的系统文件
sudo find /etc /usr/bin /usr/sbin /bin /sbin -type f -newer /var/log/auth.log.1 -mmin -1200 2>/dev/null | grep -v "sysstat|e2scrub"
<h3>查看敏感文件的修改时间</h3>
<pre><code>ls -la /etc/passwd /etc/shadow /etc/sudoers /etc/ssh/sshd_config
stat /etc/passwd
<h3>使用 AIDE 进行完整性检测(推荐安装)</h3>
<pre><code># AIDE 是一个文件完整性监控工具
sudo apt install aide
sudo aideinit
平时运行一次 aide --check 就能发现哪些文件被改过了。建议在服务器刚部署好时就建立基准。
<h3>使用 rkhunter 检测 Rootkit</h3>
<pre><code>sudo apt install rkhunter
sudo rkhunter --check
rkhunter 会检查常见的 Rootkit 特征、隐藏进程、可疑网络连接等。
<h2>9️⃣ 查看 Docker 容器</h2>
<div class="section">
<p>攻击者可能利用 Docker 来运行后门或挖矿程序。</p>
<pre><code># 查看正在运行的容器
docker ps -a
查看所有镜像
docker images
查看容器日志(如果发现可疑容器)
docker logs 容器ID
本次排查中,Docker 没有运行任何容器,也没有可疑镜像。
<h2>🔟 systemd journal 高级查询</h2>
<div class="section">
<p><code>journalctl</code> 是查看 Linux 系统日志的利器,功能比直接读文件强大得多。</p>
<h3>按时间范围查询</h3>
<pre><code># 查看今天凌晨到现在的所有日志
journalctl --since "today"
查看某个时间段的日志
journalctl --since "2026-03-22 06:00" --until "2026-03-22 09:30"
查看昨天的日志
journalctl --since "2026-03-21 00:00" --until "2026-03-22 00:00"
<h3>按服务过滤</h3>
<pre><code># 只看 sshd 的日志
journalctl -u sshd --since "2026-03-22 06:00"
只看 cron 的日志
journalctl -u cron --since "today"
<h3>关键词搜索</h3>
<pre><code># 搜索包含 "error" 的日志
journalctl --since "today" | grep -i error
搜索多个关键词
journalctl --since "2026-03-22 06:00" | grep -E "wget|curl|useradd|chmod|sudo"
<h3>实时跟踪日志</h3>
<pre><code># 等效于 tail -f,实时监控新日志
journalctl -f
<h2>📊 本次排查完整命令清单</h2>
<div class="section">
<p>以下是我们这次实际执行的命令,按照顺序执行即可复现排查过程:</p>
<pre><code># ========== 1. 登录记录 ==========
last
sudo lastb
sudo grep "Accepted" /var/log/auth.log
sudo journalctl --since "2026-03-22 06:00" --until "2026-03-22 09:30"
========== 2. 命令历史 ==========
sudo cat /root/.bash_history
========== 3. 网络连接 ==========
sudo ss -tunap
sudo lsof -i :5901 # 查看特定端口
========== 4. 用户列表 ==========
cat /etc/passwd | grep -v "^_" | grep "sh$"
getent group sudo
========== 5. 定时任务 ==========
sudo crontab -l
sudo cat /var/spool/cron/crontabs/root
sudo ls -la /etc/cron.d/
========== 6. 服务列表 ==========
systemctl list-units --type=service --state=running
========== 7. Docker ==========
docker ps -a
========== 8. 文件改动 ==========
sudo find /etc -type f -newer /var/log/auth.log.1 2>/dev/null
<h2>🚨 发现入侵后的应急响应</h2>
<div class="section">
<ol>
<li><strong>断网</strong> — 如果情况严重,立即断开服务器网络连接,防止攻击者继续操作或对外攻击</li>
<li><strong>截图/录屏</strong> — 先把当前屏幕截图、日志输出保存,作为证据</li>
<li><strong>停止可疑服务</strong> — <code>systemctl stop 可疑服务名</code></li>
<li><strong>删除攻击者账号</strong> — <code>userdel -r 用户名</code></li>
<li><strong>删除攻击者的定时任务</strong> — <code>crontab -r -u 用户名</code></li>
<li><strong>删除攻击者的 SSH 密钥</strong> — 检查 <code>~/.ssh/authorized_keys</code>,移除不认识公钥</li>
<li><strong>更改所有密码</strong> — root、数据库、应用密码等全部改掉</li>
<li><strong>查日志确认攻击范围</strong> — 确定攻击者到底做了什么</li>
<li><strong>快照备份</strong> — 在清理前创建快照,以防万一</li>
<li><strong>重装系统</strong> — 如果不确定清理是否干净,最稳妥的办法是重装</li>
</ol>
</div>
<h2>💡 预防措施总结</h2>
<div class="section">
<table>
<tr><th>措施</th><th>命令/操作</th><th>效果</th></tr>
<tr><td>关闭密码登录</td><td>修改 sshd_config</td><td>杜绝暴力破解</td></tr>
<tr><td>只允许密钥登录</td><td>PubkeyAuthentication yes</td><td>无法被暴力破解</td></tr>
<tr><td>限制登录IP</td><td>阿里云安全组规则</td><td>只有指定IP能登录</td></tr>
<tr><td>安装 fail2ban</td><td>apt install fail2ban</td><td>自动封禁攻击者IP</td></tr>
<tr><td>改掉root密码</td><td>passwd root</td><td>阻止已知密码被利用</td></tr>
<tr><td>定期查看日志</td><td>last / lastb</td><td>及时发现异常</td></tr>
<tr><td>安装 AIDE</td><td>apt install aide</td><td>文件完整性监控</td></tr>
<tr><td>开启 SSH 失败通知</td><td>fail2ban + 邮件告警</td><td>被攻击时第一时间知道</td></tr>
</table>
</div>
<h2>📚 推荐工具</h2>
<div class="section">
<ul>
<li><strong>AIDE</strong> — 文件完整性监控,建立基准后能发现任何文件改动</li>
<li><strong>rkhunter</strong> — Rootkit 检测,扫描常见的后门特征</li>
<li><strong>fail2ban</strong> — 自动封禁多次登录失败的 IP</li>
<li><strong>lynis</strong> — Linux 安全审计工具,扫描系统漏洞和配置问题</li>
<li><strong>ClamAV</strong> — 恶意软件扫描器,可以扫描服务器上的病毒和后门</li>
</ul>
</div>
<h2>📝 总结</h2>
<div class="section">
<p>排查服务器入侵是一个系统工程,重点是:</p>
<ul>
<li><strong>先看登录记录</strong> — 确认攻击者是谁、从哪来、什么时候来的</li>
<li><strong>再看命令历史</strong> — 确认攻击者做了什么</li>
<li><strong>然后排查后门</strong> — 用户、定时任务、服务、文件改动</li>
<li><strong>最后清理加固</strong> — 删账号、改密码、关漏洞</li>
</ul>
<p>最重要的是:平时就要做好安全措施,而不是等到被入侵才想起来。希望这篇文章对你有帮助,祝大家的服务器都平安!🛡️</p>
</div>