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
域-
在
xpack.security.authc.realms.ldap
命名空间下将域配置添加到elasticsearch.yml
。至少,您必须指定 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
bind_dn
用户的密码应通过将相应的secure_bind_password
设置添加到 Elasticsearch 密钥库来配置。例如,以下命令添加了上面示例域的密码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 配置
PUT /_security/role_mapping/admins { "roles" : [ "monitoring" , "user" ], "rules" : { "field" : { "groups" : "cn=admins,dc=example,dc=com" } }, "enabled": true }
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 服务器或证书是自签名的时才推荐。
- 在域配置中设置
url
属性以指定 LDAPS 协议和安全端口号。例如,url: ldaps://ldap.example.com:636
。 - 重新启动 Elasticsearch。
默认情况下,当您配置 Elasticsearch 使用 SSL/TLS 连接到 LDAP 服务器时,它会尝试使用 realm 配置中 url
属性指定的 hostname 或 IP 地址与证书中的值进行验证。如果证书和 realm 配置中的值不匹配,Elasticsearch 将不允许连接到 LDAP 服务器。这样做是为了防止中间人攻击。如果需要,可以通过将 ssl.verification_mode
属性设置为 certificate
来禁用此行为。