Active Directory 用户身份验证
编辑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 进行身份验证时,用户输入的用户名应与 sAMAccountName
或 userPrincipalName
匹配,而不是通用名称。
Active Directory 领域使用 LDAP 绑定请求验证用户身份。验证用户身份后,该领域会在 Active Directory 中搜索以查找用户的条目。找到用户后,Active Directory 领域将从 Active Directory 中用户条目的 tokenGroups
属性检索用户的组成员身份。
配置 Active Directory 领域
编辑要与 Active Directory 集成,您可以配置一个 active_directory
领域,并将 Active Directory 用户和组映射到角色映射文件中的角色。
-
在
elasticsearch.yml
中的xpack.security.authc.realms.active_directory
命名空间下,添加一个类型为active_directory
的领域配置。至少,您必须指定 Active Directorydomain_name
和order
。有关您可以为
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
当您在
elasticsearch.yml
中配置领域时,仅使用您指定的领域进行身份验证。如果您还想使用native
或file
领域,则必须将它们包含在领域链中。 -
如果您要跨林中的多个域验证用户身份,则需要额外的步骤。配置和用户身份验证方式存在一些细微差异。
将
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 名称检索域名。 -
(可选)配置 Elasticsearch 应如何与多个 Active Directory 服务器交互。
可以在领域级别使用
load_balance.type
设置。支持两种操作模式:故障转移和负载平衡。请参阅Active Directory 领域设置。 - (可选)为了保护密码,加密 Elasticsearch 和 Active Directory 服务器之间的通信。
- 重新启动 Elasticsearch。
-
(可选)配置绑定用户。
Active Directory 领域使用 LDAP 绑定请求验证用户身份。默认情况下,所有 LDAP 操作都由 Elasticsearch 正在验证身份的用户运行。在某些情况下,普通用户可能无法访问 Active Directory 中的所有必需项,因此需要绑定用户。可以配置绑定用户,并将其用于执行除 LDAP 绑定请求之外的所有操作,这是验证用户提供的凭据所必需的。
使用绑定用户可以启用 以其他用户身份运行功能,以便与 Active Directory 领域一起使用,并能够维护一组与 Active Directory 的池连接。这些池连接减少了每次用户身份验证都必须创建和销毁的资源数量。
以下示例显示了通过使用
bind_dn
和secure_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]
应该通过将相应的
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
设置禁用连接池。 -
将 Active Directory 用户和组映射到角色。
领域身份验证过程的一个组成部分是解析与已验证用户关联的角色。角色定义了用户在集群中拥有的权限。
由于使用
active_directory
领域时,用户在 Active Directory 服务器中进行外部管理,因此预期他们的角色也在那里进行管理。实际上,Active Directory 支持组的概念,这些组通常表示组织中不同系统的用户角色。active_directory
领域使您可以通过 Active Directory 组或其他元数据将 Active Directory 用户映射到角色。可以通过 角色映射 API 或使用存储在每个节点上的文件来配置此角色映射。当用户针对 Active Directory 领域进行身份验证时,该用户的权限是用户映射到的角色定义的所有权限的并集。在映射定义中,您可以使用其可分辨名称来指定组。例如,以下映射配置将 Active Directory
admins
组映射到monitoring
和user
角色,将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 }
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 }
或者,通过角色映射文件配置
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)。有关更多信息,请参阅将用户和组映射到角色。
-
(可选)在 Active Directory 领域中配置
metadata
设置,以便在用户的元数据中包含其他属性。默认情况下,用户的元数据中会填充
ldap_dn
和ldap_groups
。更多信息,请参阅 Active Directory 域中的用户元数据。
Active Directory 域中的用户元数据
编辑当用户通过 Active Directory 域进行身份验证时,以下属性会填充到用户的元数据中
字段 |
描述 |
|
用户的专有名称。 |
|
为用户解析的每个组的专有名称(无论这些组是否映射到角色)。 |
此元数据在 身份验证 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 证书。
- 在
elasticsearch.yml
文件中为xpack.security.authc.realms
命名空间创建域配置。请参阅 配置 Active Directory 域。 - 在域配置中设置
url
属性以指定 LDAPS 协议和安全端口号。例如,url: ldaps://ad.example.com:636
。 -
配置每个节点以信任由签署您的 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 域设置。
- 重新启动 Elasticsearch。
默认情况下,当您配置 Elasticsearch 使用 SSL/TLS 连接到 Active Directory 时,它会尝试使用证书中的值验证在域配置中用 url
属性指定的hostname或IP地址。如果证书和域配置中的值不匹配,Elasticsearch 将不允许连接到 Active Directory 服务器。这样做是为了防止中间人攻击。如果需要,您可以通过将 ssl.verification_mode
属性设置为 certificate
来禁用此行为。