转: 用 Go 写一个轻量级的 ldap 测试工具
前言
这是一个轮子。
作为一个在高校里混的 IT,LDAP 我们其实都蛮熟悉的,因为在高校中使用 LDAP 来做统一认证还蛮普遍的。对于 LDAP 的管理员而言,LDAP 的各种操作自然有产品对应的管理工具来处理,但对于需要集成 LDAP 的用户而言,我们经常需要做一些 LDAP 的测试来作为集成时的对比验证,脑补以下场景:
系统调试ing
乙:“LDAP 认证走不通啊,你们的 LDAP 是不是有问题哦”
默默掏出测试工具
甲:“你看,毫无压力”
乙:“我再查查看~”
另外,高校间协作共享会比较多一些,例如通过一些联邦式的认证联盟来让联盟内的成员互相信任身份认证的结果,从而支持一些跨校协作的应用。在国外应用的比较多的是基于 Shibboleth 的联盟。国内在上海有一个基于相同技术框架的联盟,称之为上海市教育认证联盟。
我校作为上海联盟的主要技术支持方,我经常得和各个学校的 LDAP 打交道。远程支持当然只有 ssh 了。此时要测试 LDAP,LdapBrowser 之类的工具在纯 CLI 环境下没法用,openldap 的 client 又显得过于麻烦,所以就造个轮子咯。
需求
这个轮子需求大概是这个样子
- 跨平台,木有依赖,开箱即用。用 Go 来撸一个就能很好的满足这个需求。
- 简单无脑一点,搞复杂了就没意思了
- 做到 ldap 的认证和查询就够了。增删改涉及 schema 以及不同 LDAP 产品实现时的标准差异,要做到兼容通用会比较麻烦。反正这一块的需求管理员用产品自带的控制台就好了嘛,我们的测试工具的就不折腾了
- 支持批量查询和批量认证的测试
- 提供个简单的 HTTP API,必要时也可以提供基于 http 的远程测试。
- 好吧,还可以学习 Golang ~
用 Go 操作 LDAP
我们可以用 https://github.com/go-ldap/ldap 这个库来操作 LDAP
他的 example 给的非常的详细,基本看一遍就可以开始抄了。。。
我们拿其中 userAuthentication 的 example 来举个例子,下为 example 中的示例代码,我增加了若干注释说明
总结:
- 建立连接
- 使用 bind 用户先 bind 以获取权限
- 根据用户名对应的属性写 searchfilter,结合 basedn 进行查询
- 如果需要认证,用查到的 dn 进行 bind 验证
- 如果还要继续查询/认证,rebind 回初始的 bind 用户上
- 关闭连接
命令行
作为一个 cli 工具,命令行部分的设计是很重要的。考虑我们所需要实现的功能
- 用户查询
- 用户认证
- 用特定的 filter 查询
- 批量认证
- 批量查询
比如可以按这个方式进行罗列
Go 由一个非常好的 cli 库 [cobra]("github.com/spf13/cobra"),我们就用它来做轮子。
cobra 用起来容易上手,我同样贴一段他的 example 代码来加以注释来说明
实际生产环境中,我们可以每个命令的相关代码单独放在一个 .go 文件中,这样看起来会比较清晰一些。像这样
### API
API 可以用著名的 beego 框架来搞。
beego 的文档 非常详细,就不再赘述了。
基于 beego ,我们提供以下 API,把命令行支持的功能都搬过来。
轮子
那么这个轮子已经造好了。ldao-test-tool
代码结构
编译
release
可以直接下载编译好的 release 版本
提供 win64 和 linux64 两个平台的可执行文件
https://github.com/shanghai-edu/ldap-test-tool/releases/
配置文件
默认配置文件为目录下的 cfg.json
,也可以使用 -c
或 --config
来加载自定义的配置文件。
openldap 配置示例
AD 配置示例
命令体系
命令行部分使用 cobra 框架,可以使用 help
命令查看命令的使用方式
认证
单用户测试
命令行说明
示例
批量测试
命令行说明
示例
用户名和密码以逗号分隔(csv风格)
authusers.txt 中有两个用户,密码正确的 qfeng 和密码错误的 qfengtest
查询
单用户查询
命令行说明
示例
PS: 如果属性有多值,将以 ;
分割
LDAP Filter 查询
示例
批量查询测试
命令行说明
示例
searchuser.txt 中有三个用户,其中 nofounduser 是不存在的用户
当使用 -f
选项时,查询的结果将输出到 csv
中。csv
将以配置文件中 attributes
的属性作为 title。因此当使用 -f
选项时,attributes
不得为空。
HTTP API
HTTP API 部分使用 beego 框架
使用如下命令开启 HTTP API
健康状态
检测 ldap 健康状态
查询用户
查询单个用户信息
Filter 查询
根据 LDAP Filter 查询
多用户查询
同时查询多个用户,以 application/json
方式发送请求数据,请求数据示例
curl 示例
认证
单用户认证
单个用户认证测试,以 application/json
方式发送请求数据,请求数据示例
curl 示例
多用户认证
同时发起多个用户认证测试,以 application/json
方式发送请求数据,请求数据示例
curl 示例
参考文档
LDAP WiKi
SSL vs TLS vs STARTTLS
IBM Security Identity Manager V6.0.0.10 - enRoleLDAPConnection.properties
RFC4511
cobra
beego