LDAP 用户身份验证

编辑

您可以配置 Elastic Stack 安全功能,使其与轻量级目录访问协议 (LDAP) 服务器通信以验证用户身份。请参阅配置 LDAP 域

LDAP 以分层方式存储用户和组,类似于文件系统中文件夹的组织方式。LDAP 目录的层次结构由容器构建而成,例如组织单元 (ou)、组织 (o) 和域组件 (dc)。

条目的路径是专有名称 (DN),它唯一标识用户或组。用户和组名称通常具有诸如通用名称 (cn) 或唯一 ID (uid) 之类的属性。DN 指定为一个字符串,例如 "cn=admin,dc=example,dc=com"(忽略空格)。

ldap 域支持两种操作模式:用户搜索模式和使用特定用户 DN 模板的模式。

将 LDAP 组映射到角色

编辑

域身份验证过程中不可或缺的一部分是解析与已验证用户关联的角色。角色定义了用户在集群中拥有的权限。

由于使用 ldap 域时,用户是在 LDAP 服务器中外部管理的,因此期望他们的角色也在那里管理。实际上,LDAP 支持组的概念,这些组通常代表组织中不同系统的用户角色。

ldap 域允许您通过用户的 LDAP 组或其他元数据将 LDAP 用户映射到角色。此角色映射可以通过添加角色映射 API 配置,也可以通过使用存储在每个节点上的文件来配置。当用户通过 LDAP 身份验证时,该用户的权限是用户映射到的所有角色定义的权限的并集。

配置 LDAP 域

编辑

要与 LDAP 集成,您需要配置一个 ldap 域并将 LDAP 组映射到用户角色。

  1. 确定您要使用的模式。ldap 域支持两种操作模式:用户搜索模式和使用特定用户 DN 模板的模式。

    LDAP 用户搜索是最常见的操作模式。在此模式下,使用具有搜索 LDAP 目录权限的特定用户,基于提供的用户名和 LDAP 属性搜索已验证用户的 DN。找到后,尝试使用找到的 DN 和提供的密码绑定到 LDAP 服务器来验证用户身份。

    如果您的 LDAP 环境对用户使用一些特定的标准命名条件,您可以使用用户 DN 模板来配置域。此方法的优点是不必执行搜索来查找用户 DN。但是,可能需要多次绑定操作才能找到正确的用户 DN。

  2. 要配置具有用户搜索的 ldap

    1. elasticsearch.yml 中的 xpack.security.authc.realms.ldap 命名空间下添加域配置。至少,您必须指定 LDAP 服务器的 urlorder,并将 user_search.base_dn 设置为搜索用户的容器 DN。有关可以为 ldap 域设置的所有选项,请参阅LDAP 域设置

      例如,以下代码片段显示了配置了用户搜索的 LDAP 域

      xpack:
        security:
          authc:
            realms:
              ldap:
                ldap1:
                  order: 0
                  url: "ldaps://ldap.example.com:636"
                  bind_dn: "cn=ldapuser, ou=users, o=services, dc=example, dc=com"
                  user_search:
                    base_dn: "dc=example,dc=com"
                    filter: "(cn={0})"
                  group_search:
                    base_dn: "dc=example,dc=com"
                  files:
                    role_mapping: "ES_PATH_CONF/role_mapping.yml"
                  unmapped_groups_as_roles: false

      应通过将适当的 secure_bind_password 设置添加到 Elasticsearch 密钥库来配置 bind_dn 用户的密码。例如,以下命令为上面的示例域添加密码

      bin/elasticsearch-keystore add \
      xpack.security.authc.realms.ldap.ldap1.secure_bind_password

      当您在 elasticsearch.yml 中配置域时,仅使用您指定的域进行身份验证。如果您还想使用 nativefile 域,则必须将它们包含在域链中。

  3. 要配置具有用户 DN 模板的 ldap

    1. xpack.security.authc.realms.ldap 命名空间中的 elasticsearch.yml 中添加域配置。至少,您必须指定 LDAP 服务器的 urlorder,并使用 user_dn_templates 选项指定至少一个模板。有关可以为 ldap 域设置的所有选项,请参阅LDAP 域设置

      例如,以下代码片段显示了配置了用户 DN 模板的 LDAP 域

      xpack:
        security:
          authc:
            realms:
              ldap:
                ldap1:
                  order: 0
                  url: "ldaps://ldap.example.com:636"
                  user_dn_templates:
                    - "cn={0}, ou=users, o=marketing, dc=example, dc=com"
                    - "cn={0}, ou=users, o=engineering, dc=example, dc=com"
                  group_search:
                    base_dn: "dc=example,dc=com"
                  files:
                    role_mapping: "/mnt/elasticsearch/group_to_role_mapping.yml"
                  unmapped_groups_as_roles: false

      bind_dn 设置在模板模式下不使用。所有 LDAP 操作都作为已验证用户运行。

  4. (可选)配置安全功能如何与多个 LDAP 服务器交互。

    load_balance.type 设置可以在域级别使用。Elasticsearch 安全功能支持故障转移和负载平衡操作模式。请参阅LDAP 域设置

  5. (可选)要保护密码,加密 Elasticsearch 和 LDAP 之间的通信
  6. 重新启动 Elasticsearch。
  7. 将 LDAP 组映射到角色。

    ldap 域允许您通过用户的 LDAP 组或其他元数据将 LDAP 用户映射到角色。此角色映射可以通过添加角色映射 API 配置,也可以通过使用存储在每个节点上的文件来配置。当用户通过 LDAP 身份验证时,该用户的权限是用户映射到的所有角色定义的权限的并集。

    在映射定义中,您可以使用其专有名称指定组。例如,以下映射配置将 LDAP admins 组映射到 monitoringuser 角色,并将 users 组映射到 user 角色。

    通过角色映射 API 配置

    resp = client.security.put_role_mapping(
        name="admins",
        roles=[
            "monitoring",
            "user"
        ],
        rules={
            "field": {
                "groups": "cn=admins,dc=example,dc=com"
            }
        },
        enabled=True,
    )
    print(resp)
    const response = await client.security.putRoleMapping({
      name: "admins",
      roles: ["monitoring", "user"],
      rules: {
        field: {
          groups: "cn=admins,dc=example,dc=com",
        },
      },
      enabled: true,
    });
    console.log(response);
    PUT /_security/role_mapping/admins
    {
      "roles" : [ "monitoring" , "user" ],
      "rules" : { "field" : {
        "groups" : "cn=admins,dc=example,dc=com" 
      } },
      "enabled": true
    }

    admins 组的 LDAP 专有名称 (DN)。

    resp = client.security.put_role_mapping(
        name="basic_users",
        roles=[
            "user"
        ],
        rules={
            "field": {
                "groups": "cn=users,dc=example,dc=com"
            }
        },
        enabled=True,
    )
    print(resp)
    const response = await client.security.putRoleMapping({
      name: "basic_users",
      roles: ["user"],
      rules: {
        field: {
          groups: "cn=users,dc=example,dc=com",
        },
      },
      enabled: true,
    });
    console.log(response);
    PUT /_security/role_mapping/basic_users
    {
      "roles" : [ "user" ],
      "rules" : { "field" : {
        "groups" : "cn=users,dc=example,dc=com" 
      } },
      "enabled": true
    }

    users 组的 LDAP 专有名称 (DN)。

    或者,通过角色映射文件配置

    monitoring: 
      - "cn=admins,dc=example,dc=com" 
    user:
      - "cn=users,dc=example,dc=com" 
      - "cn=admins,dc=example,dc=com"

    映射角色的名称。

    admins 组的 LDAP 专有名称 (DN)。

    users 组的 LDAP 专有名称 (DN)。

    有关详细信息,请参阅将 LDAP 组映射到角色将用户和组映射到角色

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

  8. (可选)配置 LDAP 域上的 metadata 设置,以在用户的元数据中包含其他字段。

    默认情况下,ldap_dnldap_groups 会填充在用户的元数据中。有关详细信息,请参阅LDAP 域中的用户元数据

    以下示例在用户的元数据中包含用户的通用名称 (cn) 作为附加字段。

    xpack:
      security:
        authc:
          realms:
            ldap:
              ldap1:
                order: 0
                metadata: cn
  9. 设置 SSL 以加密 Elasticsearch 和 LDAP 之间的通信。请参阅加密 Elasticsearch 和 LDAP 之间的通信

