Kibana 与 Elasticsearch 之间的双向 TLS 身份验证
编辑Kibana 与 Elasticsearch 之间的双向 TLS 身份验证编辑
安全套接字层 (SSL) 和传输层安全性 (TLS) 为传输中的数据提供加密。虽然这些术语经常互换使用,但 Kibana 仅支持 TLS,后者取代了旧的 SSL 协议。
TLS 需要 X.509 证书来验证通信方的身份并执行传输中数据的加密。每个证书都包含一个公钥,并有一个关联的(但独立的)私钥;这些密钥用于加密操作。Kibana 支持 PEM 或 PKCS#12 格式的证书和私钥。
在标准 TLS 配置中,服务器会提供一个已签名的证书,以向客户端验证自身身份。在双向 TLS 配置中,客户端也会提供一个已签名的证书,以向服务器验证自身身份。
默认情况下,Elasticsearch 安全功能在您的集群上处于启用状态,因此 Kibana(客户端)向 Elasticsearch(服务器)发出的每个请求都会进行身份验证。最终用户通过 Kibana 向 Elasticsearch 发出的大多数请求都使用登录用户的凭据进行身份验证。
要将 Kibana 注册到 Elasticsearch 集群,您需要传递一个生成的注册令牌。此令牌会将 Kibana 配置为使用服务帐户令牌向 Elasticsearch 进行身份验证。Kibana 还支持通过公钥基础设施 (PKI) 领域与 Elasticsearch 进行双向 TLS 身份验证。使用此设置,Elasticsearch 需要验证 Kibana 客户端证书上的签名,并且还需要将客户端证书的专有名称 (DN) 映射到相应的 kibana_system
角色。
使用 PKI 领域是一项订阅功能。
配置 Kibana 和 Elasticsearch 以使用双向 TLS 身份验证编辑
如果尚未启动 Kibana 并使用注册令牌将其连接到 Elasticsearch,请先执行此操作。
-
获取 Kibana 的客户端证书和私钥。
Kibana 在连接到 Elasticsearch 时使用客户端证书和相应的私钥。
这与 Kibana 将向 Web 浏览器提供的服务器证书不同。
您可以选择使用
elasticsearch-certutil
工具生成客户端证书和私钥。如果您按照 Elasticsearch 文档生成证书颁发机构的说明进行操作,则您已经拥有一个证书颁发机构 (CA) 来签署 Elasticsearch 服务器证书。您可以选择使用相同的 CA 来签署 Kibana 客户端证书。例如bin/elasticsearch-certutil cert -ca elastic-stack-ca.p12 -name kibana-client -dns <your_kibana_hostname>
这将在名为
kibana-client.p12
的 PKCS#12 文件中生成客户端证书和私钥。在本例中,客户端证书的通用名称 (CN) 为"kibana-client"
,主题备用名称 (SAN) 为"<your_kibana_hostname>"
。如果在 Elasticsearch 上启用了主机名验证,则可能需要 SAN。 -
获取 Kibana 的证书颁发机构 (CA) 证书链。
Elasticsearch 需要适当的 CA 证书链,以便在接收来自 Kibana 的连接时正确建立信任。
如果您按照说明生成了客户端证书,则您将拥有一个用于 Kibana 的 PKCS#12 文件。您可以从此文件中提取 CA 证书链。例如
openssl pkcs12 -in kibana-client.p12 -cacerts -nokeys -out kibana-ca.crt
这将生成一个名为
kibana-ca.crt
的 PEM 格式文件,其中包含来自 PKCS#12 文件的 CA 证书。 -
使用 PKI 领域和本机领域配置 Elasticsearch。
默认情况下,Elasticsearch 提供了一个本机领域,用于使用用户名和密码进行身份验证。但是,要同时支持 PKI 领域(用于 Kibana)和本机领域(用于最终用户),您必须在
elasticsearch.yml
中配置每个领域xpack.security.authc.realms.pki.realm1.order: 1 xpack.security.authc.realms.pki.realm1.certificate_authorities: "/path/to/kibana-ca.crt" xpack.security.authc.realms.native.realm2.order: 2
-
将 Elasticsearch 配置为请求客户端证书。
默认情况下,Elasticsearch 在建立 TLS 连接时不会请求客户端证书。要更改此设置,您必须在
elasticsearch.yml
中设置可选的客户端证书身份验证xpack.security.http.ssl.client_authentication: "optional"
- 重新启动 Elasticsearch。
-
使用 Kibana 在 Elasticsearch 中为客户端证书创建角色映射。
此角色映射会将
kibana_system
角色分配给与包含的映射规则匹配的任何用户,该规则设置为等于客户端证书的 DN 属性有关更多信息,请参阅角色映射。
-
将 Kibana 配置为使用客户端证书和私钥。
您需要指定访问客户端证书和相应私钥所需的信息。
-
如果您的证书和私钥包含在 PKCS#12 文件中
在
kibana.yml
中指定您的 PKCS#12 文件elasticsearch.ssl.keystore.path: "/path/to/kibana-client.p12"
如果您的 PKCS#12 文件已加密,请将解密密码添加到您的Kibana 密钥库
bin/kibana-keystore add elasticsearch.ssl.keystore.password
如果您的 PKCS#12 文件没有使用密码保护,则根据其生成方式,您可能需要将
elasticsearch.ssl.keystore.password
设置为空字符串。 -
否则,如果您的证书和私钥采用 PEM 格式
在
kibana.yml
中指定您的证书和私钥elasticsearch.ssl.certificate: "/path/to/kibana-client.crt" elasticsearch.ssl.key: "/path/to/kibana-client.key"
如果您的私钥已加密,请将解密密码添加到您的Kibana 密钥库
bin/kibana-keystore add elasticsearch.ssl.keyPassphrase
-
-
将 Kibana 配置为*不*对 Elasticsearch 使用用户名和密码。
您必须从
kibana.yml
中删除elasticsearch.username
和elasticsearch.password
设置。如果存在这些设置,Kibana 将尝试使用它们通过本机领域向 Elasticsearch 进行身份验证。 - 重新启动 Kibana。
这些步骤使 Kibana 能够使用证书向 Elasticsearch 进行身份验证。但是,最终用户将只能使用用户名和密码向 Kibana 进行身份验证。要允许最终用户使用客户端证书向 Kibana 进行身份验证,请参阅Kibana PKI 身份验证。