随着网络安全威胁的日益增长,确保数据在传输过程中的安全性变得至关重要。Elasticsearch 作为一种分布式搜索和分析引擎,通常需要在不同节点之间传递数据,也需要与外部客户端进行通信。为了防止数据在传输过程中被窃取或篡改,必须为 Elasticsearch 配置安全通信机制。SSL/TLS(安全套接层/传输层安全协议)是实现安全通信的标准方法。本文将详细介绍如何为 Elasticsearch 配置 SSL/TLS,以确保集群节点之间和客户端与服务器之间的通信安全。
9.3 安全通信配置(SSL/TLS)
Elasticsearch 提供了内置的 SSL/TLS 支持,通过配置传输层和 HTTP 层的加密,可以确保集群内部和外部通信的安全性。SSL/TLS 的配置涉及证书的生成和管理、配置文件的修改,以及客户端的配置。
1. 生成证书
配置 SSL/TLS 的第一步是生成和管理证书。Elasticsearch 提供了一个简单的工具 elasticsearch-certutil
,可以用来生成证书。通常,我们需要生成一个证书颁发机构(CA)证书,并基于此 CA 签发节点证书。
1.1 生成 CA 证书
首先,使用 elasticsearch-certutil
生成 CA 证书:
bin/elasticsearch-certutil ca
该命令会生成一个 CA 证书文件(例如 elastic-stack-ca.p12
),该文件将用于签发集群节点和客户端的证书。
1.2 生成节点证书
接下来,为 Elasticsearch 节点生成证书:
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
该命令会生成一个 .p12
文件,包含节点的公钥和私钥以及 CA 证书。你可以为每个节点生成单独的证书,也可以为多个节点生成共享证书。
1.3 生成自签名证书
如果不使用 CA,可以直接生成自签名证书:
bin/elasticsearch-certutil cert --self-signed
这种方式适用于小型集群或测试环境,但生产环境中推荐使用 CA 签发的证书。
2. 配置 Elasticsearch 传输层加密
传输层加密用于保护 Elasticsearch 节点之间的通信。通过配置传输层加密,可以确保集群内部的数据传输不被窃听或篡改。
2.1 配置节点之间的 SSL/TLS
在 Elasticsearch 配置文件 elasticsearch.yml
中,为传输层启用 SSL/TLS:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: "/path/to/elastic-certificates.p12"
xpack.security.transport.ssl.truststore.path: "/path/to/elastic-certificates.p12"
xpack.security.transport.ssl.enabled
: 启用节点之间的 SSL/TLS 加密。xpack.security.transport.ssl.verification_mode
: 设置证书验证模式。certificate
表示仅验证证书,full
表示验证证书和主机名。xpack.security.transport.ssl.keystore.path
: 指定包含节点证书和私钥的密钥库路径。xpack.security.transport.ssl.truststore.path
: 指定包含 CA 证书的信任库路径。
2.2 配置证书验证
可以根据集群的需求调整证书验证的严格程度。常见的选项包括:
none
: 不验证证书。certificate
: 验证证书的有效性,但不验证主机名。full
: 验证证书和主机名,确保通信安全。
在生产环境中,推荐使用 full
模式,以确保集群安全。
3. 配置 Elasticsearch HTTP 层加密
HTTP 层加密用于保护 Elasticsearch 与外部客户端(如 Kibana、Logstash)之间的通信。通过为 HTTP 层配置 SSL/TLS,可以确保用户数据和查询请求在传输过程中不被窃取或篡改。
3.1 启用 HTTP SSL/TLS
在 elasticsearch.yml
中配置 HTTP 层的 SSL/TLS:
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: "/path/to/elastic-certificates.p12"
xpack.security.http.ssl.truststore.path: "/path/to/elastic-certificates.p12"
xpack.security.http.ssl.enabled
: 启用 HTTP 层的 SSL/TLS 加密。xpack.security.http.ssl.keystore.path
: 指定包含节点证书和私钥的密钥库路径。xpack.security.http.ssl.truststore.path
: 指定包含 CA 证书的信任库路径。
通过这些配置,Elasticsearch 的 HTTP API 将通过 HTTPS 提供服务,确保客户端与集群之间的通信安全。
4. 配置 Kibana 与 Elasticsearch 的 SSL/TLS
如果你的 Elasticsearch 集群启用了 HTTPS,则 Kibana 也需要配置为通过 HTTPS 连接 Elasticsearch。
在 kibana.yml
中进行以下配置:
elasticsearch.ssl.certificateAuthorities: [ "/path/to/elastic-stack-ca.crt" ]
elasticsearch.ssl.verificationMode: full
elasticsearch.ssl.certificateAuthorities
: 指定 CA 证书路径,用于验证 Elasticsearch 服务器的证书。elasticsearch.ssl.verificationMode
: 设置为full
,以确保 Kibana 验证服务器证书和主机名。
如果 Kibana 也需要通过 HTTPS 访问(例如为了安全登录),可以启用 Kibana 的 HTTPS 支持:
server.ssl.enabled: true
server.ssl.certificate: /path/to/kibana-cert.crt
server.ssl.key: /path/to/kibana-key.key
5. 配置客户端与 Elasticsearch 的 SSL/TLS
对于通过 HTTP API 与 Elasticsearch 交互的客户端(如 Logstash、Beats、Curl 等),也需要配置 SSL/TLS 以确保安全通信。
5.1 配置 Logstash
如果使用 Logstash 将数据发送到启用了 SSL/TLS 的 Elasticsearch 集群,可以在 Logstash 的配置文件中添加以下内容:
output {
elasticsearch {
hosts => ["https://your-es-host:9200"]
ssl => true
cacert => "/path/to/elastic-stack-ca.crt"
}
}
ssl
: 启用 SSL/TLS 连接。cacert
: 指定 CA 证书路径,用于验证 Elasticsearch 服务器的证书。
5.2 配置 Beats
如果使用 Filebeat、Metricbeat 等工具来收集数据并发送到 Elasticsearch,同样需要启用 SSL/TLS:
output.elasticsearch:
hosts: ["https://your-es-host:9200"]
ssl.certificate_authorities: ["/path/to/elastic-stack-ca.crt"]
通过这些配置,Beats 工具将在传输过程中保护数据安全。
6. 测试和验证配置
配置完成后,需要验证 SSL/TLS 是否正确工作。你可以通过以下步骤进行测试:
-
检查 Elasticsearch 启动日志:启动 Elasticsearch 时,检查日志中是否有任何与 SSL/TLS 相关的错误信息。
-
使用 HTTPS 访问 Elasticsearch:在浏览器或命令行工具(如 Curl)中使用 HTTPS 访问 Elasticsearch 的 REST API,确保返回正确的响应。
curl -u elastic:password --cacert /path/to/elastic-stack-ca.crt https://your-es-host:9200
-
验证节点间通信:确保集群中的所有节点都可以正常通信,检查分片分配和集群状态是否正常。
7. 常见问题排查
-
证书错误:如果证书配置不正确,Elasticsearch 或客户端可能会拒绝连接。确保证书路径、密钥和权限设置正确。
-
验证模式错误:如果使用自签名证书或证书中的主机名与实际不匹配,可能需要调整
verification_mode
设置,或生成新的证书。 -
TLS 版本不兼容:确保 Elasticsearch 和客户端支持相同的 TLS 版本。可以通过配置
xpack.security.transport.ssl.supported_protocols
来指定支持的 TLS 版本。
总结
为 Elasticsearch 配置 SSL/TLS 是确保数据传输安全的关键步骤。通过配置传输层和 HTTP 层的加密,可以有效防止数据在网络传输过程中被窃听或篡改。配置过程中,生成和管理证书、正确配置节点和客户端的通信设置,以及定期验证和测试安全配置,都是保障集群安全运行的重要环节。
在生产环境中,强烈建议启用 SSL/TLS 加密,并结合其他安全措施,如用户认证和授权、审计日志等,全面保护 Elasticsearch 集群的数据安全。