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 发出的大多数请求都使用登录用户的凭据进行身份验证。
要使用 Elasticsearch 集群注册 Kibana,您需要传递一个生成的注册令牌。此令牌配置 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 文档来生成证书颁发机构,那么您已经拥有用于签署 Elasticsearch 服务器证书的证书颁发机构 (CA)。您可以选择使用同一个 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) 为"<您的_kibana_主机名>"
。如果您的 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 身份验证。