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,请先执行此操作。

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

  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 身份验证