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. xpack.security.authc.realms.ldap 命名空间下将域配置添加到 elasticsearch.yml。至少,您必须指定 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

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

      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 配置

    PUT /_security/role_mapping/admins
    {
      "roles" : [ "monitoring" , "user" ],
      "rules" : { "field" : {
        "groups" : "cn=admins,dc=example,dc=com" 
      } },
      "enabled": true
    }

    admins 组的 LDAP 可分辨名称 (DN)。

    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. 在域配置中设置 url 属性以指定 LDAPS 协议和安全端口号。例如,url: ldaps://ldap.example.com:636
  3. 重新启动 Elasticsearch。

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