LDAP业务场景集成¶
最后更新:2022-07-12
什么是LDAP?¶
是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。 LDAP的一个常用用途是单点登录,用户可以在多个服务中使用同一个密码,通常用于公司内部网站的登录中(这样他们可以在公司计算机上登录一次,便可以自动在公司内部网上登录)。
IDaaS提供ldap标准协议中的搜索、认证、新增、修改、删除、比较能力,以下统称为LdapServer
以上能力只针对于IDaaS中的组织机构ou、账户ud、组group
提供能力¶
能力 |
概述 |
是否支持 |
说明 |
---|---|---|---|
bind |
认证 |
支持 |
提供U+P,U+OTP,U+P+OTP认证能力,支持simple认证方式 |
unbind |
取消认证/断开连接 |
支持 |
|
search |
搜索 |
支持 |
支持多种模式(base,one,sub),多种filter |
modify |
修改实体 |
支持 |
|
add |
新增实体 |
支持 |
|
delete |
删除实体 |
支持 |
|
compare |
比较指定数据是否有指定值 |
支持 |
字段说明¶
组织机构¶
类型: organizationalUnit
RDN: OU
字段 |
示例 |
说明 |
---|---|---|
objectClass |
top |
固定 |
objectClass |
organizationalUnit |
固定 |
organizationName |
test1 |
ou名称 |
ou |
test1 |
ou名称 |
type |
EXTERNAL_OU |
类型: |
enabled |
1 |
是否启用 0禁用1启用 |
externalId |
801601 |
外部ID |
sortNumber |
0 |
排序号 |
createTimestamp |
2022/2/8 9:44:58 |
创建时间 |
structuralObjectClass |
organizationalUnit |
固定 |
modifyTimestamp |
2022/3/9 3:44:47 |
更新时间 |
entryDN |
ou=test1,ou=人事组织,dc=idsmanager,dc=com |
dn路径 |
其他扩展字段按照扩展字段名返回 |
账户¶
类型:inetOrgPerson
RDN: uid
字段 |
示例 |
说明 |
---|---|---|
ou |
801601 |
所属组织机构 |
uid |
test |
username |
displayName |
test |
显示名称 |
sn |
test |
显示名称 |
cn |
test |
显示名称 |
objectClass |
top |
固定 |
objectClass |
person |
固定 |
objectClass |
organizationalPerson |
固定 |
objectClass |
inetOrgPerson |
固定 |
test@as.cd |
邮箱 |
|
mobile |
18000000000 |
手机号 |
externalId |
123456 |
外部ID |
locked |
0 |
是否被锁定 0正常1锁定 |
enabled |
1 |
是否启用 0禁用1启用 |
expireTime |
2022/2/8 9:44:58 |
过期时间 |
modifyTimestamp |
2022/2/8 9:44:58 |
修改时间 |
entryDN |
uid=test,ou=test1,ou=人事组织,dc=idsmanager,dc=com |
dn路径 |
hasSubordinates |
FALSE |
是否有下级节点,固定FALSE |
createTimestamp |
2022/2/8 9:44:58 |
创建时间 |
structuralObjectClass |
inetOrgPerson |
固定 |
其他扩展字段按照扩展字段名返回 |
组¶
类型: groupOfUniqueNames
RDN: cn
字段 |
示例 |
说明 |
---|---|---|
o |
123456 |
外部ID |
ou |
801601 |
所属OU |
cn |
test |
显示名称 |
objectClass |
top |
固定 |
objectClass |
groupOfUniqueNames |
固定 |
type |
SELF_GROUP |
类型: |
enabled |
1 |
是否启用 0禁用1启用 |
externalId |
123456 |
外部ID |
uniqueMember |
uid=test,ou=test1,ou=人事组织,dc=idsmanager,dc=com |
组成员,DN形式 |
memberUid |
test |
组成员,username形式 |
modifyTimestamp |
2022/2/8 9:44:58 |
修改时间 |
entryDN |
cn=1,ou=test1,ou=人事组织,dc=idsmanager,dc=com |
DN路径 |
hasSubordinates |
FALSE |
是否有下级节点,固定FALSE |
createTimestamp |
2022/2/8 9:44:58 |
创建时间 |
structuralObjectClass |
groupOfUniqueNames |
固定 |
其他扩展字段按照扩展字段名返回 |
能力介绍¶
bind (认证)¶
为了安全考虑,不允许匿名访问,支持Simple Authentication(U+P,U+OTP,U+P+OTP)
需要提前在ldap界面授权,才能认证通过
协议 |
Simple Authenticetion |
|
---|---|---|
bind dn |
uid={username},dc=idsmanager,dc=com |
dc=idsmanager,dc=com |
password |
根据配置来定, 可以是idp4中用户密码,或者OTP,或者密码+OTP |
配置文件定义 |
示例
ldapwhoami -h 127.0.0.1 -p 10389 -D "uid=xxx,dc=idsmanager,dc=com" -w "123456"
密码正确,则返回
dn:uid=admin,dc=idsmanager,dc=com
错误则返回
ldap_bind: Invalid credentials (49)
additional info: INVALID_CREDENTIALS: Bind failed: Invalid authentication
search(搜索)¶
支持ldap标准搜索语法,支持分页, 多种查找模式(search scope),多种过滤器(filter)
支持多种Filter,分别如下:
search scope(查找模式)¶
Base
base 模式只会查找并返回 baseDN 的信息
示例:
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s base
dn:: dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
One
one 模式会查找BaseDN 及 baseDN 直属子节点
示例:
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s one
dn:: ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: ou=应用群组,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
Sub
sub 模式会查找BaseDN 及 baseDN 下的所有子节点
示例
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub
dn:: ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: ou=应用群组,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
dn:: ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
search filter(过滤器)¶
存在
(attr=*)
查找包含特定属性的值的项,而不用管属性的值是什么。
示例: 查找有uid属性的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=*)'
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
相等
(attr=value)
查找所包含的属性值与指定值相同的项
示例: 查找uid为admin的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=admin)'
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
大于等于
(attr>=value)
查找特定项,该项中包含的属性的数字或字母值大于或等于指定的值。
示例: 查找age大于等于20的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(age>=20)'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
age=30
#xxx 相关信息
search: 2
result: 0 Success
小于等于
(attr<=value)
查找特定项,该项中包含的属性的数字或字母值小于或等于指定的值。
示例: 查找age大于等于10的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(age<=10)'
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
age=10
#xxx 相关信息
search: 2
result: 0 Success
模糊搜索
(attr=value*) 或者 (attr=val*ue) 或者 (attr=*value)
手机号和邮箱在IDaaS里面是加密存储,故不支持模糊查询
查找所包含的属性值与指定的子字符串相同的项
示例: 查找uid包含test前缀的的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=test*)'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
近似匹配
(attr~=value)
查找特定项,该项中所含属性的值约等于指定的值。
示例: 查找uid约等于test的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid~=test)'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
组合过滤器:And
(&(attr=value)(attr=value))
查找所有子条件都满足的数据
示例: 查找uid包含test前缀,age=30的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(&(uid=test*)(age=30))'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
组合过滤器:Or
(|(attr=value)(attr=value))
查找所有子条件都满足的数据
示例: 查找uid包含test前缀或者age=30的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(!(uid=test*))'
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
组合过滤器:Not
(!(attr=value))
查找所有子条件都不满足的数据
示例: 查找uid不包含test前缀的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=admin)'
dn: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
dn: ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
add(新增)¶
支持ldap标准add语法,允许通过ldap添加用户、组织机构、组。
需要有父级组织机构的权限才能执行该操作
支持的类型如下:
组织机构:
支持对象类型(objectClass):organization、organizationalUnit
支持的字段列表如下:
rdn: 组织机构名称
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
externalId |
否 |
801601 |
外部ID |
ou |
否 |
testou |
名称 |
organizationName |
否 |
名称 |
|
type |
否 |
SELF_OU |
类型: |
sortNumber |
否 |
0 |
排序号 |
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
用户:
支持对象类型(objectClass):inetOrgPerson、organizationalPerson、person、posixAccount
支持的字段列表如下:
rdn : username
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
externalId |
否 |
801601 |
对象类型 |
displayName |
是 |
testud |
显示名称 |
sn |
否 |
显示名称,同displayName,传一个即可 |
|
cn |
否 |
显示名称,同displayName,传一个即可 |
|
password |
否 |
123456 |
不传,将生成随机密码,仅支持明文密码(Plain text) |
userPassword |
否 |
不传,将生成随机密码,仅支持明文密码(Plain text) |
|
否 |
test@test.com |
邮箱 |
|
否 |
邮箱,同mail,传一个即可 |
||
mobile |
否 |
18000000000 |
手机号 |
telephoneNumber |
否 |
手机号,同mobile,传一个即可 |
|
homePhone |
否 |
手机号,同mobile,传一个即可 |
|
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
组:
支持对象类型(objectClass):groupOfUniqueNames、posixGroup
支持的字段列表如下:
rdn : 组名称
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
externalId |
否 |
801601 |
对象类型 |
cn |
否 |
testgroup |
名称 |
memberUid |
否 |
testud |
成员列表,可多个,账户username |
uniqueMember |
否 |
uid= |
成员列表,可多个,账户的DN或者username |
description |
否 |
desc |
备注 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
示例
新建user_add.ldif文件,文件内容如下:
dn: cn=testud,ou=人事组织,dc=idsmanager,dc=com
objectClass: person
cn: 显示名称
执行以下命令,将在人事组织节点下面创建一个用户:
ldapadd -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -f ./user_add.ldif
成功,则返回
adding new entry "cn=testud,ou=人事组织,dc=idsmanager,dc=com"
错误,则返回
adding new entry "cn=testud,ou=人事组织,dc=idsmanager,dc=com"
ldap_add: Server is unwilling to perform (53)
additional info: UNWILLING_TO_PERFORM: failed for MessageType : ADD_REQUEST
Message ID : 2
Add Request :
Entry
dn: cn=testud,ou=人事组织,dc=idsmanager,dc=com
objectClass: person
cn: 显示名称
: 账户名称已经存在
modify(修改)¶
支持ldap标准add语法,允许通过ldap修改用户、组织机构、组。
需要有对应实体的权限才能执行该操作
支持的类型如下:
不支持修改RDN
组织机构:
支持的字段列表如下:
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
ou |
否 |
testou |
名称 |
organizationName |
否 |
名称 |
|
sortNumber |
否 |
0 |
排序号 |
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
用户:
支持的字段列表如下:
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
displayName |
否 |
testud |
显示名称 |
sn |
否 |
显示名称,同displayName,传一个即可 |
|
cn |
否 |
显示名称,同displayName,传一个即可 |
|
password |
否 |
123456 |
仅支持明文密码(Plain text) |
userPassword |
否 |
仅支持明文密码(Plain text) |
|
否 |
test@test.com |
邮箱 |
|
否 |
邮箱,同mail,传一个即可 |
||
mobile |
否 |
18000000000 |
手机号 |
telephoneNumber |
否 |
手机号,同mobile,传一个即可 |
|
homePhone |
否 |
手机号,同mobile,传一个即可 |
|
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
组:
支持对象类型(objectClass):groupOfUniqueNames、posixGroup
支持的字段列表如下:
rdn : 组名称
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
cn |
否 |
testgroup |
名称 |
memberUid |
否 |
testud |
成员列表,可多个,账户username |
uniqueMember |
否 |
uid= |
成员列表,可多个,账户的DN或者username |
description |
否 |
desc |
备注 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
示例
新建user_modify.ldif文件,文件内容如下:
dn: uid=testud,ou=人事组织,dc=idsmanager,dc=com
changetype: modify
replace: mail
mail: test@test.com
-
replace: cn
cn: newname
执行以下命令,将修改testud的邮箱为test@test.com,显示名称为newname
ldapmodify -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -f ./user_modify.ldif
成功,则返回
modifying entry "uid=testud,ou=人事组织,dc=idsmanager,dc=com"
错误,则返回
modifying entry "uid=testud,ou=人事组织,dc=idsmanager,dc=com"
ldap_modify: Server is unwilling to perform (53)
additional info: UNWILLING_TO_PERFORM: failed for MessageType : MODIFY_REQUEST
Message ID : 2
Modify Request
Object : 'uid=testud,ou=人事组织,dc=idsmanager,dc=com'
Modifications :
Modification[0]
Operation : replace
Modification : mail: test
Modification[1]
Operation : replace
Modification : cn: newname
: 邮箱格式不正确
delete(删除)¶
支持ldap标准delete语法,允许通过ldap删除用户、组织机构、组。
需要有对应实体的权限才能执行该操作
该操作为逻辑删除,对应IDaaS中的离职操作。
示例:
执行以下命令,将删除testud账户
ldapdelete -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" "uid=testud,ou=人事组织,dc=idsmanager,dc=com"
错误,则返回
ldap_delete: Server is unwilling to perform (53)
additional info: UNWILLING_TO_PERFORM: failed for MessageType : DEL_REQUEST
Message ID : 2
Del request
Entry : 'uid=testud,ou=人事组织,dc=idsmanager,dc=com'
org.apache.directory.api.ldap.model.message.DeleteRequestImpl@60c04066: 该username:testud 不存在
compare(比较)¶
支持ldap标准compare语法,允许通过ldap判断指定的某个属性值是否在某个实体中存在,存在则返回true,否则返回false
示例:
判断testud该账户邮箱是否等于test@test.com
ldapcompare -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" "uid=testud,ou=人事组织,dc=idsmanager,dc=com" "email:test@test.com"
存在,则返回
Compare Result: Compare True (6)
Matched DN: uid=testud,ou=人事组织,dc=idsmanager,dc=com
TRUE
不存在,则返回
Compare Result: Compare False (5)
Matched DN: uid=testud,ou=人事组织,dc=idsmanager,dc=com
FALSE
部署手册¶
环境说明¶
jdk1.8及以上
注意,里面采用了AES256算法,需要替换jre的jce_policy,不然无法使用,认证不成功 jce_policy下载地址: 点击下载
安装包目录说明¶
idaas-ldapserver-1.0.0
│ LICENSE
│ NOTICE
│
├─bin
│ ldap.bat windows启动脚本
│ ldap.sh linux启动脚本
│ cpappend.bat
│
├─instances
│ └─default
│ ├─cache
│ ├─conf 配置文件目录
│ │ config.ldif
│ │ log4j.properties 日志配置
│ │
│ ├─log 日志目录
│ ├─partitions 数据目录
│ └─run
└─lib
ldap-service-4.17.13.jar 部署包
配置ldap¶
在IDaaS平台,添加相应的ldap服务(认证源-LDAP-中点击“新建LDAP”)
连接超时时间: LdapServer连接IDaaS服务超时时间(暂未实现)
认证方式: ldap认证时候采取的认证方式
支持账户硬件otp: 是否支持硬件OTP
Idaas平台服务器地址: 注意填写ldapserver部署的服务器能访问的IDaaS地址
basedn: ldap协议中的base dn
返回用户所属组:勾选后将返回用户加入的组信息,如下图勾选后,返回的组信息
点击下载配置文件,将下载的配置文件放在配置文件目录(instances/default/conf)
授权访问¶
配置完LdapServer后,需要授权给组织机构,有权限的组织机构下的账户才能访问
点击配置列表中的授权:
在弹出的页面中右侧选择需要授权的组织机构,选择根(人事组织)将授权所有用户访问
运行¶
win
./ldap.bat
或者
./ldap.bat default start
停止
ctrl+c
linux
启动
./ldap.sh start
查看状态
./ldap.sh status
停止
./ldap.sh stop
使用¶
测试¶
使用任意ldap客户端工具验证即可,这里以LdapBrowser为例:
打开LDAP Browser,新建Profile,输入一个profilename,点击下一步
其中host,填入ldapserver服务器地址, port默认10389, ssl port为10636
base dn填入配置文件指定的dn,默认dc=idsmanager,dc=com
选择other credentials中的simple认证方式
principal 格式: uid=xxxx,ou=Peoples,dc=idsmanager,dc=com
password: idp4中对应密码
点击完成保存配置.
FAQ¶
如何修改端口?¶
打开配置目录,打开文件(\instances\default\conf\config.ldif)
运行后该文件会自动消息,如未找到该文件,请重新解压部署包,重新部署程序
找到如下配置替换,重启生效
普通端口:
ads-systemPort: 10389
SSL端口:
ads-systemPort: 10636