LDAP 域中的用户元数据

编辑

当用户通过 LDAP 域进行身份验证时,以下属性会填充到用户的元数据

字段

描述

ldap_dn

用户的专有名称。

ldap_groups

为用户解析的每个组的专有名称(无论这些组是否映射到角色)。

此元数据在身份验证 API 中返回,并且可以与角色中的模板化查询一起使用。

通过配置 LDAP 域上的 metadata 设置,可以在用户的元数据中包含其他字段。此元数据可用于角色映射 API模板化角色查询中。

负载平衡和故障转移

编辑

load_balance.type 设置可以在域级别使用,以配置安全功能应如何与多个 LDAP 服务器交互。安全功能支持故障转移和负载平衡操作模式。

请参阅负载平衡和故障转移

加密 Elasticsearch 和 LDAP 之间的通信

编辑

为了保护在 LDAP 域中发送以进行身份验证的用户凭据,强烈建议加密 Elasticsearch 和 LDAP 服务器之间的通信。通过 SSL/TLS 连接可确保在 Elasticsearch 传输用户凭据之前验证 LDAP 服务器的身份,并且连接内容已加密。通过 TLS 连接到 LDAP 服务器的客户端和节点需要在其密钥库或信任库中安装 LDAP 服务器的证书或服务器的根 CA 证书。

有关详细信息,请参阅LDAP 用户身份验证

  1. 在每个节点上配置域的 TLS 设置,以信任由签署 LDAP 服务器证书的 CA 签署的证书。以下示例演示了如何信任 Elasticsearch 配置目录中的 CA 证书 cacert.pem

    xpack:
      security:
        authc:
          realms:
            ldap:
              ldap1:
                order: 0
                url: "ldaps://ldap.example.com:636"
                ssl:
                  certificate_authorities: [ "cacert.pem" ]

    在上面的示例中,CA 证书必须是 PEM 编码的。

    还支持 PKCS#12 和 JKS 文件 - 请参阅LDAP 域设置ssl.truststore.path 的描述。

    您还可以指定各个服务器证书而不是 CA 证书,但这仅在您拥有单个 LDAP 服务器或证书是自签名的情况下才建议使用。

  2. 在 realm 配置中设置 url 属性以指定 LDAPS 协议和安全端口号。例如,url: ldaps://ldap.example.com:636
  3. 重新启动 Elasticsearch。

默认情况下,当您配置 Elasticsearch 以使用 SSL/TLS 连接到 LDAP 服务器时,它会尝试验证在 realm 配置的 url 属性中指定的主机名或 IP 地址是否与证书中的值匹配。如果证书中的值与 realm 配置不匹配,Elasticsearch 将不允许连接到 LDAP 服务器。这样做是为了防止中间人攻击。如有必要,您可以通过将 ssl.verification_mode 属性设置为 certificate 来禁用此行为。