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。

  1. 获取 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。

  2. 获取 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 证书。

  3. 使用 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
  4. 配置 Elasticsearch 以请求客户端证书。

    默认情况下,Elasticsearch 在建立 TLS 连接时不会请求客户端证书。要更改此设置,您必须在 elasticsearch.yml 中设置可选的客户端证书身份验证

    xpack.security.http.ssl.client_authentication: "optional"
  5. 重新启动 Elasticsearch。
  6. 使用 Kibana 在 Elasticsearch 中为客户端证书创建角色映射。

    此角色映射会将 kibana_system 角色分配给任何与包含的映射规则匹配的用户,该规则设置为等于客户端证书的 DN 属性

    Role mapping for the Kibana client certificate

    有关更多信息,请参阅角色映射

  7. 配置 Kibana 以使用客户端证书和私钥。

    您需要指定访问您的客户端证书和相应私钥所需的信息。

    1. 如果您的证书和私钥包含在 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 设置为空字符串。

    2. 否则,如果您的证书和私钥采用 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
  8. 配置 Kibana 使用用户名和密码进行 Elasticsearch 身份验证。

    您必须从 kibana.yml 中删除 elasticsearch.usernameelasticsearch.password 设置。如果这些设置存在,Kibana 将尝试使用它们通过本机领域进行 Elasticsearch 身份验证。

  9. 重新启动 Kibana。

这些步骤使 Kibana 能够使用证书对 Elasticsearch 进行身份验证。但是,最终用户只能使用用户名和密码对 Kibana 进行身份验证。要允许最终用户使用客户端证书对 Kibana 进行身份验证,请参阅Kibana PKI 身份验证