Elasticsearch 安全加固(security、TLS、角色、audit)
Elasticsearch难度: 高级耗时: 10 分钟(审计)– 2 小时(完整加固)不是安装或日常运维指南,而是对运行中的 Elasticsearch 集群进行安全加固的场景化 runbook。内容包括:只读安全审计、开启已关闭的 security 并启用 transport TLS(完整集群重启)、滚动切换到 HTTP TLS、DBA/应用角色、带有效期的 API key、应急 file realm 用户、让 elastic 退出日常使用、关闭 anonymous 访问、network.host 与 IP 过滤、audit logging(含许可证检查)、snapshot 仓库访问以及 Kibana service account token;最后重新执行审计,证明风险已消除。8.x/9.x 的 RPM/DEB 安装默认已开启 security 和 TLS:先做审计,只执行报告 RISK/WARNING 的场景。shard、磁盘和节点相关工作见运维指南,备份见 snapshot 指南。
架构: 1–12 个节点的 Elasticsearch 集群(+ Kibana)
场景
- 安全状态审计(只读) — 不做任何更改。以 OK / WARNING / RISK 报告:security 是否开启、未认证访问、HTTP/transport TLS、anonymous 访问、用户及 elastic 的使用情况、无有效期的 API key、audit logging、IP 过滤、监听地址和许可证状态。不知道从哪里开始时选择此项。
- 完整加固(按顺序全部执行) — 审计 → security + transport/HTTP TLS(如未开启;完整集群重启)→ 用户/角色/API key、关闭 anonymous、让 elastic 退出日常使用 → 网络与 IP 过滤 → audit logging(许可证允许时)→ snapshot 仓库访问 → Kibana 连接 → 最终审计。
- Security 未开启:开启安全功能和 transport TLS — xpack.security.enabled: false,或从 7.x 升级而来、可无认证访问的集群。生成证书,并在开启 transport TLS(以及可选的 HTTP TLS)的同时开启 security。需要完整集群重启(停机):节点之间带 TLS 和不带 TLS 的连接无法共存。
- 将 HTTP(REST)流量切换到 TLS — Security 已开启,但 9200 端口是明文 HTTP:密码可在网络上被读取。分发 HTTP 证书并逐个重启节点;客户端改用 https://。
- 用户、角色、API key;elastic 与 anonymous 访问 — 应用使用 elastic 超级用户连接、anonymous 访问已开启,或存在无有效期的 API key。为 DBA 和应用分别建立角色/用户,给应用使用带有效期的 API key,建立应急(file realm)用户;修改 elastic 的密码并让其退出日常使用。
- 开启 audit logging — 谁访问了哪个 index、失败的登录尝试、授权拒绝以及安全设置变更都必须记录下来。xpack.security.audit.enabled(静态设置,滚动重启)— 需要许可证(该步骤会检查许可证)。
- 网络访问与 IP 过滤 — 9200/9300 监听所有网卡或对所有人开放。将 network.host 收窄到内网 IP,通过防火墙和 Elasticsearch IP 过滤只允许节点、Kibana 和应用网络访问。
- 保护 snapshot 仓库访问 — snapshot 目录所有人可读、管理仓库的权限过宽,或云存储访问密钥写在 elasticsearch.yml 中。处理目录权限、snapshot 操作员角色、keystore,以及在第二个集群上以只读方式注册仓库。
- 保护 Kibana 连接 — Kibana 使用 elastic 用户或不加密连接,且密码以明文写在 kibana.yml 中。处理 service account token、CA 校验、keystore 和加密密钥。
开始之前
- 所有节点上有 root/sudo 权限;可从第一个节点 SSH 到其他节点(用于分发证书)。
- 集群状态为 green;不健康的集群上不执行滚动操作。
- 已安装 python3(解析 JSON)、openssl、unzip。
- 开启 security(transport TLS)需要完整集群重启:需要维护窗口和事先做好的 snapshot。
- 客户端清单(Kibana、Logstash、Beats、应用):开启 HTTP TLS 和身份认证后,每个客户端都必须改为 https + CA + 用户/API key。
- Audit logging 和 IP 过滤是付费许可证功能(Gold 及以上:Gold、Platinum、Enterprise 或 30 天 trial;新的 self-managed 订阅为 Platinum/Enterprise)。Basic 许可证下两者都不生效:设置会被接受,但不会产生审计记录,IP 过滤也不会阻止任何连接。查看许可证:GET _license。
指南阶段
- 准备:安全网与辅助工具 — 备份配置、keystore 和证书:… · 做一次 snapshot(推荐) · PyYAML 与工具:… · 配置文件权限:… · 把管理员凭据写入 netrc 文件
- 状态审计(只读) — 安全报告:… · 把发现项对应到场景
- 开启 security:诊断与证书 — 诊断:security 真的关闭了吗? · 生成 CA 和节点证书 · 把证书分发到各节点 · 证书权限:… · elasticsearch.yml:security 与 TLS 设置:… · 停止 shard 分配并执行 flush
- 开启 security:完整集群重启 — 停止:… · 启动:… · 设置 elastic 密码 · 把管理员凭据写入 netrc 文件(elastic) · 重新开启 shard 分配并等待集群健康 · kibana_system 密码 …
- HTTP TLS:证书 — 当前状态 · 生成 HTTP 证书 · 分发并设置权限:…
- 用户、角色与 API key — 现有用户、角色和 API key · DBA 管理用户(…) · 应急用户(file realm):… · 应用角色与用户(…) · 为应用创建带有效期的 API key · 验证最小权限(…) …
- 网络访问与 IP 过滤 — 防火墙:… · network.host 是否为内网 IP:… · Elasticsearch IP 过滤
- Audit logging:许可证与设置 — 许可证是否支持 audit logging?
- Audit logging:事件选择与验证 — 记录哪些事件 · 是否产生审计记录:…
- Snapshot 仓库访问 — Snapshot 目录权限:… · 仓库列表、云存储密钥和 snapshot 操作员角色
- Kibana 连接 — Kibana service account token · kibana.yml 与 keystore · 验证 Kibana 连接
- 最终审计(加固之后) — 安全报告:…(最终状态)
- 清理与后续工作 — 删除临时凭据文件:… · 后续工作