Elasticsearch 集群加密通讯
目录:
加密通讯
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)。该证书是为节点证书做签发的,不必每次都创建,只要在有效期内,都可以使用。如果到期了,需要更换已签发的全部节点证书。# 进入 config 目录
[yuchen@node01 ~]$ cd /opt/elasticsearch-7.5.2/config/
# 创建 certs 目录,用于保存证书。
[yuchen@node01 config]$ mkdir ./certs
# 进入 bin 目录
[yuchen@node01 config]$ cd ../bin/
# 创建 CA 证书颁发机构
[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 个证书和密钥:
[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
批量签发节点证书命令:
[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.yml
YAML 文件,文件内容是针对每个节点进行配置,签发成功后,输出文件为.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 文件配置示例(官方文档):
instances:
- name: "node1"
ip:
- "192.0.2.1"
dns:
- "node1.mydomain.com"
- name: "node2"
ip:
- "192.0.2.2"
- "198.51.100.1"
- name: "node3"
- name: "node4"
dns:
- "node4.mydomain.com"
- "node4.internal"
- name: "CN=node5,OU=IT,DC=mydomain,DC=com"
filename: "node5"
参数说明:
name
:节点证书名称,该名称与节点名称保持一致。必填项。ip
:节点 IP 。可设置多个。dns
:节点域名。可设置多个。filename
:当name
不是有效的文件名称时,应设置此项,指定节点证书名称。
其中
name
、ip
、dns
,用于主机名验证,name
为首选验证,ip
和dns
为备选验证。如果这三项都不包括节点信息,则应关闭主机名验证(默认情况下是开启的)。
1.2 节点通信加密
第一步:修改节点配置文件elasticsearch.yml
启用 TLS 。
如果签名证书为 PKCS#12 格式,做如下配置:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
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 格式,做如下配置:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.key: /home/es/config/node01.key
xpack.security.transport.ssl.certificate: /home/es/config/node01.crt
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 格式,请使用以下命令:
bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
如果证书为 PEM 格式,请使用以下命令:
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 格式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
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 格式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: /home/es/config/node01.key
xpack.security.http.ssl.certificate: /home/es/config/node01.crt
xpack.security.http.ssl.certificate_authorities: [ "/home/es/config/ca.crt" ]
设置说明:
1、第 2 行设置:节点密钥文件的完整路径。该位置必须在 Elasticsearch 配置目录中。
2、第 3 行设置:节点证书的完整路径。该位置必须在 Elasticsearch 配置目录中。
3、第 4 行设置:应当信任的 CA 证书路径的数组。这些路径必须是 Elasticsearch 配置目录中的位置。
第二步:如果您使用密码保护了节点证书的安全,请将密码添加到您的 Elasticsearch 密钥库中。
如果签名证书为 PKCS#12 格式,请使用以下命令:
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password
如果证书为 PEM 格式,请使用以下命令:
bin/elasticsearch-keystore add xpack.security.http.ssl.secure_key_passphrase
第三步:重新启动 Elasticsearch 。
注意:Elasticsearch 会监视 TLS 相关设置的证书内容。例如,修改主机名、或证书到期,Elasticsearch 会重新加载它们。默认为每 5 秒的频率轮询是否有更改,相关配置项为resource.reload.interval.high
。
有关节点通信加密,更多内容请看官方文档:Encrypting HTTP Client communications
参考资料
(完)