ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Elasticsearch集群SSL/TLS加密配置与最佳实践

Elasticsearch集群SSL/TLS加密配置与最佳实践

1. Elasticsearch集群SSL/TLS加密认证的必要性

在分布式搜索和大数据分析场景中,Elasticsearch集群节点间的通信安全至关重要。我曾亲眼见过一个客户的生产集群因为未启用加密传输,导致敏感数据在传输过程中被恶意截获。SSL/TLS加密认证不仅能防止"中间人攻击",还能实现节点间的双向身份验证,这是构建企业级安全架构的基础门槛。

从Elasticsearch 8.0开始,官方已经强制开启安全功能,但很多企业仍在使用7.x甚至6.x版本。在这些版本中,默认配置是不启用加密的——这意味着你的集群数据就像在裸奔。我最近帮一家金融客户做安全审计时,发现他们三个数据中心的集群间通信居然全是明文的,运维人员还振振有词地说"在内网很安全"。这种认知误区实在太危险了!

2. 证书体系设计与CA创建

2.1 证书类型选择

在给Elasticsearch集群配置SSL时,我们需要三种证书:

  • CA证书(集群信任的根证书)
  • 节点证书(各节点的身份凭证)
  • 客户端证书(Kibana、Logstash等组件的接入凭证)

我强烈建议使用自签名CA证书而不是公共CA。为什么?因为公共CA签发的证书有有效期限制,而自签名CA可以完全控制证书生命周期。上周我就遇到一个使用Let's Encrypt证书的集群突然瘫痪——证书过期了却没人记得更新。

2.2 使用elasticsearch-certutil工具

Elasticsearch自带的certutil工具是生成证书的最佳选择。相比OpenSSL,它专为ES设计,能自动生成符合要求的证书链。下面是我在CentOS 7上生成CA证书的实际操作:

# 进入ES安装目录 cd /usr/share/elasticsearch # 生成CA证书(有效期10年) bin/elasticsearch-certutil ca --days 3650 --out config/elastic-stack-ca.p12 # 生成节点证书(包含所有可能的主机名和IP) bin/elasticsearch-certutil cert --ca config/elastic-stack-ca.p12 \ --ip "192.168.1.10,192.168.1.11,10.0.0.10" \ --dns "es-node1,es-node2,es-master,localhost" \ --out config/elastic-nodes.p12

重要提示:务必在证书中包含所有可能访问集群的IP和域名,包括VIP和负载均衡器地址。我见过太多因为漏配某个IP导致节点无法加入集群的案例。

3. 集群节点SSL配置详解

3.1 配置文件关键参数

在elasticsearch.yml中,这些配置项决定SSL行为:

xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: elastic-nodes.p12 xpack.security.transport.ssl.truststore.path: elastic-nodes.p12 # 对于HTTP接口的加密(Kibana访问用) xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: elastic-nodes.p12

参数verification_mode有三个级别:

  • none:危险!相当于不验证证书
  • certificate:验证证书有效性(推荐)
  • full:严格验证证书和主机名(适合生产)

3.2 证书存储格式处理

Elasticsearch支持PKCS#12(.p12)和JKS两种格式。我推荐使用.p12格式,因为它:

  1. 可以包含完整的证书链
  2. 比JKS更通用的行业标准
  3. 单个文件包含私钥和证书

如果已有其他格式证书,可以用OpenSSL转换:

# 将PEM转换为PKCS12 openssl pkcs12 -export -in cert.pem -inkey key.pem -out elastic-cert.p12

4. 客户端与组件集成

4.1 Kibana配置要点

Kibana的kibana.yml需要对应配置:

elasticsearch.hosts: ["https://es-node1:9200"] elasticsearch.ssl.certificateAuthorities: ["/path/to/ca.crt"] elasticsearch.ssl.verificationMode: certificate

常见坑点:

  • Kibana服务器时钟必须与ES集群同步(证书验证依赖时间)
  • 浏览器访问Kibana时可能需要导入CA证书(否则会报SSL错误)

4.2 Logstash输出插件配置

在Logstash的output配置中:

output { elasticsearch { hosts => ["https://es-node1:9200"] ssl => true cacert => "/path/to/ca.crt" user => "logstash_user" password => "your_password" } }

5. 生产环境最佳实践

5.1 证书轮换策略

证书到期前30天就应该开始轮换,我的标准操作流程是:

  1. 用原CA签发新证书(保持相同DN)
  2. 逐个节点滚动重启加载新证书
  3. 验证所有节点通信正常
  4. 更新客户端配置

血泪教训:千万不要等证书过期才处理!去年某电商大促期间证书过期,导致集群不可用,损失惨重。

5.2 性能调优建议

启用SSL后性能损耗约8-15%,可以通过以下方式优化:

  • 使用ECDSA证书代替RSA(更快的握手速度)
  • 启用TLS会话恢复(session resumption)
  • 调整JVM的TLS参数:
-Djdk.tls.ephemeralDHKeySize=2048 -Djdk.tls.rejectClientInitiatedRenegotiation=true

6. 故障排查手册

6.1 常见错误与解决方案

错误信息原因分析解决方案
SSLHandshakeException: No available authentication scheme证书与配置不匹配检查keystore密码是否正确
CertificateException: No name matching localhost found主机名验证失败在证书SAN中添加对应主机名
SSLException: Unrecognized SSL message协议版本不匹配在配置中明确指定TLSv1.2

6.2 诊断工具推荐

  1. OpenSSL命令行测试:
openssl s_client -connect es-node1:9200 -showcerts
  1. 使用ES的_ssl API检查配置:
curl -XGET "https://localhost:9200/_ssl/certificates?pretty" \ --cacert /path/to/ca.crt -u elastic:password
  1. 网络抓包分析(慎用):
tcpdump -i any -s 0 port 9300 -w es_ssl.pcap

最后分享一个真实案例:某客户配置完SSL后部分节点频繁断开连接。最终发现是防火墙丢弃了TLS会话恢复的票证(ticket)。通过禁用会话票证(设置-Djdk.tls.server.enableSessionTicketExtension=false)解决了问题。这提醒我们:SSL问题不一定是证书配置错误,还可能是底层网络设备的影响。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进