Kerberos 身份验证

编辑

您可以配置 Elastic Stack 安全功能以支持 Kerberos V5 身份验证,这是一种在 Elasticsearch 中验证用户的行业标准协议。

您不能使用 Kerberos 域在传输网络层进行身份验证。

要使用 Kerberos 验证用户身份,您需要配置 Kerberos 域并将用户映射到角色。有关域设置的更多信息,请参阅 Kerberos 域设置

关键概念

编辑

在设置 Kerberos 域时,您会遇到一些术语和概念

kdc
密钥分发中心。一个颁发 Kerberos 票证的服务。
主体

Kerberos 主体是 Kerberos 可以为其分配票证的唯一身份。它可用于标识用户或服务器提供的服务。

Kerberos V5 主体名称的格式为 primary/instance@REALM,其中 primary 是用户名。

instance 是一个可选字符串,用于限定主名称,并用斜杠(/)与主名称分隔。对于用户,通常不使用;对于服务主机,它是主机的完全限定域名。

REALM 是 Kerberos 域。通常是域名的大写形式。一个典型的用户主体示例是 [email protected]。一个典型的服务主体示例是 HTTP/[email protected]

域定义了管理边界,在该边界内,身份验证服务器有权验证用户和服务。
keytab
一个存储主体和加密密钥对的文件。

任何具有此文件读取权限的人都可以使用网络中的凭据来访问其他服务,因此使用适当的文件权限保护它非常重要。

krb5.conf
一个包含 Kerberos 配置信息的文件,例如默认域名、密钥分发中心 (KDC) 的位置、域信息、从域名到 Kerberos 域的映射以及域会话密钥加密类型的默认配置。
票证授予票证 (TGT)
TGT 是由 Kerberos 身份验证服务器生成的身份验证票证。它包含一个加密的验证器。

配置 Kerberos 域

编辑

Kerberos 用于保护服务,并使用基于票证的身份验证协议来验证用户身份。您可以配置 Elasticsearch 使用 Kerberos V5 身份验证协议(这是一种行业标准协议)来验证用户身份。在这种情况下,客户端必须提供 Kerberos 票证才能进行身份验证。

在 Kerberos 中,用户通过身份验证服务进行身份验证,然后通过票证授予服务生成 TGT(票证授予票证)。然后将此票证呈现给服务进行身份验证。有关获取 TGT 的更多信息,请参阅 Kerberos 安装文档。Elasticsearch 客户端必须先获取 TGT,然后启动与 Elasticsearch 进行身份验证的过程。

开始之前

编辑
  1. 部署 Kerberos。

    您必须在您的环境中设置 Kerberos 基础设施。

    Kerberos 需要大量外部服务才能正常运行,例如所有机器之间的时间同步以及域中工作的前向和反向 DNS 映射。有关更多详细信息,请参阅您的 Kerberos 文档。

    这些说明不包括设置和配置您的 Kerberos 部署。如果提供了示例,它们与 MIT Kerberos V5 部署有关。有关更多信息,请参阅 MIT Kerberos 文档

  2. 配置 Java GSS。

    Elasticsearch 使用 Java GSS 框架支持 Kerberos 身份验证。为了支持 Kerberos 身份验证,Elasticsearch 需要以下文件

    • krb5.conf,一个 Kerberos 配置文件
    • 一个 keytab 文件,其中包含 Elasticsearch 服务主体的凭据

    配置要求取决于您的 Kerberos 设置。请参阅您的 Kerberos 文档以配置 krb5.conf 文件。

    有关 Java GSS 的更多信息,请参阅 Java GSS Kerberos 要求

  3. 为 HTTP 启用 TLS。

    如果您的 Elasticsearch 集群在生产模式下运行,您必须先配置 HTTP 接口以使用 SSL/TLS,然后才能启用 Kerberos 身份验证。有关更多信息,请参阅 加密 Elasticsearch 的 HTTP 客户端通信

    此步骤对于通过 Kibana 支持 Kerberos 身份验证是必要的。对于直接针对 Elasticsearch Rest API 的 Kerberos 身份验证,则不需要此步骤。

  4. 启用令牌服务

    Elasticsearch Kerberos 实现利用 Elasticsearch 令牌服务。如果您在 HTTP 接口上配置 TLS,则此服务会自动启用。可以通过在 elasticsearch.yml 文件中添加以下设置来显式配置它

    xpack.security.authc.token.enabled: true

    此步骤对于通过 Kibana 支持 Kerberos 身份验证是必要的。对于直接针对 Elasticsearch Rest API 的 Kerberos 身份验证,则不需要此步骤。

创建 Kerberos 域

编辑

