LDAP认证
更新时间: 2026/02/09
在Gitcode上查看源码

LDAP在BMC中的认证

在LDAP认证中,用户信息都是存储在LDAP服务器中的。而在BMC中,也需要进行一些属性配置和用户配置,以确保在用户登录到BMC时,能找到正确的LDAP服务器,以及找到对应的可登陆用户组。

在LDAP认证的三种接口(web、redfish、ssh)中

  1. redfish和ssh均使用自动匹配的形式登录。
  2. web支持指定域登录和自动匹配登录,web端可在登录界面域名这一项进行选择。需要注意的是,域名下拉框仅在开启使能并配置了域控制器的情况下才能打开。示例如下:

关于两种登录认证形式

  • 指定域控制器 顾名思义,其实就是在登录的时候已经指定了LDAP的服务器,仅在该服务器上进行认证。

  • 自动匹配 相比指定域控制器登录的形式,其实就是多了一个对域控制器的遍历动作,直到在某一个LDAP服务器上认证成功或者在所有服务器上都失败。

LDAP在BMC中的认证流程

在这里,就与之前基础属性配置中提到的绑定标识名和绑定密码有关系了。如果配置了绑定标识名和绑定密码,会进入代理用户认证的流程;相反,如果未配置,就会进入直接认证的流程。

直接认证

认证方式

直接认证中又分了三种认证方式:

  1. SASL认证,对应函数do_sasl_bind 这个就要提到Cyrus-SASL这个开源软件了,这个开源软件我们当前是作为openLDAP的依赖引入的。SASL是一种为基于链接的协议提供辅助认证支持的架构,可以在其中编写不同认证机制的各自实现,从而允许客户端与服务器之间协商出共同支持的认证机制,达到认证机制的可插拔能力。LDAP在第三版协议中添加了对SASL认证的支持。 对于SASL认证,其实本质上就是将登录用户名组装成CN=**或者UID=**的形式,并设置了sasl认证插件的相关信息,调用openLDAP开源软件中的ldap_sasl_interactive_bind_s函数。当然,有兴趣去追踪openLDAP的源代码的话,也可以看到这个接口最后还是实际调用到ldap_sasl_bind这个接口。

  2. 直接绑定,对应函数do_direct_bind 直接绑定这一段呢,其实也是将登陆用户名组装成CN=**或者UID=**的形式,调用openLDAP开源软件中的ldap_simple_bind函数,与SASL认证的差异其实就在于没有对SASL认证插件的配置。有意思的是,这个接口其实本质还是openLDAP内部调用ldap_sasl_bind,差异在于第三个参数mechanism的入参设置,入参配置为LDAP_SASL_SIMPLE。

  3. 拼接全名绑定,对应函数ldap_simple_bind_s 这个接口是将登录认证名拼装成 name@domain 的形式进行全名绑定,调用openLDAP内部ldap_simple_bind_s,再来一个有意思的,这个接口内部实现也是调用ldap_sasl_bind接口,mechanism配置为LDAP_SASL_SIMPLE。

认证后续

在完成认证后,通过ldap_search_user找到用户的cn(也就是通用标识),再根据cn获取到用户对应的用户组,这个用户组用于判断该认证用户的权限、登录接口和登录规则。

代理用户鉴权认证

代理用户认证主要分为三个大步骤,分别为:代理用户认证、查找待认证用户、待认证用户认证。简单来说,其实就是通过一个中间用户先登录服务器,先来查找我们真正需要被认证的用户是否存在于服务器上,再对待认证用户进行认证。接下来会分别展开讲这三个步骤。

代理用户认证

代理用户认证时,首先判断我们设置的代理用户是DN的形式还是用户名的形式。

  1. DN形式 先判断CN=**的结构进行认证,再判断UID=**的结构进行认证。对应函数 do_direct_bind_dn。本质形式也是调用ldap_sasl_bind接口,mechanism配置为LDAP_SASL_SIMPLE。

  2. 用户名形式 使用代理用户名直认证,对应函数do_sasl_bind

查找待认证用户

在代理用户认证成功后,通过代理用户在ldap服务器上进行查找,判断我们待认证的用户是否存在于ldap服务器上。若存在,则继续后续认证;否则,反馈错误。

待认证用户鉴权认证

这里使用的SASL绑定和直接绑定两种形式。

整体认证梳理

从上面的拆解分析可以看出,BMC中在使用LDAP认证的时候。其实最后实际调用的接口都是OpenLDAP中的ldap_sasl_bind。 从BMC侧来看,几种形式的差异其实主要在于认证用户名是否拼装成CN=**的形式、UID=**的形式、name@domain的形式或者直接使用name的形式。 从OpenLDAP来看,几种形式的差异主要存在于sasl和ldap一系列的配置,有兴趣的可以细看OpenLDAP的源码。

各个接口之间的关系如下图所示:

从图中可以看出,几个接口其实最后都是指向了ldap_sasl_bind这个接口,入参区别有以下几点:

  1. 用户名(CN=/UID=/name@domain/name)

  2. mechanism(LDAP_SASL_SIMPLE、EXTERNAL、GSSAPI等) 除LDAP_SASL_SIMPLE代表弱认证外,还有none代表匿名,其它的值均为SASL认证机制,可在环境中使用一下命令查看。

    sh
    ldapsearch -x -H ldapi:/// -b "" -LLL -s base supportedSASLMechanisms

在openLDAP内部,其实也就是通过ldap_get_values这个接口来获取supportedSASLMechanisms这个属性。