前言

这是一个轮子。

作为一个在高校里混的 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. C++拾遗——重新开始

    http://www.cnblogs.com/uniqueliu/category/307731.html

  2. 安装caffe框架所需文件

    安装caffe框架所需文件: 1.微软提供的快速卷积神经网络框架caffe-master安装包或者windows提供的caffe-windows安装包. 链接:http://pan.baidu.com ...

  3. linux 添加samba账户

    1.adduser kilen   添加linux账户 2.cd /etc/samba/ 当前目录下修改smb.conf 文件 ,一般情况下是只读文件,需要修改权下 (用root用户) chmod 7 ...

  4. C++雾中风景5:Explicit's better than implicit.聊聊Explicit.

    关于Explicit还是Implicit一直是编程语言中能让程序员们干起架的争议.那些聪明的老鸟总是觉得Implicit的规则让他们能够一目十行,减少样板代码的羁绊.而很多时候,Implicit的很多 ...

  5. JAVA特性-跨平台/面向对象

    JAVA特点概述 一,跨平台 这无疑是java最大的特点了,我相信大多数人第一次听说java语言大都从跨平台开开始的.实际上java跨平台特性主要体现在两个方面:编码和运行机制. 1,编码 java语 ...

  6. 线段树-最小逆序数hdu1394

    title: 线段树-最小逆序数 date: 2018-10-12 17:19:16 tags: acm 算法 刷题 categories: ACM-线段树 概述 这是一道简单的线段树的题,,,当然还 ...

  7. 项目Alpha冲刺——代码规范、本次冲刺任务与计划

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队) 团队名称: 那周余嘉熊掌将得队 作业目标:代码规范.本次冲刺任务与计划 团队信息: 队员学号 队员姓名 博客 ...

  8. iOS 9应用开发教程之创建iOS 9项目与模拟器介绍

    iOS 9应用开发教程之创建iOS 9项目与模拟器介绍 编写第一个iOS 9应用 本节将以一个iOS 9应用程序为例,为开发者讲解如何使用Xcode 7.0去创建项目,以及iOS模拟器的一些功能.编辑 ...

  9. 1035 Password (20)(20 point(s))

    problem To prepare for PAT, the judge sometimes has to generate random passwords for the users. The ...

  10. Python下读取转换unicode的json格式

    转自: https://blog.csdn.net/felcon/article/details/38524317 JSON(JavaScript Object Notation) 是一种轻量级的数据 ...