当前位置:首页 > 焦点

es漏洞检测工具

Elasticsearch 这玩意儿,漏洞用起来爽,检测出事的工具时候也真让人头疼。去年我帮一个朋友排查线上问题,漏洞他的检测 ES 集群突然查询变慢,日志里一堆 `circuit_breaking_exception`。工具折腾半天才发现,漏洞是检测一个没加限制的聚合查询把内存打爆了。这种事不是工具个例——ES 的灵活性是把双刃剑,稍不留神就踩坑。漏洞所以今天聊的检测不是“怎么用 ES”,而是工具“怎么在出事之前把坑找出来”。

先说个最基本的漏洞事实:ES 本身没有内置的漏洞扫描器。官方提供的检测 `elasticsearch-sql`、`_cat` API 能看状态,工具但不会告诉你“这个查询会 OOM”或者“那个索引映射有爆炸风险”。你得自己搭一套检测逻辑,或者用现成的工具。我试过几种,下面说点实在的。

从查询层开始查

最容易被忽略的是查询语句本身。比如 `terms` 聚合里嵌套 `date_histogram`,再套一层 `cardinality`,数据量大的时候直接让协调节点崩掉。检测工具得能解析 DSL,识别这种“高基数聚合嵌套”。我见过一个开源脚本,用 Python 遍历所有索引的 `_search` 请求日志,统计聚合深度和字段基数,超过阈值就报警。简单,但管用。

另一个坑是脚本查询。Painless 脚本写不好,循环里查 `_source`,CPU 直接拉满。检测工具可以扫描查询里的 `script` 字段,检查是否有 `for` 循环、`doc` 访问、或者 `params` 缺失。我自己的做法是:在 Kibana 的慢查询日志里加个正则,匹配 `script` 且执行时间超过 500ms 的请求,单独存一份。每周跑一次,能揪出不少隐藏问题。

索引映射和分片

映射爆炸是 ES 的经典死法。一个 `dynamic: true` 的索引,用户往里塞了带随机 key 的 JSON,字段数从几十涨到几万,集群状态直接变红。检测工具要能定期拉取 `_mapping`,统计字段总数和嵌套深度。超过 1000 个字段就标记为“高风险”。我见过一个团队用 Logstash 每天导数据,结果 mapping 里多了 2000 个 `field_xxx`,最后只能重建索引。

分片数也是。默认 5 个分片,但很多人不知道每个分片有 2GB 左右的建议上限。检测工具可以计算“索引总大小 / 分片数”,如果单个分片超过 30GB,查询延迟会明显上升。更隐蔽的是“小分片过多”——几百个 10MB 的分片,集群元数据压力巨大。我一般建议:单分片 10-50GB,总分片数不超过节点数的 20 倍。

权限和网络暴露

ES 默认没有认证。如果你在公网看到 `9200` 端口开着,那基本等于把数据裸奔。检测工具可以扫描 `_cat/indices` 是否无需认证就能访问,或者检查 `elasticsearch.yml` 里 `xpack.security.enabled` 是不是 `false`。我见过一个创业公司,ES 直接暴露在 AWS 公网 IP 上,索引里全是用户手机号。后来被勒索,数据全删了。

还有 `_scripts` 接口。如果允许任意脚本执行,攻击者能直接读文件。检测工具应该检查 `script.allowed_types` 和 `script.allowed_contexts` 的配置。默认是 `inline` 和 `search`,但很多老版本没限制。

实际怎么落地

别指望一个工具解决所有问题。我的组合是:
- 用 `esrally` 做基准测试,提前发现查询性能拐点;
- 用 `elasticsearch-exporter` 抓指标,配 Prometheus 告警;
- 自己写个 Python 脚本,每天扫一遍 mapping、分片、慢查询日志。
成本不高,但能挡住 80% 的常见事故。

最后说句主观的:ES 漏洞检测工具的核心不是“找 CVE”,而是“找配置和查询里的定时炸弹”。那些工具本身也可能误报,比如把正常的 `terms` 聚合当成风险。所以别全信工具,得结合业务数据量看。我见过一个检测脚本把 `cardinality` 聚合全标红,结果人家字段基数只有 50,纯属浪费告警。

工具是死的,集群是活的。定期 review,比啥都强。

分享到: