转: 用 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控件到窗口去. 将控件拖上去之后就是这个样子,默认 ...
随机推荐
- Docker网络和存储
本节内容: Docker网络访问 端口映射 数据管理 一.Docker网络访问 1. docker自带的网络 docker network ls:列出当前docker中已有的网络 docker net ...
- oracle centos 静默安装
http://blog.csdn.net/tongzidane/article/details/43852705 静默安装Oracle 11G过程中提示:Exception in thread &qu ...
- hmm学习笔记(二)
学习hmm近一周的时间,做个总结. 参考 李航的<统计学习方法>第9章,第10章 本文包含: 1.hmm模型 2.前向后向算法 3.Baum-Welch算法 4.维特比算法 1.hmm模 ...
- NET生成缩略图
1.添加一个html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- PHP的单引号和双引号
单引号内部的变量不会执行,双引号会执行. <?php $name = 'hello php'; echo "<h1>$name</h1>"; echo ...
- SQLSERVER2014集群实战——IP引发的坑
在之前的帖子里有提到过,为了避免IP变更带来的一系列问题,采取了不改变IP的策略.原以为,只要SQLSERVER的群集IP保持与之前单机部署的IP一致,就基本上不会有问题.然而实际永远比预想的更复杂. ...
- luogu4407 [JSOI2009]电子字典 字符串hash + hash表
暴力枚举,然后\(hash\)表判断 复杂度\(O(26 * 20 * n)\) 具体而言 对于操作1:暴力枚举删除 对于操作2:暴力添加,注意添加不要重复 对于操作3:暴力替换,同样的注意不要重复 ...
- WEB架构师成长之路 三
Web架构师究竟都要学些什么?具备哪些能力呢?先网上查查架构师的大概的定义,参见架构师修炼之道这篇文章,写的还不错,再查查公司招聘Web架构师的要求. 总结起来大概有下面几点技能要求: 一. 架构师有 ...
- [SimpleOJ229]隧道
题目大意: 有10个格子,初始状态a和b分别在5和6上. 现在有n个任务,每个任务都有特定的位置. 在每个单位时间,a和b可以分别进行以下事件中的任意一件: 1.向左(右)移动一个格子: 2.锁定在当 ...
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...