前言

这是一个轮子。

作为一个在高校里混的 IT,LDAP 我们其实都蛮熟悉的,因为在高校中使用 LDAP 来做统一认证还蛮普遍的。对于 LDAP 的管理员而言,LDAP 的各种操作自然有产品对应的管理工具来处理,但对于需要集成 LDAP 的用户而言,我们经常需要做一些 LDAP 的测试来作为集成时的对比验证,脑补以下场景:

系统调试ing
乙:“LDAP 认证走不通啊,你们的 LDAP 是不是有问题哦”
默默掏出测试工具
甲:“你看,毫无压力”
乙:“我再查查看~”

另外,高校间协作共享会比较多一些,例如通过一些联邦式的认证联盟来让联盟内的成员互相信任身份认证的结果,从而支持一些跨校协作的应用。在国外应用的比较多的是基于 Shibboleth 的联盟。国内在上海有一个基于相同技术框架的联盟,称之为上海市教育认证联盟。

image.png

我校作为上海联盟的主要技术支持方,我经常得和各个学校的 LDAP 打交道。远程支持当然只有 ssh 了。此时要测试 LDAP,LdapBrowser 之类的工具在纯 CLI 环境下没法用,openldap 的 client 又显得过于麻烦,所以就造个轮子咯。

需求

这个轮子需求大概是这个样子

  1. 跨平台,木有依赖,开箱即用。用 Go 来撸一个就能很好的满足这个需求。
  2. 简单无脑一点,搞复杂了就没意思了
  3. 做到 ldap 的认证和查询就够了。增删改涉及 schema 以及不同 LDAP 产品实现时的标准差异,要做到兼容通用会比较麻烦。反正这一块的需求管理员用产品自带的控制台就好了嘛,我们的测试工具的就不折腾了
  4. 支持批量查询和批量认证的测试
  5. 提供个简单的 HTTP API,必要时也可以提供基于 http 的远程测试。
  6. 好吧,还可以学习 Golang ~

用 Go 操作 LDAP

我们可以用 https://github.com/go-ldap/ldap 这个库来操作 LDAP
他的 example 给的非常的详细,基本看一遍就可以开始抄了。。。

我们拿其中 userAuthentication 的 example 来举个例子,下为 example 中的示例代码,我增加了若干注释说明

总结:

  1. 建立连接
  2. 使用 bind 用户先 bind 以获取权限
  3. 根据用户名对应的属性写 searchfilter,结合 basedn 进行查询
  4. 如果需要认证,用查到的 dn 进行 bind 验证
  5. 如果还要继续查询/认证,rebind 回初始的 bind 用户上
  6. 关闭连接

命令行

作为一个 cli 工具,命令行部分的设计是很重要的。考虑我们所需要实现的功能

  • 用户查询
  • 用户认证
  • 用特定的 filter 查询
  • 批量认证
  • 批量查询

比如可以按这个方式进行罗列

image.png

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

以上

转载授权

CC BY-SA

转: 用 Go 写一个轻量级的 ldap 测试工具的更多相关文章

  1. 用 C# 写一个 Redis 数据同步小工具

    用 C# 写一个 Redis 数据同步小工具 Intro 为了实现 redis 的数据迁移而写的一个小工具,将一个实例中的 redis 数据同步到另外一个实例中.(原本打算找一个已有的工具去做,找了一 ...

  2. 轻量级Web渗透测试工具jSQL

    轻量级Web渗透测试工具jSQL jSQL是Kali集成的一款轻量级的Web渗透测试工具.最初该工具主要实施SQL注入,后来增加更多的功能,扩展形成一个综合性的Web渗透测试工具.Kali提供的版本较 ...

  3. [AST实战]从零开始写一个wepy转VUE的工具

    为什么需要 wepy 转 VUE "转转二手"是我司用 wepy 开发的功能与 APP 相似度非常高的小程序,实现了大量的功能性页面,而新业务 H5 项目在开发过程中有时也经常需要 ...

  4. 自己动手写一个U盘拷贝小工具

    这是五一期间,参照知乎上一篇的文章<十行代码--用python写一个USB病毒>写成的,最初只是单纯的想写成死循环,直到文件占满硬盘为止,第一个遇到的问题是,拷贝到硬盘之后,由于要无限次拷 ...

  5. mysqlslap 一个MySQL数据库压力测试工具

    在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...

  6. Python-编写一个mysql注入漏洞检测工具

    判断mysql网站是否存在注入漏洞的几个方法: 注入点后加上一个单引号会报错 and 1=1返回正常页面,and 1=2返回的页面不同于正常页面 and sleep(3) 网页会等待3秒左右 根据返回 ...

  7. 原生js 基于canvas写一个简单的前端 截图工具

    先看效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  8. 写一个java常用的加密工具类

    1.叙述 java security包下有很多加密算法类,我们可以很简单的调用它们.他们虽然功能很全,但是使用起来步骤有些繁琐.我在这里封装来一些常用的加密算法及他们常用的一些方法,来简化代码. 工具 ...

  9. Python基础之用PyQt5写一个tabview

    前面学习了menu的画图,现在学习tabview的画图,关于怎么打开designer.exe部分就不详细介绍了. 第一步:拖动一个Tab Widget控件到窗口去. 将控件拖上去之后就是这个样子,默认 ...

随机推荐

  1. CF 586A 找1的个数和101的个数

    Sample test(s) input 50 1 0 1 1 output 4 input 71 0 1 0 0 1 0 output 4 input 10 output 0 # include & ...

  2. LoadRunner参数化时的中文乱码问题

    http://blog.sina.com.cn/s/blog_6cf205160100mdxi.html

  3. js获取单个查询串的值

    function getSearchString(key) { // 获取URL中?之后的字符 var searchArr= window.location.href.split('#')[0].sp ...

  4. Bzoj4710 分特产(容斥原理+组合数)

    题面 Bzoj 题解 考虑容斥原理,所有人都有特产的方案数等于: 至少零个人没有特产\(-\)至少一个人没有特产\(+\)至少两个人有特产\(-...\) 接着考虑其中一种情况怎么求(假设现在至少有\ ...

  5. 【AI in 美团】深度学习在文本领域的应用

    背景 近几年以深度学习技术为核心的人工智能得到广泛的关注,无论是学术界还是工业界,它们都把深度学习作为研究应用的焦点.而深度学习技术突飞猛进的发展离不开海量数据的积累.计算能力的提升和算法模型的改进. ...

  6. Initramfs 原理和实践

    Linux系统启动时使用initramfs (initram file system), initramfs可以在启动早期提供一个用户态环境,借助它可以完成一些内核在启动阶段不易完成的工作.当然ini ...

  7. Highmaps网页图表教程之下载Highmaps与Highmaps的地图类型

    Highmaps网页图表教程之下载Highmaps与Highmaps的地图类型 认识Highmaps Highmaps是Highcharts的姊妹框架,用来实现地图图表.它完全使用Javascript ...

  8. Revit二次开发示例:ChangesMonitor

    在本示例中,程序监控Revit打开文件事件,并在创建的窗体中更新文件信息.   #region Namespaces using System; using System.Collections.Ge ...

  9. bootm命令移植

    <bootm作用> 为linux内核的启动准备条件 <bootloader作用总结> (1)初始化软/硬件(内存硬件/外部设备/堆栈) (2)启动操作系统 <uImagi ...

  10. 重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor

    一般这个错误是由密码错误引起,解决的办法自然就是重置密码. 假设我们使用的是root账户. 1.重置密码的第一步就是跳过MySQL的密码认证过程,方法如下: #vim /etc/my.cnf(注:wi ...