要在 Elasticsearch 中配置 Kerberos 域

  1. 配置 JVM 以查找 Kerberos 配置文件。

    Elasticsearch 使用 Java GSS 和 JAAS Krb5LoginModule 通过简单且受保护的 GSSAPI 协商机制 (SPNEGO) 机制支持 Kerberos 身份验证。Kerberos 配置文件 (krb5.conf) 提供诸如默认域、密钥分发中心 (KDC) 以及 Kerberos 身份验证所需的其他配置详细信息等信息。当 JVM 需要某些配置属性时,它会尝试通过查找并加载此文件来找到这些值。用于配置文件路径的 JVM 系统属性是 java.security.krb5.conf。要配置 JVM 系统属性,请参阅 设置 JVM 选项。如果未指定此系统属性,Java 会尝试根据约定查找该文件。

    建议为 Elasticsearch 配置此系统属性。设置此属性的方法取决于您的 Kerberos 基础设施。有关更多详细信息,请参阅您的 Kerberos 文档。

    有关更多信息,请参阅 krb5.conf

  2. 为 Elasticsearch 节点创建 keytab。

    keytab 是一个存储主体和加密密钥对的文件。Elasticsearch 使用 keytab 中的密钥解密用户提供的票证。您必须使用 Kerberos 实现提供的工具为 Elasticsearch 创建 keytab。例如,一些创建 keytab 的工具是 Windows 上的 ktpass.exe 和 MIT Kerberos 的 kadmin

  3. 将 keytab 文件放入 Elasticsearch 配置目录。

    确保此 keytab 文件具有读取权限。此文件包含凭据,因此您必须采取适当的措施来保护它。

    Elasticsearch 在 HTTP 网络层上使用 Kerberos,因此每个 Elasticsearch 节点上都必须有一个 HTTP 服务主体的 keytab 文件。服务主体名称的格式必须为 HTTP/[email protected]。keytab 文件对于每个节点都是唯一的,因为它们包含主机名。只要在配置的 keytab 中找到该主体及其凭据,Elasticsearch 节点就可以充当客户端请求的任何主体。

  4. 创建 Kerberos 域。

    要在 Elasticsearch 中启用 Kerberos 身份验证,您必须在域链中添加一个 Kerberos 域。

    您只能在 Elasticsearch 节点上配置一个 Kerberos 域。

    要配置 Kerberos 域,您需要在 elasticsearch.yml 配置文件中配置一些强制性域设置和其他可选设置。在 xpack.security.authc.realms.kerberos 命名空间下添加域配置。

    Kerberos 域最常见的配置如下

    xpack.security.authc.realms.kerberos.kerb1:
      order: 3
      keytab.path: es.keytab
      remove_realm_name: false

    从用户提供的票证中提取 username,通常格式为 username@REALM。此 username 用于将角色映射到用户。如果域设置 remove_realm_name 设置为 true,则会删除域部分 (@REALM)。生成的 username 用于角色映射。

    有关可用域设置的详细信息,请参阅 Kerberos 域设置

  5. 重新启动 Elasticsearch
  6. 将 Kerberos 用户映射到角色。

    kerberos 域允许您将 Kerberos 用户映射到角色。您可以使用 创建或更新角色映射 API 来配置这些角色映射。您可以通过其 username 字段来标识用户。

    以下示例使用角色映射 API 将 user@REALM 映射到角色 monitoringuser

    resp = client.security.put_role_mapping(
        name="kerbrolemapping",
        roles=[
            "monitoring_user"
        ],
        enabled=True,
        rules={
            "field": {
                "username": "user@REALM"
            }
        },
    )
    print(resp)
    const response = await client.security.putRoleMapping({
      name: "kerbrolemapping",
      roles: ["monitoring_user"],
      enabled: true,
      rules: {
        field: {
          username: "user@REALM",
        },
      },
    });
    console.log(response);
    POST /_security/role_mapping/kerbrolemapping
    {
      "roles" : [ "monitoring_user" ],
      "enabled": true,
      "rules" : {
        "field" : { "username" : "user@REALM" }
      }
    }

    如果您想支持 Kerberos 跨域身份验证,您可能需要根据 Kerberos 域名映射角色。对于这种情况,以下是可用于角色映射的其他用户元数据:- kerberos_realm 将设置为 Kerberos 域名。 - kerberos_user_principal_name 将设置为 Kerberos 票证中的用户主体名称。

    有关更多信息,请参阅 将用户和组映射到角色

    Kerberos 域支持 授权域 作为角色映射的替代方案。

为 Kerberos 配置 Kibana

编辑

如果您想使用 Kerberos 通过浏览器和 Kibana 进行身份验证,您需要在 Kibana 配置中启用相关的身份验证提供程序。请参阅 Kerberos 单点登录