zoukankan      html  css  js  c++  java
  • 转: 用 Go 写一个轻量级的 ldap 测试工具

    前言

    这是一个轮子。

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

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

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

    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

    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

  • 相关阅读:
    关于js拖拽功能,拖拽元素的position:fixed;left:0;right:0;样式引起左右拖动元素会出现落后鼠标移动距离的问题
    关于js无法设置input的value的问题
    虚拟机linux 挂载windows共享目录 给linux的nginx服务器使用
    linux Centos7 安装Samba服务
    CentOS 7.1使用yum安装MySql5.6.24
    CentOS7下开启端口
    IE浏览器对虚拟主机配置域名的问题
    关于CI框架加入sphinx官方API接口文件的时候,需要注意的问题
    -webkit-box-flex: 1;属性和 float 属性冲突造成元素看不见的BUG
    第二十四天
  • 原文地址:https://www.cnblogs.com/mafeng/p/10109558.html
Copyright © 2011-2022 走看看