Active Directory 用户身份验证
ECE ECK 自我管理
您可以配置 Elastic Stack 安全功能以与 Active Directory 通信来验证用户。
本主题介绍在集群或部署级别实现 Active Directory,用于与 Elasticsearch 和 Kibana 进行身份验证。
您还可以配置 Elastic Cloud Enterprise 安装以使用 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 组映射到 Elasticsearch 中的用户角色。
如果您的 Active Directory 域支持使用用户提供的凭据进行身份验证,则您无需配置 bind_dn。了解更多。
在
xpack.security.authc.realms.active_directory命名空间下,将类型为active_directory的领域配置添加到elasticsearch.yml。至少,您必须指定 Active Directory 的domain_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
- 在身份验证尝试期间,
active_directory领域被查询的顺序。 - Active Directory 中的主域。如果域名未在 DNS 中映射,则绑定到 Active Directory 会失败。
- 指向应该处理身份验证的 Active Directory 域控制器的 LDAP URL。如果您不指定 URL,则默认为
ldap:<domain_name>:389。
将 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,它们也是全局目录服务器。端口 3268 是全局目录未加密通信的默认端口。端口 3269 是 SSL 连接的默认端口。所连接的服务器可以是林中的任何域,只要它们也是全局目录服务器。
- 提供了一个负载均衡设置,以指示选择要连接的服务器时的期望行为。
在此配置中,用户将需要使用其完整的用户主体名称 (UPN) 或其下级登录名
UPN 通常是用户名与
@<DOMAIN_NAME的串联,例如johndoe@ad.example.com。下级登录名是 NetBIOS 域名,后跟一个
\和用户名,例如AD\johndoe。使用下级登录名需要连接到常规 LDAP 端口 (389 或 636),以便查询配置容器以从 NetBIOS 名称中检索域名。
当您在 elasticsearch.yml 中配置领域时,只有您指定的领域才用于身份验证。如果您还想使用 native 或 file 领域,则必须将它们包含在领域链中。
(可选)配置 Elasticsearch 如何与多个 Active Directory 服务器进行交互。
load_balance.type设置可以在领域级别使用。支持两种操作模式:故障转移和负载均衡。请参阅Active Directory 领域设置。(可选)为了保护密码,请加密 Elasticsearch 和 Active Directory 服务器之间的通信。
对于自管理集群和 Kubernetes 上的 Elastic Cloud 部署,使用 SSL/TLS 连接到 Active Directory 服务器的客户端和节点需要在其密钥库或信任库中安装 Active Directory 服务器的证书或服务器的根 CA 证书。
对于 Elastic Cloud Enterprise 和 Elastic Cloud 托管部署,如果您的域控制器配置为使用 LDAP over TLS,并且它使用自签名证书或由您组织的 CA 签名的证书,则需要启用部署来信任此证书。
重新启动 Elasticsearch。
您可以选择使用绑定用户来配置 Active Directory 领域。
Active Directory 领域使用 LDAP 绑定请求来验证用户。默认情况下,所有 LDAP 操作都由 Elasticsearch 正在验证的用户执行。在某些情况下,普通用户可能无法访问 Active Directory 中的所有必需项,此时需要绑定用户。可以配置绑定用户,并使用它来执行除 LDAP 绑定请求之外的所有操作,而 LDAP 绑定请求是验证用户提供的凭据所必需的。
当您指定 bind_dn 时,此特定用户将用于根据提供的用户名和 LDAP 属性搜索经过身份验证的用户 (DN)。如果找到,则通过尝试使用找到的 DN 和提供的密码绑定到 LDAP 服务器来验证此用户。
使用绑定用户可以使以其他用户身份运行功能与 Active Directory 领域一起使用。
在自管理集群中,使用绑定用户还可以维护一组到 Active Directory 的连接池。这些连接池减少了每次用户身份验证必须创建和销毁的资源数量。
配置绑定用户
添加您的用户设置,如下所示,用于
active_directory领域重要提示在 Elastic Cloud Enterprise 中,您必须将用户设置应用于每个部署模板。
xpack: security: authc: realms: active_directory: my_ad: order: 2 domain_name: ad.example.com url: ldap://ad.example.com:389 bind_dn: es_svc_user@ad.example.com- 用于所有 Active Directory 搜索请求的运行用户。
通过将适当的
xpack.security.authc.realms.active_directory.<my_ad>.secure_bind_password设置添加到 Elasticsearch 密钥库来配置bind_dn用户的密码。在自管理部署中,配置了绑定用户时,默认启用连接池。可以使用
user_search.pool.enabled设置禁用连接池。警告在 Elastic Cloud 托管和 Elastic Cloud Enterprise 中,配置
secure_bind_password后,任何重新启动部署的尝试都会失败,直到您完成其余配置步骤。如果您想回滚 Active Directory 领域配置,则需要删除刚刚添加的xpack.security.authc.realms.active_directory.<my_ad>.secure_bind_password。
领域身份验证过程的一个组成部分是解析与已验证用户关联的角色。角色定义了用户在集群中的权限。
由于用户是在 Active Directory 服务器上外部管理的,因此它们的角色也应该在那里管理。Active Directory 组通常代表组织内不同系统的用户角色。
active_directory 领域使您能够通过其 Active Directory 组或其他元数据将 Active Directory 用户映射到角色。
您可以通过以下方式将 Active Directory 组映射到您用户的角色
- 使用 Kibana 中的角色映射页面。
- 使用 角色映射 API。
- 使用角色映射文件。
有关更多信息,请参阅 将用户和组映射到角色。
仅支持 Active Directory 安全组。您不能将分发组映射到角色。
POST /_security/role_mapping/ldap-superuser {
"enabled": true,
"roles": [ "superuser" ],
"rules": {
"all" : [
{ "field": { "realm.name": "my_ad" } },
{ "field": { "groups": "cn=administrators, dc=example, dc=com" } }
]
},
"metadata": { "version": 1 }
}
- 我们想要分配的角色名称,在本例中为
superuser。 - 我们的 active_directory 领域的名称。
- Active Directory 组的专有名称,其成员应在部署中获得
superuser角色。
如果您使用 Elastic Cloud 托管或 Elastic Cloud Enterprise,则必须 将此文件作为自定义包上传,然后才能引用它。
如果您使用 Elastic Cloud on Kubernetes,则将文件安装为 自定义配置文件。
如果您使用的是自管理集群,则该文件必须存在于每个节点上。
superuser:
- cn=Senior Manager, cn=management, dc=example, dc=com
- cn=Senior Admin, cn=management, dc=example, dc=com
在elasticsearch.yml 中引用文件
xpack:
security:
authc:
realms:
active_directory:
my_ad:
order: 2
domain_name: ad.example.com
url: ldaps://ad.example.com:636
bind_dn: es_svc_user@ad.example.com
ssl:
certificate_authorities: ["/app/config/cacerts/ca.crt"]
verification_mode: certificate
files:
role_mapping: "/app/config/mappings/role-mappings.yml"
当用户使用 Active Directory 领域进行身份验证时,以下属性会填充到用户的元数据中
| 字段 | 描述 |
|---|---|
ldap_dn |
用户的专有名称。 |
ldap_groups |
为用户解析的每个组的专有名称(无论这些组是否已映射到角色)。 |
此元数据在身份验证 API 中返回,并可与角色中的模板化查询一起使用。
可以通过配置 Active Directory 领域上的 metadata 设置从 Active Directory 服务器提取其他元数据。
load_balance.type 设置可以在领域级别使用,以配置安全功能应如何与多个 Active Directory 服务器进行交互。支持两种操作模式:故障转移和负载均衡。
请参阅负载均衡和故障转移。
为了保护用于身份验证的用户凭据,您应该加密 Elasticsearch 和您的 Active Directory 服务器之间的通信。使用 SSL/TLS 连接可确保在 Elasticsearch 传输用户凭据之前对 Active Directory 服务器的身份进行验证,并且用户名和密码在传输过程中是加密的。
使用 SSL/TLS 连接到 Active Directory 服务器的客户端和节点需要在其密钥库或信任库中安装 Active Directory 服务器的证书或服务器的根 CA 证书。
如果您使用 Elastic Cloud 托管或 Elastic Cloud Enterprise,则必须 将您的证书作为自定义包上传,然后才能引用它。
如果您使用 Elastic Cloud on Kubernetes,则将证书安装为 自定义配置文件。
如果您使用的是 Elastic Cloud Enterprise 或 Elastic Cloud 托管,则只有在启用了 TLS 并且 Active Directory 控制器使用自签名证书时才需要执行这些步骤。
以下示例使用 PEM 编码证书。如果您的 CA 证书可作为 JKS 或 PKCS#12 密钥库提供,则可以在用户设置中引用它。例如
xpack.security.authc.realms.active_directory.my_ad.ssl.truststore.path:
"/app/config/truststore/ca.p12"
如果密钥库也受密码保护(这对于仅包含 CA 证书的密钥库不常见),您还可以通过在用户设置中添加 xpack.security.authc.realms.active_directory.my_ad.ssl.truststore.password: password 来提供密钥库的密码。
以下示例演示了如何信任位于配置目录内的 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" ]
有关这些设置的更多信息,请参阅Active Directory 领域设置。
默认情况下,当您将 Elasticsearch 配置为使用 SSL/TLS 连接到 Active Directory 时,它会尝试验证领域配置中的 url 属性指定的 IP 地址或主机名与证书中的值是否匹配。如果证书中的值与领域配置中的值不匹配,Elasticsearch 将不允许连接到 Active Directory 服务器。这样做是为了防止中间人攻击。如有必要,您可以通过将 ssl.verification_mode 属性设置为 certificate 来禁用此行为。
Active Directory 安全领域使用 Kibana 提供的基本身份验证登录表单。基本身份验证默认启用。