X-Pack集成LDAP认证最佳实践

本文介绍如何基于阿里云Elasticsearch配置轻量目录访问协议LDAP(Lightweight Directory Access Protocol)认证,以实现相应角色的LDAP用户访问阿里云Elasticsearch。

前提条件

您已完成以下操作:

  • 创建阿里云Elasticsearch实例。本文以6.7版本为例。

    具体操作,请参见创建阿里云Elasticsearch实例

  • 准备和阿里云Elasticsearch同VPC下的LDAP服务和用户数据,本文以OpenLDAP 2.4.44版本为例。

    具体操作,请参见LDAP官方文档LDAP环境及用户数据

注意事项

自2020年10月起,阿里云Elasticsearch对不同地域进行了网络架构的调整,对创建的实例有以下影响:

  • 旧网络架构下,如果需要访问公网,可以直接使用SNAT功能或自建Nginx代理。

  • 新网络架构下,LDAP功能受到网络限制,您可以使用PrivateLink进行VPC网络打通,具体配置请参见配置实例私网连接。如果您需要访问公网,则需要配置Nginx代理进行请求转发。

  • 旧网络架构下,阿里云Elasticsearch仅支持单可用区的LDAP认证。

说明

关于网络架构,请参见【通知】网络架构调整

操作流程

  1. 步骤一:获取终端节点域名(可选)

  2. 步骤二:配置LDAP认证

  3. 步骤三:为域账号信息映射角色

  4. 步骤四:验证结果

步骤一:获取终端节点域名(可选)

如果您创建的阿里云Elasticsearch处于新网络架构下(2020年10月及之后创建的实例属于新网络架构),需要借助PrivateLink,打通用户VPC与阿里云服务账号VPC,获取终端域名,为后续配置做准备。具体操作如下:

  1. 创建与阿里云Elasticsearch实例处于同一VPC下,且支持PrivateLink功能的负载均衡实例。
  2. 配置负载均衡实例。

    配置时,需要指定LDAP所在的服务器为后端服务器,监听端口为389。

    具体操作,请参见配置实例私网连接

  3. 创建终端节点服务。

    具体操作,请参见步骤二:创建终端节点服务

  4. 配置阿里云Elasticsearch私网互通。
  5. 获取终端节点域名。

    具体操作,请参见配置实例私网连接

    说明 请先记录获取到的节点域名,该域名会在后续配置中使用。

步骤二:配置LDAP认证

目前,X-Pack集成LDAP认证支持通过以下两种方式配置:

  • 用户搜索模式。

  • 带有用户DNs特定模板的模式。

其中,用户搜索模式是最常见的操作方式。在此模式中,具有搜索LDAP目录权限的特定用户,根据X-Pack提供的用户名和LDAP属性搜索进行身份验证的用户的DN。一旦找到,X-Pack将使用找到的DN和提供的密码,尝试绑定到LDAP目录来验证用户。详细信息,请参见Configure an LDAP realm

