Elasticsearch 安全通信配置(SSL/TLS)

  • A+
所属分类:系统文档

随着网络安全威胁的日益增长,确保数据在传输过程中的安全性变得至关重要。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
  • 1

该命令会生成一个 CA 证书文件(例如 elastic-stack-ca.p12),该文件将用于签发集群节点和客户端的证书。

1.2 生成节点证书

接下来,为 Elasticsearch 节点生成证书:

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
  • 1

该命令会生成一个 .p12 文件,包含节点的公钥和私钥以及 CA 证书。你可以为每个节点生成单独的证书,也可以为多个节点生成共享证书。

1.3 生成自签名证书

如果不使用 CA,可以直接生成自签名证书:

bin/elasticsearch-certutil cert --self-signed
  • 1

这种方式适用于小型集群或测试环境,但生产环境中推荐使用 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"
  • 1
  • 2
  • 3
  • 4
  • 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"
  • 1
  • 2
  • 3
  • 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
  • 1
  • 2
  • 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
  • 1
  • 2
  • 3

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"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 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"]
  • 1
  • 2
  • 3

通过这些配置,Beats 工具将在传输过程中保护数据安全。

6. 测试和验证配置

配置完成后,需要验证 SSL/TLS 是否正确工作。你可以通过以下步骤进行测试:

  1. 检查 Elasticsearch 启动日志:启动 Elasticsearch 时,检查日志中是否有任何与 SSL/TLS 相关的错误信息。

  2. 使用 HTTPS 访问 Elasticsearch:在浏览器或命令行工具(如 Curl)中使用 HTTPS 访问 Elasticsearch 的 REST API,确保返回正确的响应。

    curl -u elastic:password --cacert /path/to/elastic-stack-ca.crt https://your-es-host:9200
    
    • 1
  3. 验证节点间通信:确保集群中的所有节点都可以正常通信,检查分片分配和集群状态是否正常。

7. 常见问题排查

  • 证书错误:如果证书配置不正确,Elasticsearch 或客户端可能会拒绝连接。确保证书路径、密钥和权限设置正确。

  • 验证模式错误:如果使用自签名证书或证书中的主机名与实际不匹配,可能需要调整 verification_mode 设置,或生成新的证书。

  • TLS 版本不兼容:确保 Elasticsearch 和客户端支持相同的 TLS 版本。可以通过配置 xpack.security.transport.ssl.supported_protocols 来指定支持的 TLS 版本。

总结

为 Elasticsearch 配置 SSL/TLS 是确保数据传输安全的关键步骤。通过配置传输层和 HTTP 层的加密,可以有效防止数据在网络传输过程中被窃听或篡改。配置过程中,生成和管理证书、正确配置节点和客户端的通信设置,以及定期验证和测试安全配置,都是保障集群安全运行的重要环节。

在生产环境中,强烈建议启用 SSL/TLS 加密,并结合其他安全措施,如用户认证和授权、审计日志等,全面保护 Elasticsearch 集群的数据安全。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin