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. elasticsearch.yml 中的 xpack.security.authc.realms.active_directory 命名空间下,添加一个类型为 active_directory 的领域配置。至少,您必须指定 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 绑定请求之外的所有操作,这是验证用户提供的凭据所必需的。

    使用绑定用户可以启用 以其他用户身份运行功能,以便与 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 配置

    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 组的 Active Directory 可分辨名称 (DN)。

    resp = client.security.put_role_mapping(
        name="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,
    )
    print(resp)
    const response = await client.security.putRoleMapping({
      name: "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,
    });
    console.log(response);
    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 来禁用此行为。