<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Authorized_keys on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/authorized_keys/</link>
        <description>Recent content in Authorized_keys on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Sun, 12 Jul 2026 07:00:00 +0000</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/authorized_keys/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>内网服务器为何频频出现来源不明的免密 SSH 登录？一次 authorized_keys 后门排查实录</title>
            <link>https://blog.5772447.xyz/posts/b0613189/</link>
            <pubDate>Sun, 12 Jul 2026 07:00:00 +0000</pubDate>
            <guid>https://blog.5772447.xyz/posts/b0613189/</guid>
            <description>&lt;h2 id=&#34;问题背景&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;公司运维跳板机（堡垒机前的咽喉节点）是进入整个内网的单一入口，平时只允许运维同事从公司固定出口 IP 或 VPN 段以密钥方式登录，root 直接登录被禁用、口令认证被关闭。某次例行安全巡检，我在把 &lt;code&gt;/var/log/secure&lt;/code&gt; 往 SIEM 归集时，注意到一批来源为境外云厂商段的 &amp;ldquo;Accepted publickey&amp;rdquo; 记录——但这些 IP 根本不在公司出口白名单里，团队也没人从那些地址登过机。跳板机一旦失陷，攻击者就能以此为支点横向移动打穿整个内网，因此这条异常必须立刻查清。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故障现象&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障现象&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;异常登录线索非常&amp;quot;安静&amp;quot;，没有任何资源告警，但日志细节很反常：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/var/log/secure&lt;/code&gt; 里大量出现 &lt;code&gt;Accepted publickey for root&lt;/code&gt; 记录，来源 IP 多变，集中在几个境外 VPS 网段，而公司出口是固定 IP，这些地址明显不在白名单。&lt;/li&gt;&#xA;&lt;li&gt;直觉以为是 SSH 口令爆破，但日志里&lt;strong&gt;完全没有 &lt;code&gt;Failed password&lt;/code&gt;&lt;/strong&gt;，全是直接 &lt;code&gt;Accepted&lt;/code&gt;——说明对方用的是合法公钥，而非猜密码。&lt;/li&gt;&#xA;&lt;li&gt;这些会话大多极短：登录后执行 &lt;code&gt;whoami&lt;/code&gt;、&lt;code&gt;cat /etc/shadow&lt;/code&gt;、&lt;code&gt;uname -a&lt;/code&gt;，再 &lt;code&gt;curl&lt;/code&gt; 下载一个小脚本后退出，没有长时间驻留，也没有挖矿进程，CPU、流量曲线平稳，传统监控毫无反应。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;last&lt;/code&gt; / &lt;code&gt;wtmp&lt;/code&gt; 显示对应会话确实存在，但 &lt;code&gt;lastlog&lt;/code&gt; 里这些来源此前从未出现。&lt;/li&gt;&#xA;&lt;li&gt;fail2ban 没有拦截，因为它默认只针对密码失败计数，公钥免密登录根本不触发其规则。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;最关键的矛盾点：&lt;strong&gt;登录成功了，但持有凭据的&amp;quot;人&amp;quot;不是我们&lt;/strong&gt;。这已经不是探测，而是后门已经落地。&lt;/p&gt;&#xA;&lt;h2 id=&#34;排查过程&#34;&gt;&lt;a href=&#34;#%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;排查过程&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;第一直觉要纠正：看到 SSH 异常，很多人先查爆破，但 &lt;code&gt;Failed password&lt;/code&gt; 一条都没有，说明问题不在&amp;quot;猜密码&amp;quot;，而在&amp;quot;已有合法钥匙&amp;quot;。于是排查方向立刻转向密钥与信任链。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 确认登录方式与账号。&lt;/strong&gt; &lt;code&gt;grep &amp;quot;Accepted&amp;quot; /var/log/secure | tail -n 50&lt;/code&gt; 显示全部是 &lt;code&gt;publickey&lt;/code&gt;，账号清一色 &lt;code&gt;root&lt;/code&gt; 或高权运维账号，来源 IP 集中在几个境外段。结合背景（已禁用 root 直接登录、关闭口令），能公钥登 root 的，只能是写进 &lt;code&gt;authorized_keys&lt;/code&gt; 的钥匙。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 直奔密钥文件。&lt;/strong&gt; 检查 &lt;code&gt;/root/.ssh/authorized_keys&lt;/code&gt;，发现文件末尾多出两长串陌生公钥，注释名还故意伪装成 &lt;code&gt;gitlab-runner&lt;/code&gt;、&lt;code&gt;jenkins-deploy&lt;/code&gt; 这类可信身份，混在团队正常密钥之间，不仔细 diff 根本看不出来。用 &lt;code&gt;ssh-keygen -l -f authorized_keys&lt;/code&gt; 列出指纹，陌生的那两把正是境外会话用到的公钥。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 还原写入时机。&lt;/strong&gt; &lt;code&gt;stat /root/.ssh/authorized_keys&lt;/code&gt; 看到 mtime 落在某次&amp;quot;看似正常&amp;quot;的发布窗口。翻 &lt;code&gt;history&lt;/code&gt; 与 &lt;code&gt;bash&lt;/code&gt; 审计日志，定位到当时有一行被夹在正常命令里的 &lt;code&gt;echo &amp;quot;ssh-rsa AAAA... attacker&amp;quot; &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;/code&gt;——执行者要么是已被控的运维终端，要么是利用泄漏凭据自动化写入的脚本。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;4. 追溯初始入侵链。&lt;/strong&gt; 往后翻 &lt;code&gt;/var/log/secure&lt;/code&gt; 与开发机日志，发现数日前有一次来自内网某开发机的登录记录，该开发机此前踩过内部 pip 源投毒（恶意依赖包），攻击者在开发机上拿到了跳板机的长期私钥后登录，再&amp;quot;公钥落地&amp;quot;完成持久化。也就是说，后门只是第二步，&lt;strong&gt;第一步是开发机凭据泄漏&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;5. 排查其他持久化与篡改。&lt;/strong&gt; 不能只看 authorized_keys：依次检查 &lt;code&gt;crontab -l&lt;/code&gt;、&lt;code&gt;/etc/cron.*&lt;/code&gt;、&lt;code&gt;systemd&lt;/code&gt; timer、&lt;code&gt;/etc/rc.local&lt;/code&gt;、&lt;code&gt;/etc/profile.d/&lt;/code&gt;、&lt;code&gt;/etc/ld.so.preload&lt;/code&gt;（LD_PRELOAD 劫持）、&lt;code&gt;/etc/pam.d/&lt;/code&gt;（是否被追加 &lt;code&gt;pam_permit&lt;/code&gt; 或恶意模块）、以及 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;（&lt;code&gt;PermitRootLogin&lt;/code&gt;、&lt;code&gt;PasswordAuthentication&lt;/code&gt; 是否被偷偷改回 &lt;code&gt;yes&lt;/code&gt;）。本例仅发现 authorized_keys 被改，其余干净，但仍需全量轮转凭据。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;6. 评估横向影响。&lt;/strong&gt; 在 secure 里检索从该跳板机主动发起的、到其他内网主机的 ssh 记录，并检查 &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt;、&lt;code&gt;~/.ssh/config&lt;/code&gt; 里记录的跳板目标与已可达密钥，确认攻击者是否借跳板机进一步移动。本例横向动作有限，但为保险仍按&amp;quot;已失陷&amp;quot;处置。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;解决方案&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;立即止血（清除）：&lt;/strong&gt; 从 &lt;code&gt;/root/.ssh/authorized_keys&lt;/code&gt; 中剔除所有陌生公钥，只保留配置管理系统（Ansible）下发的受控密钥；清理后 &lt;code&gt;chmod 600&lt;/code&gt; 并 &lt;code&gt;chattr +i&lt;/code&gt; 设为不可变，防止再次被追加。同时吊销并轮转所有从该跳板机可达的密钥与口令，强制离线重置 root 口令。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;重建信任（而非杀进程）：&lt;/strong&gt; 由于后门是&amp;quot;持久化+信任链污染&amp;quot;，简单 kill 会话没用——对方随时能再用那把公钥登回来。正确做法是将跳板机从网络隔离，用干净镜像或可信备份重建系统，重建后才重新接入。保留原始磁盘镜像与日志用于取证与上报。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;阻断入口：&lt;/strong&gt; 在堡垒机/防火墙层把 SSH 来源收敛为公司出口 IP + VPN 段，公网一律拒绝直达；给 fail2ban 增加规则——对短时间内出现多个陌生来源 &lt;code&gt;Accepted publickey&lt;/code&gt; 的情况做临时封禁与告警。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;取证留存：&lt;/strong&gt; 全程保留镜像、内存与日志副本，记录 IOC（可疑 IP、公钥指纹、下载脚本哈希），同步给安全团队做归因与威胁情报沉淀。&lt;/p&gt;&#xA;&lt;h2 id=&#34;根因分析&#34;&gt;&lt;a href=&#34;#%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;根因是&amp;quot;信任链被植入&amp;quot;。攻击者先通过开发机的恶意依赖/凭据泄漏取得跳板机初始访问权，再向 &lt;code&gt;authorized_keys&lt;/code&gt; 写入自有公钥，把&amp;quot;需要口令或受控私钥&amp;quot;的门槛，降为&amp;quot;持有另一把私钥即可&amp;quot;，形成免密持久化后门。它绕过了密码爆破检测，也比 XMRig 类挖矿更隐蔽——不占资源、不触发传统告警，只为长期保留一道安静的门。真正的破绽不是&amp;quot;登录成功&amp;quot;，而是&amp;quot;成功来源不该成功&amp;quot;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;预防措施&#34;&gt;&lt;a href=&#34;#%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;预防措施&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;收敛信任：&lt;/strong&gt; 禁止 root 直接 SSH，关闭 &lt;code&gt;PasswordAuthentication&lt;/code&gt;，仅允许受控密钥；&lt;code&gt;authorized_keys&lt;/code&gt; 只能由 Ansible 等配置管理写入，写完后 &lt;code&gt;chattr +i&lt;/code&gt; 设为不可变，并监控其哈希变化。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;来源白名单：&lt;/strong&gt; 跳板机 SSH 只允许公司出口 IP 与 VPN，公网拒绝；统一收口到堡垒机，杜绝主机直连。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;入侵检测：&lt;/strong&gt; 部署 &lt;code&gt;auditd&lt;/code&gt; 监控 &lt;code&gt;~/.ssh&lt;/code&gt; 目录写操作与 &lt;code&gt;sshd_config&lt;/code&gt; 变更；HIDS 对&amp;quot;新公钥落地&amp;quot;告警；日志集中到 SIEM，对&amp;quot;Accepted publickey 且来源非白名单&amp;quot;做实时规则。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;最小权限与隔离：&lt;/strong&gt; 跳板机不长期存放业务密钥，改用 Vault 等即时凭证；开发机与跳板机网络隔离，避免凭据跨域污染。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;供应链与凭据治理：&lt;/strong&gt; 内部 pip/npm 源做包完整性校验（哈希/签名），CI 凭据最小权限并定期轮换，从第一步掐断初始入侵链。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;这次事故最大的教训是：&lt;strong&gt;免密登录成功 ≠ 安全，反而可能是后门已落地的信号&lt;/strong&gt;。和显眼的挖矿木马不同，&lt;code&gt;authorized_keys&lt;/code&gt; 后门不消耗资源、不触发传统告警，只是安静地替攻击者保留一道门。排查的关键，是从&amp;quot;Accepted publickey 但来源可疑&amp;quot;这一反常切入，顺藤摸到被篡改的密钥文件与背后的初始入侵链。防御上，把信任收口到堡垒机 + 来源白名单 + 不可变密钥文件，远比事后清剿重要——门装好了，后门就无从落地。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
