elasticsearch加密通信
Elastic Stack 安全特性使您能够加密与Elasticsearch集群之间的通信。使用传输层安全性(TLS/SSL)保护连接。警告:未启用加密的集群以明文发送包括密码在内的所有数据。如果启用了Elasticsearch安全特性,除非您拥有试用许可证,否则必须为节点间通信配置SSL/TLS。要启用加密,您需要在集群中的每个节点上执行以下步骤:1、验证 xpack.security.enabled 设置为 true 。有关更多信息,请参见安全设置。4、如果您正在使用Active Directory用户身份验证,请对Elasticsearch和Active Directory服务器之间的通信进行加密。5、如果使用LDAP用户身份验证,请对Elasticsearch和LDAP服务器之间的通信进行加密。有关跨弹性堆栈加密通信的详细信息,请参阅加密通信。一、生成节点证书
TLS需要X.509证书来对与之通信的应用程序执行加密和身份验证。在Elasticsearch集群中,验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。这样,当节点被添加到您的集群中时,它们只需要使用由相同CA签名的证书,节点就自动被允许加入集群。此外,建议证书包含与节点的IP地址和DNS名称对应的主题替代名称(SAN),以便能够执行主机名验证。elasticsearch-certutil 命令简化了为 Elastic Stack 生成证书的过程。它负责生成CA并与CA签署证书。它可以交互使用,也可以通过使用输入文件以静默模式使用。它还支持生成证书签名请求(CSR),以便可以使用特定于商业或组织的CA对证书进行签名。例如:1、可选:为您的Elasticsearch集群创建证书颁发机构
例如,使用 elasticsearch-certutil ca 命令:bin/elasticsearch-certutil ca
您可以配置集群来信任所有拥有证书的节点,这些证书已经由这个CA签署。此文件是 PKCS#12 密钥存储库,其中包含您的 CA的公共证书 和 用于为每个节点签署证书的私钥。elasticsearch-certutil 命令还提示输入保护文件和密钥的密码。如果您计划将来向集群添加更多节点,请保留该文件的副本并记住其密码。2、为集群中的每个节点生成证书和私钥
例如,使用 elasticsearch-certutil cert 命令:bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
输出是单个 PKCS#12 密钥存储库,其中包括节点证书、节点密钥和CA证书。 单独一个PKCS#12文件包含太多信息,不是很安全,如果想把CA证书、节点证书、节点密钥拆分,请使用以下方法: openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nokeys -out elastic-stack-ca.crt
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 -pem
命令执行成功将得到一个certificate-bundle.zip压缩包,里面包含两个文件:instance.crt(证书+公钥)和instance.key(私钥)系统还会提示您输入密码。您可以为证书和密钥输入密码,也可以按enter键将密码留空。默认情况下,elasticsearch-certutil 生成的证书中没有主机名信息(也就是说,它们没有任何主题替代名称字段)。这意味着您可以为集群中的每个节点使用证书,但是您必须关闭主机名验证,如下面的配置所示。 如何关闭主机名验证:xpack.security.transport.ssl.verification_mode 的值不要是full xpack.security.transport.ssl.verification_mode full,它验证提供的证书是否由受信任的权威机构(CA)签名,还验证服务器的主机名(或IP地址)是否与证书中标识的名称匹配。 certificate,它验证所提供的证书是否由受信任的权威机构(CA)签名,但不执行任何主机名验证。 none,它不执行对服务器证书的验证。这种模式禁用了SSL/TLS的许多安全优势,只有在非常仔细地考虑之后才能使用。它主要用作试图解决TLS错误时的临时诊断机制;强烈反对它在生产集群上的使用。如果希望在集群中使用主机名验证,请为每个节点运行一次 elasticsearch-certutil cert 命令,并提供 --name、--dns和--ip选项。 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ip 192.168.20.94,127.0.0.1 --out config/certs/cert.p12 --days 3660
注意:您应该保护输出文件,因为它们包含实例的私钥。 如果希望生成的证书是PEM格式的,就在上面的命令中增加 -pem 参数另外,如果希望使用商业或特定于组织的CA,可以使用 elasticsearch-certutil csr 命令为集群中的节点生成证书签名请求(csr)。有关更多信息,请参见elasticsearch-certutil。3、可选:为加密HTTP客户端通信生成额外的证书
例如,使用elasticsearch-certutil http命令:bin/elasticsearch-certutil http
这个命令指导您完成生成用于Elasticsearch和Kibana的适当证书的过程。如果为集群创建了CA,可以在提示时提供其位置,从而重用它。4、将节点证书复制到适当的位置
将适用的文件复制到每个节点上的Elasticsearch配置目录中。对于要配置的每个附加弹性产品,将证书复制到相关的配置目录。注意:如果您选择不使用elasticsearch-certutil,那么您获得的证书必须同时允许 clientAuth 和 serverAuth (如果存在扩展密钥使用扩展)。证书必须是PEM或PKCS#12格式。尽管不是必需的,但强烈建议证书包含节点的DNS名称和/或IP地址,以便使用主机名验证。二、加密集群中节点之间的通信
传输网络层用于集群中节点之间的内部通信。启用安全特性(xpack.security.enabled 设置为 true)时,必须使用TLS来确保节点之间的通信是加密的。1、生成节点证书
2、启用TLS并指定访问节点证书所需的信息
PKCS#12 格式
如果签名的证书是 PKCS#12 格式的,那么在每个节点上的 elasticsearch.yml 文件中添加以下信息:xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate ①
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 ②
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12 ③
① 如果在elasticsearch-certutil cert 命令中使用 --dns 或 --ip 选项,并且希望启用严格的主机名检查,请将验证模式设置为 full。有关这些值的描述,请参见传输TLS/SSL设置。 xpack.security.transport.ssl.verification_mode full,它验证提供的证书是否由受信任的权威机构(CA)签名,还验证服务器的主机名(或IP地址)是否与证书中标识的名称匹配。 certificate,它验证所提供的证书是否由受信任的权威机构(CA)签名,但不执行任何主机名验证。 none,它不执行对服务器证书的验证。这种模式禁用了SSL/TLS的许多安全优势,只有在非常仔细地考虑之后才能使用。它主要用作试图解决TLS错误时的临时诊断机制;强烈反对它在生产集群上的使用。② 如果为每个节点创建了单独的证书,那么可能需要在每个节点上定制此路径。例如,如果文件名与节点名匹配,您可以使用${node.name}.p12格式。③ elasticsearch-certutil 输出 PKCS#12 密钥存储库,其中包括作为受信任的证书条目的CA证书。这允许将密钥存储库也用作信任存储库。在这种情况下,路径值应该与 keystore.path 的值匹配。但是请注意,这不是一般的规则。有些密钥存储库不能用作信任存储库,只有专门设计的密钥存储库可以。PEM 格式
如果证书是PEM格式的,那么在每个节点上的 elasticsearch.yml 文件中添加以下信息: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" ] ④
① 如果在elasticsearch-certutil cert 命令中使用 --dns 或 --ip 选项,并且希望启用严格的主机名检查,请将验证模式设置为 full。有关这些值的描述,请参见传输TLS/SSL设置。 xpack.security.transport.ssl.verification_mode full,它验证提供的证书是否由受信任的权威机构(CA)签名,还验证服务器的主机名(或IP地址)是否与证书中标识的名称匹配。 certificate,它验证所提供的证书是否由受信任的权威机构(CA)签名,但不执行任何主机名验证。 none,它不执行对服务器证书的验证。这种模式禁用了SSL/TLS的许多安全优势,只有在非常仔细地考虑之后才能使用。它主要用作试图解决TLS错误时的临时诊断机制;强烈反对它在生产集群上的使用。② 节点密钥文件的完整路径。这必须是 Elasticsearch 配置目录 中的一个位置。③ 节点证书的完整路径。这必须是 Elasticsearch 配置目录 中的一个位置。④ 应该信任的CA证书的路径数组。这些路径必须是Elasticsearch配置目录中的一个位置。3、如果您使用密码保护的节点证书,请将密码添加到您的Elasticsearch密钥存储库:
PKCS#12 格式
如果签名证书是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
4、重启Elasticsearch
您必须执行完整的集群重启。被配置为使用TLS的节点不能与使用未加密网络的节点通信(反之亦然)。启用TLS之后,必须重新启动所有节点,以维护集群之间的通信。- 所有与tls相关的节点设置都被认为是高度敏感的,因此不会通过node info API公开,有关这些设置的更多信息,请参见安全性设置。
- Elasticsearch监视所有配置为与ls相关的节点设置值的文件,如证书、密钥、密钥存储库或信任存储库。如果您更新这些文件中的任何一个(例如,当您的主机名更改或您的证书到期时),Elasticsearch将重新加载它们。以全局Elasticsearch resources .reload.interval.high设置确定的频率对文件进行轮询,该频率默认为5秒。
三、加密HTTP客户端通信
启用安全特性时,可以选择使用TLS来确保HTTP客户机和集群之间的通信被加密。注意:强烈建议在HTTP层启用TLS,但这不是必需的。如果您在Elasticsearch的HTTP层上启用了TLS,那么您可能需要在Elastic堆栈的其他部分和您使用的任何Elasticsearch客户端上更改配置。1、如果还没有这样做,请生成节点证书
bin/elasticsearch-certutil http
这个命令生成一个zip文件,其中包含用于Elasticsearch和Kibana的证书和密钥。每个文件夹都包含一个说明如何使用这些文件的自述文件。
2、验证已将输出文件复制到自述文件中指定的适当位置
例如,复制 http.p12 文件从 elasticsearch 文件夹导入到每个节点上的 elasticsearch 配置目录中。如果选择为每个节点生成一个证书,则复制相应的 http.p12 文件到每个节点。如果您想使用 Kibana 访问这个集群,请复制 elasticsearch-ca.pem 文件从 kibana 文件夹导入到 kibana 配置目录中。3、启用TLS并指定访问节点证书所需的信息
a. 更新每个节点上的 elasticsearch.yml 文件中证书的位置
PKCS#12 格式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: "http.p12"
PEM 格式
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: home/es/config/node1_http.key ①
xpack.security.http.ssl.certificate: home/es/config/node1_http.crt ②
xpack.security.http.ssl.certificate_authorities: [ "/home/es/config/ca.crt" ] ③
① 节点密钥文件的完整路径。这必须是 Elasticsearch 配置目录 中的一个位置。② 节点证书的完整路径。这必须是 Elasticsearch 配置目录 中的一个位置。③ 应该信任的CA证书的路径数组。这些路径必须是Elasticsearch配置目录中的一个位置。b. 如果您使用密码保护密钥存储库或私钥,请将该密码添加到Elasticsearch中的安全设置中
PKCS#12 格式
bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
PEM 格式
bin/elasticsearch-keystore add xpack.security.http.ssl.secure_key_passphrase
4、可选的:如果您想使用Kibana,请按照 elasticsearch-certutil http 命令提供的自述文件中的说明操作,或者参见在Kibana中加密通信。
5、重启Elasticsearch
四、加密Elasticsearch和Active Directory之间的通信
https://www.elastic.co/guide/en/elasticsearch/reference/7.7/configuring-tls.html#tls-active-directory五、加密Elasticsearch和LDAP之间的通信
https://www.elastic.co/guide/en/elasticsearch/reference/7.7/configuring-tls.html#tls-ldap
官方文档(原文地址):https://www.elastic.co/guide/en/elasticsearch/reference/7.7/configuring-tls.html#configuring-tls