Elasticsearch 如何配置 SSL 加密传输防止数据被窃听?

文章导读
生产环境中,防止 Elasticsearch 数据被窃听最可靠的做法是启用 HTTP 和传输层的双向 SSL 加密,并结合账号认证一起使用。
📋 目录
  1. 1. 确认版本与许可
  2. 2. 生成证书
  3. 3. 修改配置文件
  4. 4. 设置权限与密码
  5. 5. 验证是否生效
  6. 6. 客户端连接配置示例
  7. 7. 常见坑与安全建议
  8. 参考来源
A A

生产环境中,防止 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 历史中,生产环境建议通过环境变量或交互式输入传递密码。

Elasticsearch 如何配置 SSL 加密传输防止数据被窃听?
# 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.10

3. 修改配置文件

编辑 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.p12

4. 设置权限与密码

文件权限:证书文件包含私钥,必须限制访问权限。建议将证书所有者设为 elasticsearch 用户,并执行以下命令:

chmod 600 certs/*.p12

初始密码(8.x):8.x 版本首次启动会自动生成密码,如需重置 elastic 用户密码,使用以下命令:

bin/elasticsearch-reset-password -u elastic -i

安全建议:私钥文件泄露意味着加密失效,请定期备份证书文件并妥善保存 CA 密码,避免硬编码在脚本中。

Elasticsearch 如何配置 SSL 加密传输防止数据被窃听?

5. 验证是否生效

命令行测试:使用 curl 尝试 HTTP 请求,应被拒绝或重定向;使用 HTTPS 请求应成功:

# 明文请求应失败
curl http://localhost:9200

# 加密请求应成功(注:-k 仅用于测试自签名证书,生产脚本请导入 CA 证书)
curl -u elastic:<密码> -k https://localhost:9200

检查日志:查看 logs/elasticsearch.log,搜索 sslsecurity 关键字。如果没有握手失败或证书加载错误的报错,且能看到成功绑定的 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 并加载信任库。

Elasticsearch 如何配置 SSL 加密传输防止数据被窃听?

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