Active Directory 用户身份验证编辑

您可以配置 Elastic Stack 安全功能以与 Active Directory 通信以验证用户。请参阅 配置 Active Directory 域

安全功能使用 LDAP 与 Active Directory 通信,因此 active_directory 域类似于 ldap。与 LDAP 目录一样,Active Directory 以分层方式存储用户和组。目录的层次结构由容器构建,例如组织单位 (ou)、组织 (o) 和域组件 (dc)。

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

安全功能仅支持 Active Directory 安全组。您无法将分发组映射到角色。

当您使用 Active Directory 进行身份验证时,用户输入的用户名应与 sAMAccountNameuserPrincipalName 匹配,而不是通用名称。

Active Directory 域使用 LDAP 绑定请求验证用户。验证用户后,域会搜索以在 Active Directory 中找到用户的条目。找到用户后,Active Directory 域会从 Active Directory 中用户条目上的 tokenGroups 属性中检索用户的组成员资格。

配置 Active Directory 域编辑

要与 Active Directory 集成,您需要配置一个 active_directory 域并将 Active Directory 用户和组映射到角色映射文件中的角色。

  1. xpack.security.authc.realms.active_directory 命名空间下,将类型为 active_directory 的域配置添加到 elasticsearch.yml 中。至少,您必须指定 Active Directory domain_nameorder

    请参阅 Active Directory 域设置,了解您可以为 active_directory 域设置的所有选项。

    如果 DNS 中未映射域名称,则绑定到 Active Directory 会失败。如果 DNS 不是由 Windows DNS 服务器提供,请在本地 /etc/hosts 文件中添加域的映射。

    例如,以下域配置将 Elasticsearch 配置为连接到 ldaps://example.com:636 以通过 Active Directory 验证用户

    xpack:
      security:
        authc:
          realms:
            active_directory:
              my_ad:
                order: 0 
                domain_name: ad.example.com
                url: ldaps://ad.example.com:636 

    域顺序控制验证用户时检查已配置域的顺序。

    如果您未指定 URL,则默认为 ldap:<domain_name>:389

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

  2. 如果您要跨森林中的多个域验证用户,则需要执行额外的步骤。配置和用户身份验证方式之间存在一些细微差别。

    domain_name 设置设置为森林根域名称。

    您还必须设置 url 设置,因为您必须针对全局目录进行身份验证,全局目录使用不同的端口,并且可能不会在每个域控制器上运行。

    例如,以下域配置将 Elasticsearch 配置为连接到全局目录端口上的特定域控制器

    xpack:
      security:
        authc:
          realms:
            active_directory:
              my_ad:
                order: 0
                domain_name: example.com 
                url: ldaps://dc1.ad.example.com:3269, ldaps://dc2.ad.example.com:3269 
                load_balance:
                  type: "round_robin" 

    domain_name 设置为森林中根域的名称。

    此示例中使用的 url 值包含两个不同域控制器的 URL,它们也是全局目录服务器。端口 3268 是与全局目录进行未加密通信的默认端口;端口 3269 是 SSL 连接的默认端口。只要是全局目录服务器,连接到的服务器就可以位于森林中的任何域中。

    提供了一个负载均衡设置来指示选择要连接到的服务器时的预期行为。

    在此配置中,用户需要使用其完整的用户主体名称 (UPN) 或其向下兼容登录名。UPN 通常是用户名与 @<DOMAIN_NAME 的串联,例如 [email protected]。向下兼容登录名是 NetBIOS 域名称,后跟一个 \ 和用户名,例如 AD\johndoe。使用向下兼容登录名需要连接到常规 LDAP 端口(389 或 636)才能查询配置容器以从 NetBIOS 名称中检索域名称。

  3. (可选) 配置 Elasticsearch 如何与多个 Active Directory 服务器交互。

    可以在域级别使用 load_balance.type 设置。支持两种操作模式:故障转移和负载均衡。请参阅 Active Directory 域设置

  4. (可选) 要保护密码,请 加密 Elasticsearch 和 Active Directory 服务器之间的通信
  5. 重新启动 Elasticsearch。
  6. (可选) 配置绑定用户。

    Active Directory 域使用 LDAP 绑定请求验证用户。默认情况下,所有 LDAP 操作都由 Elasticsearch 正在验证的用户运行。在某些情况下,普通用户可能无法访问 Active Directory 中的所有必需项,因此需要绑定用户。可以配置绑定用户,并将其用于执行除 LDAP 绑定请求之外的所有操作,LDAP 绑定请求是验证用户提供的凭据所必需的。

    使用绑定用户可以使 以其他用户身份运行功能 与 Active Directory 域一起使用,并能够维护一组连接到 Active Directory 的池化连接。这些池化连接减少了每次用户身份验证时必须创建和销毁的资源数量。

    以下示例显示了通过使用 bind_dnsecure_bind_password 设置来配置绑定用户的示例

    xpack:
      security:
        authc:
          realms:
            active_directory:
              my_ad:
                order: 0
                domain_name: ad.example.com
                url: ldaps://ad.example.com:636
                bind_dn: [email protected] 

    这是执行所有 Active Directory 搜索请求的用户。如果没有配置绑定用户,所有请求都将以正在使用 Elasticsearch 进行身份验证的用户身份运行。

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

    bin/elasticsearch-keystore add  \
    xpack.security.authc.realms.active_directory.my_ad.secure_bind_password

    配置绑定用户后,默认情况下会启用连接池。可以使用 user_search.pool.enabled 设置禁用连接池。

  7. 将 Active Directory 用户和组映射到角色。

    域身份验证过程的一个组成部分是解析与已验证用户关联的角色。角色定义用户在集群中的权限。

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

    active_directory 域使您能够通过 Active Directory 组或其他元数据将 Active Directory 用户映射到角色。可以通过 角色映射 API 或使用存储在每个节点上的文件来配置此角色映射。当用户针对 Active Directory 域进行身份验证时,该用户的权限是映射到该用户的角色定义的所有权限的并集。

    在映射定义中,您使用其区分名称指定组。例如,以下映射配置将 Active Directory admins 组映射到 monitoringuser 角色,将 users 组映射到 user 角色,并将 John Doe 用户映射到 user 角色。

    通过角色映射 API 配置

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

    admins 组的 Active Directory 区分名称 (DN)。

    PUT /_security/role_mapping/basic_users
    {
      "roles" : [ "user" ],
      "rules" : { "any": [
        { "field" : {
          "groups" : "cn=users,dc=example,dc=com" 
        } },
        { "field" : {
          "dn" : "cn=John Doe,cn=contractors,dc=example,dc=com" 
        } }
      ] },
      "enabled": true
    }

    users 组的 Active Directory 区分名称 (DN)。

    用户 John Doe 的 Active Directory 区分名称 (DN)。

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

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

    角色的名称。

    admins 组的 Active Directory 区分名称 (DN)。

    users 组的 Active Directory 区分名称 (DN)。

    用户 John Doe 的 Active Directory 区分名称 (DN)。

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

  8. (可选) 在 Active Directory 域中配置 metadata 设置以在用户的元数据中包含额外的属性。

    默认情况下,ldap_dnldap_groups 将填充到用户的元数据中。有关更多信息,请参阅 Active Directory 域中的用户元数据

Active Directory 域中的用户元数据编辑

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

字段

描述

ldap_dn

用户的区分名称。

ldap_groups

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

此元数据在 身份验证 API 中返回,可用于角色中的 模板查询

通过在 Active Directory 领域配置 metadata 设置,可以从 Active Directory 服务器提取其他元数据。

负载均衡和故障转移编辑

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

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

加密 Elasticsearch 和 Active Directory 之间的通信编辑

为了保护用于身份验证的发送的用户凭据,强烈建议加密 Elasticsearch 和 Active Directory 服务器之间的通信。通过 SSL/TLS 连接可确保在 Elasticsearch 传输用户凭据之前验证 Active Directory 服务器的身份,并且用户名和密码在传输过程中被加密。

通过 SSL/TLS 连接到 Active Directory 服务器的客户端和节点需要在其密钥库或信任库中安装 Active Directory 服务器的证书或服务器的根 CA 证书。

  1. elasticsearch.yml 文件中为 xpack.security.authc.realms 命名空间创建领域配置。请参阅 配置 Active Directory 领域
  2. 在领域配置中设置 url 属性以指定 LDAPS 协议和安全端口号。例如,url: ldaps://ad.example.com:636
  3. 配置每个节点以信任由签署 Active Directory 服务器证书的证书颁发机构 (CA) 签署的证书。

    以下示例演示了如何信任 CA 证书 (cacert.pem),该证书位于配置目录中

    xpack:
      security:
        authc:
          realms:
            active_directory:
              ad_realm:
                order: 0
                domain_name: ad.example.com
                url: ldaps://ad.example.com:636
                ssl:
                  certificate_authorities: [ "ES_PATH_CONF/cacert.pem" ]

    CA 证书必须是 PEM 编码的证书。

    有关这些设置的更多信息,请参阅 Active Directory 领域设置

  4. 重新启动 Elasticsearch。

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