LDAP 用户身份验证
编辑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 组映射到用户角色。
-
确定您要使用的模式。
ldap
域支持两种操作模式:用户搜索模式和使用特定用户 DN 模板的模式。LDAP 用户搜索是最常见的操作模式。在此模式下,使用具有搜索 LDAP 目录权限的特定用户,基于提供的用户名和 LDAP 属性搜索已验证用户的 DN。找到后,尝试使用找到的 DN 和提供的密码绑定到 LDAP 服务器来验证用户身份。
如果您的 LDAP 环境对用户使用一些特定的标准命名条件,您可以使用用户 DN 模板来配置域。此方法的优点是不必执行搜索来查找用户 DN。但是,可能需要多次绑定操作才能找到正确的用户 DN。
-
要配置具有用户搜索的
ldap
域-
在
elasticsearch.yml
中的xpack.security.authc.realms.ldap
命名空间下添加域配置。至少,您必须指定 LDAP 服务器的url
和order
,并将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
应通过将适当的
secure_bind_password
设置添加到 Elasticsearch 密钥库来配置bind_dn
用户的密码。例如,以下命令为上面的示例域添加密码bin/elasticsearch-keystore add \ xpack.security.authc.realms.ldap.ldap1.secure_bind_password
当您在
elasticsearch.yml
中配置域时,仅使用您指定的域进行身份验证。如果您还想使用native
或file
域,则必须将它们包含在域链中。
-
-
要配置具有用户 DN 模板的
ldap
域-
在
xpack.security.authc.realms.ldap
命名空间中的elasticsearch.yml
中添加域配置。至少,您必须指定 LDAP 服务器的url
和order
,并使用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 操作都作为已验证用户运行。
-
-
(可选)配置安全功能如何与多个 LDAP 服务器交互。
load_balance.type
设置可以在域级别使用。Elasticsearch 安全功能支持故障转移和负载平衡操作模式。请参阅LDAP 域设置。 - (可选)要保护密码,加密 Elasticsearch 和 LDAP 之间的通信。
- 重新启动 Elasticsearch。
-
将 LDAP 组映射到角色。
ldap
域允许您通过用户的 LDAP 组或其他元数据将 LDAP 用户映射到角色。此角色映射可以通过添加角色映射 API 配置,也可以通过使用存储在每个节点上的文件来配置。当用户通过 LDAP 身份验证时,该用户的权限是用户映射到的所有角色定义的权限的并集。在映射定义中,您可以使用其专有名称指定组。例如,以下映射配置将 LDAP
admins
组映射到monitoring
和user
角色,并将users
组映射到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={ "field": { "groups": "cn=users,dc=example,dc=com" } }, enabled=True, ) print(resp)
const response = await client.security.putRoleMapping({ name: "basic_users", roles: ["user"], rules: { field: { groups: "cn=users,dc=example,dc=com", }, }, enabled: true, }); console.log(response);
PUT /_security/role_mapping/basic_users { "roles" : [ "user" ], "rules" : { "field" : { "groups" : "cn=users,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"
有关详细信息,请参阅将 LDAP 组映射到角色和将用户和组映射到角色。
LDAP 域支持授权域作为角色映射的替代方案。
-
(可选)配置 LDAP 域上的
metadata
设置,以在用户的元数据中包含其他字段。默认情况下,
ldap_dn
和ldap_groups
会填充在用户的元数据中。有关详细信息,请参阅LDAP 域中的用户元数据。以下示例在用户的元数据中包含用户的通用名称 (
cn
) 作为附加字段。xpack: security: authc: realms: ldap: ldap1: order: 0 metadata: cn
- 设置 SSL 以加密 Elasticsearch 和 LDAP 之间的通信。请参阅加密 Elasticsearch 和 LDAP 之间的通信。
LDAP 域中的用户元数据
编辑当用户通过 LDAP 域进行身份验证时,以下属性会填充到用户的元数据中
字段 |
描述 |
|
用户的专有名称。 |
|
为用户解析的每个组的专有名称(无论这些组是否映射到角色)。 |
此元数据在身份验证 API 中返回,并且可以与角色中的模板化查询一起使用。
通过配置 LDAP 域上的 metadata
设置,可以在用户的元数据中包含其他字段。此元数据可用于角色映射 API 或模板化角色查询中。
负载平衡和故障转移
编辑load_balance.type
设置可以在域级别使用,以配置安全功能应如何与多个 LDAP 服务器交互。安全功能支持故障转移和负载平衡操作模式。
请参阅负载平衡和故障转移。
加密 Elasticsearch 和 LDAP 之间的通信
编辑为了保护在 LDAP 域中发送以进行身份验证的用户凭据,强烈建议加密 Elasticsearch 和 LDAP 服务器之间的通信。通过 SSL/TLS 连接可确保在 Elasticsearch 传输用户凭据之前验证 LDAP 服务器的身份,并且连接内容已加密。通过 TLS 连接到 LDAP 服务器的客户端和节点需要在其密钥库或信任库中安装 LDAP 服务器的证书或服务器的根 CA 证书。
有关详细信息,请参阅LDAP 用户身份验证。
-
在每个节点上配置域的 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 服务器或证书是自签名的情况下才建议使用。
- 在 realm 配置中设置
url
属性以指定 LDAPS 协议和安全端口号。例如,url: ldaps://ldap.example.com:636
。 - 重新启动 Elasticsearch。
默认情况下,当您配置 Elasticsearch 以使用 SSL/TLS 连接到 LDAP 服务器时,它会尝试验证在 realm 配置的 url
属性中指定的主机名或 IP 地址是否与证书中的值匹配。如果证书中的值与 realm 配置不匹配,Elasticsearch 将不允许连接到 LDAP 服务器。这样做是为了防止中间人攻击。如有必要,您可以通过将 ssl.verification_mode
属性设置为 certificate
来禁用此行为。