转: 用 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
以上
转载授权
转: 用 Go 写一个轻量级的 ldap 测试工具的更多相关文章
- 用 C# 写一个 Redis 数据同步小工具
用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...
- 轻量级Web渗透测试工具jSQL
轻量级Web渗透测试工具jSQL jSQL是Kali集成的一款轻量级的Web渗透测试工具.最初该工具主要实施SQL注入,后来增加更多的功能,扩展形成一个综合性的Web渗透测试工具.Kali提供的版本较 ...
- [AST实战]从零开始写一个wepy转VUE的工具
为什么需要 wepy 转 VUE "转转二手"是我司用 wepy 开发的功能与 APP 相似度非常高的小程序,实现了大量的功能性页面,而新业务 H5 项目在开发过程中有时也经常需要 ...
- 自己动手写一个U盘拷贝小工具
这是五一期间,参照知乎上一篇的文章<十行代码--用python写一个USB病毒>写成的,最初只是单纯的想写成死循环,直到文件占满硬盘为止,第一个遇到的问题是,拷贝到硬盘之后,由于要无限次拷 ...
- mysqlslap 一个MySQL数据库压力测试工具
在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...
- Python-编写一个mysql注入漏洞检测工具
判断mysql网站是否存在注入漏洞的几个方法: 注入点后加上一个单引号会报错 and 1=1返回正常页面,and 1=2返回的页面不同于正常页面 and sleep(3) 网页会等待3秒左右 根据返回 ...
- 原生js 基于canvas写一个简单的前端 截图工具
先看效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- 写一个java常用的加密工具类
1.叙述 java security包下有很多加密算法类,我们可以很简单的调用它们.他们虽然功能很全,但是使用起来步骤有些繁琐.我在这里封装来一些常用的加密算法及他们常用的一些方法,来简化代码. 工具 ...
- Python基础之用PyQt5写一个tabview
前面学习了menu的画图,现在学习tabview的画图,关于怎么打开designer.exe部分就不详细介绍了. 第一步:拖动一个Tab Widget控件到窗口去. 将控件拖上去之后就是这个样子,默认 ...
随机推荐
- glBlendFunc的几种常用情况
先Mark一下,后面有时间补上DEMO 1.画航母大灯,手电筒(效果为:透过黑色半透明层可看到下面的背景图,仅圆圈部分) 1)先画圆圈 2)再画背景图(大背景) 大背景设置 glBlendFunc ...
- sicily 1198. Substring (递归全排列+排序)
DescriptionDr lee cuts a string S into N pieces,s[1],…,s[N]. Now, Dr lee gives you these N sub-strin ...
- Asp.net Vnext 模块化实现
概述 本文已经同步到<Asp.net Vnext 系列教程 >中] 在程序中实现模块化可以加快开发效率,通过替换模块实现升级. 架构 vnext 没有 Virtualpathprovide ...
- bzoj 4552
4552 思路: 二分线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ...
- python mysql连接函数
def mysqlConnectionSql(sql,value): try: conn=MySQLdb.connect(host='127.0.0.1',user='webuser',passwd= ...
- LoadRunner 自带订票系统flights 功能空白、1080端口被占用的解决办法
LoadRunner 自带订票系统flights 功能空白.1080端口被占用的解决办法 安装LoadRunner8.1后运行Mercury Web Tours Application,点击fligh ...
- mysql 判断两个字符串是否存在包含关系-------(1,2,3)与(2,3)
1.这里这个是目前有问题的 #创建FUNCTION DELIMITER ; CREATE FUNCTION `is_mixed`(str1 TEXT, str2 TEXT) RETURN ...
- 张忠谋:摩尔定律将死,物联网是“Next Big Thing”
2014台湾半导体产业协会(TSIA)年会于27日登场,台积电董事长暨TSIA名誉理事长张忠谋以"Next Big Thing"为题发表演说.张忠谋表示,他认为摩尔定律 ...
- 有了这套flex页面布局方案,页面什么的,那都不是事。
一.CSS3弹性盒子弹性盒子是CSS3的一种新布局模式.CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局 ...
- 美团 R 语言数据运营实战
一.引言 近年来,随着分布式数据处理技术的不断革新,Hive.Spark.Kylin.Impala.Presto 等工具不断推陈出新,对大数据集合的计算和存储成为现实,数据仓库/商业分析部门日益成为各 ...