<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>未授权访问 on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE/</link>
        <description>Recent content in 未授权访问 on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 29 Jul 2026 07:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>堵住裸奔的 Elasticsearch：一次公网未授权访问导致数据泄露的应急处置实录</title>
            <link>https://blog.5772447.xyz/posts/7480195f/</link>
            <pubDate>Wed, 29 Jul 2026 07:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/7480195f/</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;公司内部有一套日志与业务数据检索平台，底层是三节点的 Elasticsearch 7.x 集群，跑在云上的三台 CVM 上，存放了近半年的订单流水日志和部分脱敏不彻底的客户信息，约 4 亿条文档。集群最初由业务组自建，图省事没有开启 X-Pack Security，也就是说——&lt;strong&gt;没有任何认证&lt;/strong&gt;，谁能连上 9200 端口，谁就是集群管理员。&lt;/p&gt;&#xA;&lt;p&gt;一直以来大家的心理防线是&amp;quot;反正在内网，安全组挡着&amp;quot;。直到某次业务临时联调，有同事为了让驻场外包在家里访问 Kibana，在云安全组上开了一条 &lt;code&gt;0.0.0.0/0 → 9200-9300&lt;/code&gt; 的放行规则，联调结束后没人记得收回去。这条规则安静地躺了二十多天。&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;周一早上 08:40，业务群里陆续有人反馈&amp;quot;检索平台查不到历史数据&amp;quot;。登录 Kibana 一看，情况比&amp;quot;查不到&amp;quot;严重得多：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;原有的 &lt;code&gt;order-log-*&lt;/code&gt;、&lt;code&gt;customer-*&lt;/code&gt; 等几十个索引&lt;strong&gt;全部消失&lt;/strong&gt;；&lt;/li&gt;&#xA;&lt;li&gt;集群里只剩下一个陌生索引，名字叫 &lt;code&gt;read_me_to_recover&lt;/code&gt;，里面只有一条文档，内容是一段英文勒索信：数据已被&amp;quot;备份&amp;quot;，向指定比特币地址支付 0.05 BTC 可赎回，否则数据将被公开出售；&lt;/li&gt;&#xA;&lt;li&gt;集群健康状态是 green——对 ES 来说删库是一次再正常不过的合法操作，它毫无怨言地执行了；&lt;/li&gt;&#xA;&lt;li&gt;监控侧回看，凌晨 03:00 前后集群写入 QPS 有一波异常尖峰，随后存储用量从 1.8 TB 断崖式跌到不足 1 GB。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这是典型的 &lt;strong&gt;Meow 攻击 / ES 勒索擦除&lt;/strong&gt;套路：全自动扫描 + 删库 + 留勒索信，大概率根本不存在所谓&amp;quot;备份&amp;quot;。&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;**第一步：确认攻击入口。**先查这台机器的 9200 是否真的暴露在公网。在外部网络直接测试：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -s http://&amp;lt;公网IP&amp;gt;:9200/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 直接返回了集群名、版本号——未授权访问坐实&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;再翻云安全组规则，找到了那条 &lt;code&gt;0.0.0.0/0&lt;/code&gt; 放行 9200-9300 的规则，创建时间正好在二十多天前，备注写着&amp;quot;临时联调&amp;quot;。入口确认。&lt;/p&gt;&#xA;&lt;p&gt;**第二步：还原攻击时间线。**ES 本身默认不记审计日志，但还有两个地方可以挖：&lt;/p&gt;&#xA;&lt;p&gt;一是 ES 的慢日志和 GC 日志间接佐证了凌晨 03:00 前后有异常批量操作；二是云平台的 VPC 流日志（Flow Log）幸好开着，按目的端口 9200 过滤，抓到了关键证据：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;03:02:11  45.155.x.x  -&amp;gt;  10.0.3.21:9200  ACCEPT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;03:02:38  45.155.x.x  -&amp;gt;  10.0.3.21:9200  ACCEPT  (持续大量会话)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;03:11:47  45.155.x.x  -&amp;gt;  10.0.3.21:9200  ACCEPT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;来源 IP 属于境外某扫段大户，威胁情报平台上有大量&amp;quot;ES/MongoDB 勒索擦除&amp;quot;的历史标记。会话总时长约 10 分钟——&lt;strong&gt;4 亿条数据被&amp;quot;拖走&amp;quot;是不可能的，10 分钟只够发几条 &lt;code&gt;DELETE /_all&lt;/code&gt; 级别的请求&lt;/strong&gt;。这基本可以判断：数据是被直接删除而非被完整窃取，勒索信是吓唬人的标准话术。&lt;/p&gt;&#xA;&lt;p&gt;**第三步：评估泄露面。**虽然全量拖库不成立，但无法排除攻击者在删库前用 &lt;code&gt;_search&lt;/code&gt; 抽样翻看过数据，且这二十多天里可能不止一波扫描器光顾过。用流日志把窗口期内所有命中 9200 的外部源 IP 拉了个清单，共 17 个不同来源，多数是 Shodan/Censys 类测绘平台的探测节点，有 3 个可疑 IP 存在多次交互会话。结论按最坏情况上报：&lt;strong&gt;存在部分数据被抽样读取的可能，客户信息字段涉及姓名和手机号中段&lt;/strong&gt;，触发内部数据安全事件流程。&lt;/p&gt;&#xA;&lt;p&gt;**第四步：检查主机层是否失陷。**ES 未授权访问在老版本上还能配合脚本引擎做 RCE，必须排除主机被种马：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;crontab -l; ls -la /var/spool/cron/          &lt;span style=&#34;color:#75715e&#34;&gt;# 无异常条目&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat ~/.ssh/authorized_keys                    &lt;span style=&#34;color:#75715e&#34;&gt;# 无陌生公钥&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ps aux --sort&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;-%cpu | head                    &lt;span style=&#34;color:#75715e&#34;&gt;# 无异常进程&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -la /tmp /var/tmp                          &lt;span style=&#34;color:#75715e&#34;&gt;# 无可疑落地文件&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;last -20                                      &lt;span style=&#34;color:#75715e&#34;&gt;# 无异常登录&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;三台节点逐一检查，均无持久化痕迹。7.x 已移除危险的动态脚本能力，本次攻击停留在&amp;quot;数据层删库&amp;quot;，主机层干净。&lt;/p&gt;&#xA;&lt;p&gt;**第五步：确认恢复手段。**集群没做 snapshot 仓库（又一个欠账），万幸数据源头还在：订单日志的上游 Kafka 保留了 7 天，更早的数据在数仓 Hive 里有 T+1 落盘副本。数据可以重建，只是要花时间。&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;按&amp;quot;先止血、再恢复、后加固&amp;quot;的顺序处置：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;止血&lt;/strong&gt;：立即删除安全组中 &lt;code&gt;0.0.0.0/0 → 9200-9300&lt;/code&gt; 规则，恢复为仅允许内网业务网段访问；同时在三台节点的 &lt;code&gt;elasticsearch.yml&lt;/code&gt; 确认 &lt;code&gt;network.host&lt;/code&gt; 绑定内网地址；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;取证留存&lt;/strong&gt;：勒索索引导出存档，流日志窗口期数据打包，供安全团队与合规上报使用；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;开启认证&lt;/strong&gt;：启用 X-Pack Security（7.x 基础版免费），配置 &lt;code&gt;elastic&lt;/code&gt; 超管强密码，为 Kibana、Logstash、业务应用分别创建最小权限角色，杜绝匿名访问；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;数据重建&lt;/strong&gt;：近 7 天数据从 Kafka 重放消费重建索引；更早数据从 Hive 批量导回，历时约 30 小时全部恢复；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;补快照&lt;/strong&gt;：挂载对象存储作为 snapshot 仓库，配置 SLM 策略每日自动快照、保留 30 天。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;外包远程联调的合理需求，改用公司 VPN + 堡垒机方案满足，不再直接对公网开数据端口。&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;strong&gt;ES 集群零认证&lt;/strong&gt;（第一层没有）、&lt;strong&gt;安全组变更无审批无回收机制&lt;/strong&gt;（第二层靠自觉）、&lt;strong&gt;无暴露面持续监测&lt;/strong&gt;（第三层不存在，裸奔二十多天无人知晓）。任何一层存在，这次事件都不会发生。数据组件&amp;quot;默认无密码 + 默认监听&amp;quot;的组合，在公网上的平均存活时间以小时计，Meow 类全自动脚本不会给任何侥幸窗口。&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;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;暴露面持续监测&lt;/strong&gt;：用定时任务从外部视角对公司全部公网 IP 做端口扫描（nmap 关键数据端口 9200/27017/6379/3306 等），结果与白名单比对，新增暴露即告警；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;安全组变更管控&lt;/strong&gt;：&lt;code&gt;0.0.0.0/0&lt;/code&gt; 类规则必须走审批，并强制填写过期时间，到期自动回收；云平台配置审计（Config）对全放行规则设置合规基线告警；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;数据组件强制认证基线&lt;/strong&gt;：ES/Redis/MongoDB 等组件上线检查清单中，认证与内网绑定为必检项，零认证实例不允许接入生产 VPC；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;备份底线&lt;/strong&gt;：所有有状态服务必须有独立于集群本身的备份（快照 + 异地），并定期做恢复演练；&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;联调场景标准化&lt;/strong&gt;：外部人员访问一律走 VPN + 堡垒机，禁止以开安全组的方式&amp;quot;给个方便&amp;quot;。&lt;/li&gt;&#xA;&lt;/ol&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;这次事件损失可控纯属运气好：攻击者是删库勒索的脚本流，而非有耐心的拖库者；上游 Kafka 和数仓恰好能重建数据。复盘时最让人后怕的不是攻击本身，而是那条放行规则安静躺了二十多天没有任何机制能发现它。安全上最贵的不是防火墙和设备，而是&amp;quot;临时&amp;quot;两个字——所有临时的放行、临时的免密、临时的绕过，只要没有强制回收机制，最终都会变成永久的洞。数据端口不上公网、组件必须带认证、备份独立于集群，这三条底线缺一不可。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
