Elasticsearch 集群加密通讯

目录:

[TOC]

加密通讯

1. 在集群上设置 TLS

加密集群内部节点之间的,和集群与外部的通信,使其更加安全。

在集群中的每个节点上执行以下步骤:

在 Elasticsearch 配置文件中设置xpack.security.enabled: true。有关更多信息,请参阅安全性设置

1.1 为每个节点生成私钥和 X.509 证书

Elasticsearch 程序中提供elasticsearch-certutil命令来简化生成证书的过程。

该命令共有 3 种模式:

  • CA 模式,用于生成一个新的证书颁发机构。
  • CERT 模式,用于生成 X.509 证书和私钥。
  • CSR 模式,用于生成证书签名请求,该请求指向受信任的证书颁发机构以获取签名的证书。签名证书必须为 PEM 或 PKCS#12 格式,才能与 Elasticsearch 安全功能一起使用。

该命令详细介绍,请查看:elasticsearch-certutil

  • 第一步:创建证书颁发机构

    使用elasticsearch-certutil命令的ca模式,创建证书颁发机构(certificate authority)。该证书是为节点证书做签发的,不必每次都创建,只要在有效期内,都可以使用。如果到期了,需要更换已签发的全部节点证书。

    1. # 进入 config 目录
    2. [yuchen@node01 ~]$ cd /opt/elasticsearch-7.5.2/config/
    3. # 创建 certs 目录,用于保存证书。
    4. [yuchen@node01 config]$ mkdir ./certs
    5. # 进入 bin 目录
    6. [yuchen@node01 config]$ cd ../bin/
    7. # 创建 CA 证书颁发机构
    8. [yuchen@node01 bin]$ ./elasticsearch-certutil ca --pass [password] --out config/certs/[name]-ca.p12 --days 3650 --ca-dn CN="[Distinguished Name]"

    参数说明:

    • ca :默认以 PKCS#12 格式生成证书和密钥。如需以 PEM 格式,需指定 --pem 参数。
    • --pass <password> :指定生成的私钥的密码。也就是使用证书时需要提供的密码。
    • --out <file_path> :指定输出文件的路径。相对程序根目录而言,例如程序根目录 /opt/elasticsearch/ ,全路径就是 /opt/elasticsearch/config/certs/[name]-ca.p12
    • --days <n> :指定一个整数值,该值表示生成的证书有效的天数。默认值为 1095 。
    • --ca-dn <name> :定义用于生成的 CA 证书的专有名称(DN)。默认值为 CN="Elastic Certificate Tool Autogenerated CA"
  • 第二步:生成节点证书和密钥

    使用elasticsearch-certutil命令的cert模式,生成 X.509 证书和私钥。使用上面刚刚生成的 CA 证书进行签名。

    签发 1 个证书和密钥:

    1. [yuchen@node01 bin]$ ./elasticsearch-certutil cert --ca config/certs/[CA 证书名称].p12 --ca-pass [CA 证书密码] --out config/certs/node-01.p12 --name node-01 --pass "" --days 3650 --ip 192.168.1.198

    批量签发节点证书命令:

    1. [yuchen@node01 bin]$ ./elasticsearch-certutil cert --ca [CA 证书] --ca-pass [CA 证书密码] --in config/certs/instances.yml --out config/certs/instances.zip --pass "" --days 3650

    批量与单个签发的不同,在于引入了instances.ymlYAML 文件,文件内容是针对每个节点进行配置,签发成功后,输出文件为.zip压缩文件。

    参数说明:

    • cert :指定生成新的 X.509 证书和密钥。此参数不能与 csr 或 ca 参数一起使用。
    • --ca <file_path> :指定到现有 CA 密钥对的路径(采用 PKCS#12 格式)。此参数不能与 ca 或 csr 参数一起使用。
    • --ca-pass <password> :指定现有 CA 私钥或生成的 CA 私钥的密码。此参数不能与 ca 或 csr 参数一起使用。
    • --in <input_file> :指定用于以静默方式运行的文件。输入文件必须是 YAML 文件。该参数不能与 ca 参数一起使用。
    • --out <file_path> :指定输出文件的路径。
    • --name <file_name> :指定生成的证书的名称。该名称应与节点名称保持一致。该参数不能与ca参数一起使用。
    • --pass <password> :指定生成的私钥的密码。
    • --days <n> :指定一个整数值,该值表示生成的证书有效的天数。默认值为 1095 。该参数不能与 csr 参数一起使用。
    • --ip <IP_addresses> :指定逗号分隔的 IP 地址列表。该参数不能与 ca 参数一起使用。

    YAML 文件配置示例(官方文档):

    1. instances:
    2. - name: "node1"
    3. ip:
    4. - "192.0.2.1"
    5. dns:
    6. - "node1.mydomain.com"
    7. - name: "node2"
    8. ip:
    9. - "192.0.2.2"
    10. - "198.51.100.1"
    11. - name: "node3"
    12. - name: "node4"
    13. dns:
    14. - "node4.mydomain.com"
    15. - "node4.internal"
    16. - name: "CN=node5,OU=IT,DC=mydomain,DC=com"
    17. filename: "node5"

    参数说明:

    • name :节点证书名称,该名称与节点名称保持一致。必填项。
    • ip :节点 IP 。可设置多个。
    • dns :节点域名。可设置多个。
    • filename :当 name 不是有效的文件名称时,应设置此项,指定节点证书名称。

    其中nameipdns,用于主机名验证,name为首选验证,ipdns为备选验证。如果这三项都不包括节点信息,则应关闭主机名验证(默认情况下是开启的)。

1.2 节点通信加密

第一步:修改节点配置文件elasticsearch.yml启用 TLS 。

  • 如果签名证书为 PKCS#12 格式,做如下配置:

    1. xpack.security.transport.ssl.enabled: true
    2. xpack.security.transport.ssl.verification_mode: certificate
    3. xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
    4. xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

    设置说明:

    1、第 2 行设置:如果在生成节点证书时,使用了--ip--dns选项,需要将验证模式设置为full。有关该设置更多请查看:对于 TLS / SSL 设置的默认值

    2、第 3 行设置:如果为每个节点创建了单独的证书,则可能需要在每个节点上自定义此路径。如果文件名与节点名称匹配,则可以使用certs/${node.name}.p12例如格式。

    3、第 4 行设置:包含要信任的证书的PKCS#12文件的路径。因为使用elasticsearch-certutil创建 PKCS#12 密钥库,其包括 CA 证书作为信任证书的条目。这允许密钥库也用作信任库。在这种情况下,路径值应与该keystore.path值匹配。但是请注意,这不是一般规则。有些密钥库不能用作信任库,只有经过特殊设计的密钥库才能使用。

  • 如果证书为 PEM 格式,做如下配置:

    1. xpack.security.transport.ssl.enabled: true
    2. xpack.security.transport.ssl.verification_mode: certificate
    3. xpack.security.transport.ssl.key: /home/es/config/node01.key
    4. xpack.security.transport.ssl.certificate: /home/es/config/node01.crt
    5. xpack.security.transport.ssl.certificate_authorities: [ "/home/es/config/ca.crt" ]

    设置说明:

    1、第 2 行设置:如果在生成节点证书时,使用了--ip--dns选项,需要将验证模式设置为full。有关该设置更多请查看:对于 TLS / SSL 设置的默认值

    2、第 3 行设置:节点密钥文件的完整路径。该位置必须在 Elasticsearch 配置目录中。

    3、第 4 行设置:节点证书的完整路径。该位置必须在 Elasticsearch 配置目录中。

    4、第 5 行设置:应当信任的 CA 证书路径的数组。这些路径必须是 Elasticsearch 配置目录中的位置。

第二步:如果使用密码保护了节点证书的安全,请将密码添加到您的 Elasticsearch 密钥库中。

  • 如果签名证书为 PKCS#12 格式,请使用以下命令:

    1. bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
    2. bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
  • 如果证书为 PEM 格式,请使用以下命令:

    1. bin/elasticsearch-keystore add xpack.security.transport.ssl.secure_key_passphrase

第三步:重新启动 Elasticsearch 。

您必须执行完全集群重启。配置为使用 TLS 的节点无法与使用未加密网络的节点通信(反之亦然)。启用 TLS 之后,您必须重新启动所有节点,以维护整个群集之间的通信。

注意:Elasticsearch 会监视 TLS 相关设置的证书内容。例如,修改主机名、或证书到期,Elasticsearch 会重新加载它们。默认为每 5 秒的频率轮询是否有更改,相关配置项为resource.reload.interval.high

有关节点通信加密,更多内容请看官方文档:Encrypting communications between nodes in a clusteredit

1.3 客户端 HTTP 通信加密

启用安全功能后,可以选择使用 TLS 以确保 HTTP 客户端与群集之间的通信已加密。

第一步:启用 TLS 并指定访问节点证书所需的信息。

修改 Elasticsearch 配置文件elasticsearch.yml

  • 如果证书采用 PKCS#12 格式

    1. xpack.security.http.ssl.enabled: true
    2. xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
    3. xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12

    设置说明:

    1、第 2 行设置:如果为每个节点创建了单独的证书,则可能需要在每个节点上自定义此路径。如果文件名与节点名称匹配,则可以使用certs/${node.name}.p12例如格式。

    2、第 3 行设置:该elasticsearch-certutil输出包括 PKCS#12 密钥库内部的 CA 证书,因此密钥库也可以被用作信任库。此名称应与keystore.path值匹配。

  • 如果证书为 PEM 格式

    1. xpack.security.http.ssl.enabled: true
    2. xpack.security.http.ssl.key: /home/es/config/node01.key
    3. xpack.security.http.ssl.certificate: /home/es/config/node01.crt
    4. xpack.security.http.ssl.certificate_authorities: [ "/home/es/config/ca.crt" ]

    设置说明:

    1、第 2 行设置:节点密钥文件的完整路径。该位置必须在 Elasticsearch 配置目录中。

    2、第 3 行设置:节点证书的完整路径。该位置必须在 Elasticsearch 配置目录中。

    3、第 4 行设置:应当信任的 CA 证书路径的数组。这些路径必须是 Elasticsearch 配置目录中的位置。

第二步:如果您使用密码保护了节点证书的安全,请将密码添加到您的 Elasticsearch 密钥库中。

  • 如果签名证书为 PKCS#12 格式,请使用以下命令:

    1. bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
    2. bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
  • 如果证书为 PEM 格式,请使用以下命令:

    1. bin/elasticsearch-keystore add xpack.security.http.ssl.secure_key_passphrase

第三步:重新启动 Elasticsearch 。

注意:Elasticsearch 会监视 TLS 相关设置的证书内容。例如,修改主机名、或证书到期,Elasticsearch 会重新加载它们。默认为每 5 秒的频率轮询是否有更改,相关配置项为resource.reload.interval.high

有关节点通信加密,更多内容请看官方文档:Encrypting HTTP Client communications

参考资料

(完)