当前位置: 首页 > news >正文

ldap 身份验证的通用步骤

和利用数据库进行验证类似,LDAP中也是利用登陆名和密码进行验证,LDAP中会定义一个属性password,用来存放用户密码,而登陆名使用较多的都是mail地址。那怎么样才能正确的用LDAP进行身份验证呢,下面是一个正确而又通用的步骤:

      1. 从客户端得到登陆名和密码。注意这里的登陆名和密码一开始并没有被用到。

      2. 先匿名绑定到LDAP服务器,如果LDAP服务器没有启用匿名绑定,一般会提供一个默认的用户,用这个用户进行绑定即可。

      3. 之前输入的登陆名在这里就有用了,当上一步绑定成功以后,需要执行一个搜索,而filter就是用登陆名来构造,形如: "(|(uid=$login)(mail=$login))" ,这里的login就是登陆名。搜索执行完毕后,需要对结果进行判断,如果只返回一个entry,这个就是包含了该用户信息的entry,可以得到该entry的DN,后面使用。如果返回不止一个或者没有返回,说明用户名输入有误,应该退出验证并返回错误信息。

      4. 如果能进行到这一步,说明用相应的用户,而上一步执行时得到了用户信息所在的entry的DN,这里就需要用这个DN和第一步中得到的password重新绑定LDAP服务器。

      5. 执行完上一步,验证的主要过程就结束了,如果能成功绑定,那么就说明验证成功,如果不行,则应该返回密码错误的信息。

      这5大步就是基于LDAP的一个“两次绑定”验证方法,下面这个图能更形象的说明这个过程:

 


       为什么基于LDAP进行验证需要“两次”绑定呢,为什么不能取出password然后和输入进行比较呢,试想一下,如果需要读出密码,服务器上的密码存储要么就不加密,直接可以读出,要么客户就需要知道服务器使用的加密方式,这是不安全,也是不好的,服务器不希望加密方式让客户端知道,客户端也不需要知道这么多。而从实际来看,LDAP服务器对于password属性默认都是不可读的,甚至有的服务器根本就不支持password属性可读,遇到这种情况,也就没有办法取得密码了。

      还有一个问题就是,为什么我们需要第一次绑定?为什么不直接使用DN呢,首先就是关于这个DN,对于一般的客户端程序,其并不知道具体的DN是什么。再者让用户输入DN,给用户带来不便的同时,验证也带来问题,因为如果输入的是个目录树而不是所期望的DN,在进行绑定时有可能会让服务器产生不可预料的错误。

      从上面看来,基于LDAP进行身份验证,最好也是最通用的方法就是“两次绑定”。

 

 

所谓的bind是一个authentication的过程,不要把它想像成“绑定”,既然是认证,就需要一个用户名和密码,openldap中如果出示的用户名和密码错误,服务器会尝试匿名认证,就和匿名ftp一样。当然,在现实配置中可能需要在认证不获得成功就不能做查询操作,这些是在slapd.conf文件中通过设置ACL实现的。

 

 

认证所用的用户名和密码为目录树中某个节点的两个属性(用户名和密码),一般情况下,程序会默认使用uid和userPassword属性。写程序进行认证的时候只要提供这个节点的两个属性就可以了。



相关链接

使用LDAP查询快速提升域权限 http://drops.wooyun.org/pentesting/2125

LDAP注入与防御剖析    http://drops.wooyun.org/tips/967

Further Reading

  • LDAP: Authentication Best Practices
  • Defenses for Directory Servers
  • Security Features of the LDAP Directory Server

相关文章:

  • Openssl多个安全补丁简易分析危害及修复方案
  • Redhat Linux 安全设置脚本
  • nginx中shell脚本封锁采集IP地址
  • Apache和Tomcat限制文件访问或下载
  • Postgresql默认用户名与密码
  • Oracle default SID list
  • Apache服务器禁用TRACE Method防范XSS跨站攻击
  • 网页自适应不同浏览设备的方法
  • 网站降权了魔术收录法帮你恢复收录
  • phpmyadmin加载缓慢的终极解决方法
  • 网页CSS常用英文命名说明
  • linux下mysql命令大全 整理
  • JBoss服务器 /invoker/JMXInvokerServlet/ 接口对外开放
  • IT 圈里经常被读错的词
  • jQuery学习总结(一)
  • 【5+】跨webview多页面 触发事件(二)
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017前端实习生面试总结
  • C++类中的特殊成员函数
  • download使用浅析
  • Gradle 5.0 正式版发布
  • Javascript基础之Array数组API
  • mongodb--安装和初步使用教程
  • passportjs 源码分析
  • Puppeteer:浏览器控制器
  • Python_网络编程
  • Python中eval与exec的使用及区别
  • QQ浏览器x5内核的兼容性问题
  • React组件设计模式(一)
  • SQLServer之创建数据库快照
  • Vultr 教程目录
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聊聊sentinel的DegradeSlot
  • 深入 Nginx 之配置篇
  • 试着探索高并发下的系统架构面貌
  • 我感觉这是史上最牛的防sql注入方法类
  • 阿里云服务器购买完整流程
  • !!Dom4j 学习笔记
  • # 数据结构
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)(1.9) MSP (version 4.2)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (33)STM32——485实验笔记
  • (4)(4.6) Triducer
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (翻译)terry crowley: 写给程序员
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (生成器)yield与(迭代器)generator