生产环境中,防止 Elasticsearch 数据被窃听最可靠的做法是启用 HTTP 和传输层的双向 SSL 加密,并结合账号认证一起使用。
先说结论:配置 SSL 是保护 ES 通信安全的基础步骤,但必须配合正确的证书管理和版本特性设置。
- 先判断:确认 Elasticsearch 版本,8.0 及以上默认开启安全配置,7.x 及以下需手动启用。
- 优先做:使用官方自带的 certutil 工具生成 CA 和节点证书,避免自行构建导致的兼容问题。
- 再验证:配置完成后必须通过 HTTPS 请求测试,并检查日志确认无 SSL 握手错误。
1. 确认版本与许可
登录服务器查看版本。Elasticsearch 8.0 开始,基础安全功能(包括 SSL)默认启用。如果是 7.x 版本,需要在 elasticsearch.yml 中显式开启 xpack.security.enabled: true。基础版 License 已支持 SSL 加密,无需额外购买。
2. 生成证书
使用 ES 自带的 elasticsearch-certutil 工具。首先生成 CA 根证书,然后基于 CA 生成节点证书。生成时需指定节点的 IP 或域名,确保证书的 SAN(使用者备用名称)字段包含实际访问地址,否则客户端会报错。
注意:命令行传递密码可能会留在 shell 历史中,生产环境建议通过环境变量或交互式输入传递密码。
# 1. 生成 CA 证书
bin/elasticsearch-certutil ca
# 2. 生成节点证书(假设 IP 为 192.168.1.10)
# 注意:参数前后不要加反引号,密码建议通过交互输入避免泄露
bin/elasticsearch-certutil cert `--ca` elastic-stack-ca.p12 `--ca-pass` <密码> `--ip` 192.168.1.103. 修改配置文件
编辑 config/elasticsearch.yml。8.x 版本通常自动生成配置,如需手动指定或适配 7.x,参考以下配置:
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/http.p12
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/transport.p12
xpack.security.transport.ssl.truststore.path: certs/transport.p124. 设置权限与密码
文件权限:证书文件包含私钥,必须限制访问权限。建议将证书所有者设为 elasticsearch 用户,并执行以下命令:
chmod 600 certs/*.p12初始密码(8.x):8.x 版本首次启动会自动生成密码,如需重置 elastic 用户密码,使用以下命令:
bin/elasticsearch-reset-password -u elastic -i安全建议:私钥文件泄露意味着加密失效,请定期备份证书文件并妥善保存 CA 密码,避免硬编码在脚本中。
5. 验证是否生效
命令行测试:使用 curl 尝试 HTTP 请求,应被拒绝或重定向;使用 HTTPS 请求应成功:
# 明文请求应失败
curl http://localhost:9200
# 加密请求应成功(注:-k 仅用于测试自签名证书,生产脚本请导入 CA 证书)
curl -u elastic:<密码> -k https://localhost:9200检查日志:查看 logs/elasticsearch.log,搜索 ssl 或 security 关键字。如果没有握手失败或证书加载错误的报错,且能看到成功绑定的 HTTPS 端口日志,说明配置正常。
6. 客户端连接配置示例
开启 SSL 后,客户端需适配 HTTPS 并信任 CA 证书。以下是 Logstash 输出配置示例:
output {
elasticsearch {
hosts => ["https://localhost:9200"]
user => "elastic"
password => "<密码>"
ssl => true
ssl_certificate_verification => true
cacert => "/path/to/ca.crt"
}
}Java 客户端需在构建 RestClient 时配置 SSLContext 并加载信任库。
7. 常见坑与安全建议
1. 证书主题不匹配:生成证书时指定的 IP 或域名与实际访问地址不一致,会导致客户端报错“主机名验证失败”。确保 `--ip` 或 `--dns` 参数覆盖所有访问入口。
2. 传输层加密被忽略:只配置了 HTTP 层 SSL 而忽略传输层(transport.ssl),会导致节点间通信明文传输。在集群模式下,必须同时启用传输层加密。
3. 客户端未适配:开启 SSL 后,所有旧的业务代码或监控脚本如果仍使用 HTTP 协议连接,会立即中断。需同步更新所有客户端配置,导入 CA 证书或关闭证书验证(仅限测试)。
4. 生产环境慎用 -k:curl 命令中的 -k 参数会忽略证书验证,仅适用于调试。生产环境脚本必须导入 CA 证书并启用验证,防止中间人攻击。
参考来源
- Elastic Official Documentation, "Secure communication in Elasticsearch", https://www.elastic.co/guide/en/elasticsearch/reference/current/security-communication.html
- Elastic Official Documentation, "Configuring SSL/TLS on the HTTP layer", https://www.elastic.co/guide/en/elasticsearch/reference/current/security-http.html