以下为LDAP管理DN的映射方式,需要在Elasticsearch的YML文件中添加如下配置,具体操作请参见配置YML参数。阿里云Elasticsearch实例的版本不同,添加的配置也不同,具体如下:

  • 6.7版本

    xpack.security.authc.realms.ldap1.type: ldap
    xpack.security.authc.realms.ldap1.order: 2
    xpack.security.authc.realms.ldap1.url: "ldap://ep-bp1dhpobznlgjhj9****-cn-hangzhou-i.epsrv-bp1q8tcj2jjt5dwr****.cn-hangzhou.privatelink.aliyuncs.com:389"
    xpack.security.authc.realms.ldap1.bind_dn: "cn=zhang lei,ou=support,dc=yaobili,dc=com"
    xpack.security.authc.realms.ldap1.bind_password: "yourPassword"
    xpack.security.authc.realms.ldap1.user_search.base_dn: "ou=support,dc=yaobili,dc=com"
    xpack.security.authc.realms.ldap1.user_search.filter: "(cn={0})"
    xpack.security.authc.realms.ldap1.group_search.base_dn: "ou=support,dc=yaobili,dc=com"
    xpack.security.authc.realms.ldap1.unmapped_groups_as_roles: false
  • 7.10版本

    xpack.security.authc.realms.ldap.ldap1.order: 2
    xpack.security.authc.realms.ldap.ldap1.url: "ldap://ep-bp1dhpobznlgjhj9****-cn-hangzhou-i.epsrv-bp1q8tcj2jjt5dwr****.cn-hangzhou.privatelink.aliyuncs.com:389"
    xpack.security.authc.realms.ldap.ldap1.bind_dn: "cn=srd_artddffctory,ou=githab,ou=All Users,dc=motenta,dc=ai"
    xpack.security.authc.realms.ldap.ldap1.bind_password: "yourPassword"
    xpack.security.authc.realms.ldap.ldap1.user_search.base_dn: "ou=support,dc=yaobili,dc=com"
    xpack.security.authc.realms.ldap.ldap1.user_search.filter: "(cn={0})"
    xpack.security.authc.realms.ldap.ldap1.group_search.base_dn: "ou=support,dc=yaobili,dc=com"
    xpack.security.authc.realms.ldap.ldap1.unmapped_groups_as_roles: false

参数

说明

type

设置域。此处必须设置为ldap

order

域的优先级,数值越小,优先级越高。当配置中指定多个域时,建议配置此参数,系统会先访问order值较小的域。

说明

8.x版本要求order数值唯一性,建议使用2。

url

指定LDAP服务器的URL及端口。ldap协议表示使用普通连接,端口为389;ldaps表示使用SSL安全连接,端口为636。

重要

新网络架构下需要配置为终端节点域名:端口终端节点域名可在步骤一:获取终端节点域名(可选)中获取。本文以ep-bp1dhpobznlgjhj9****-cn-hangzhou-i.epsrv-bp1q8tcj2jjt5dwr****.cn-hangzhou.privatelink.aliyuncs.com:389为例。

bind_dn

用于绑定到LDAP并执行搜索的用户的DN,仅适用于用户搜索模式。

bind_password

用于绑定到LDAP目录的用户的密码。

user_search.base_dn

用户搜索的容器DN。

group_search.base_dn

用于搜索用户具有成员资格的容器DN。当此参数不存在时,Elasticsearch将搜索user_group_attribute指定的属性,来确定成员身份。

unmapped_groups_as_roles

默认false。如果设置为true,则任何未映射的LDAP组的名称都将用作角色名称分配给用户。

更多参数的详细信息,请参见Security settings in Elasticsearch

步骤三:为域账号信息映射角色

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 在左侧导航栏,单击Dev Tools
  3. Console中执行如下命令,映射LDAP下的zhang*账户为管理员角色。

    8.x版本

    POST _security/role_mapping/ldap_super_user1?pretty
    {
      "roles": [ "superuser" ],
      "enabled": true,
      "rules": {
        "any": [
          {
            "field": {
              "username": "zhang*"
            }
          }
        ]
      }
    }

    其他版本

    POST _xpack/security/role_mapping/ldap_super_user1?pretty
    {
      "roles": [ "superuser" ],
      "enabled": true,
      "rules": {
        "any": [
          {
            "field": {
              "username": "zhang*"
            }
          }
        ]
      }
    }

    更多信息,请参见elastic对应版本

步骤四:验证结果

  1. 使用已授权的zhang*账号登录阿里云Elasticsearch的Kibana控制台。

    登录Kibana
  2. 在左侧导航栏,单击Dev Tools
  3. Console中执行如下命令,验证zhang*用户是否有修改集群配置的权限。

    PUT _cluster/settings
    {
      "persistent": {
        "action.auto_create_index": true
      }
    }

    授权成功后,预期结果如下。返回结果