1. 前言

LDAP是我经常听到的词汇,但一直没有对其进行系统但学习,现在专门写一篇文章记录对其对理解。

2. LDAP为什么会存在?

我们首先得理解LDAP这个东西为什么会存在,这时候就有一个概念出现了,它就是目录服务。

2.1 目录服务

在局域网中为了方便主机管理,一般使用DHCP分配IP地址给局域网内的各个资产来方便定位,也有可能会配合DNS与域名进行使用。

对于局域网内的一个用户来讲,我们经常需要登陆内部邮箱进行发送邮件等,所以整个局域网内会有很多用户账户,如果每个应用我们都有一个不同的账户的话,那么局域网内的账户总数会是倍增的,很难管理。

对于局域网管理员来说维护这么多账号是个很麻烦的事情,例如出现人员的离职的时候,可能查找很久才能找到其对应的账号与其他信息并进行删除,如果应用很多的话那么工作量也会翻倍,因为每一个应用都有不同的账号。

那么如果有一个产品,能将所有用户的账户进行分类保存,方便管理员查找与管理,那么就可以很大程度简化管理员这方面的工作,目录服务就出现了。可是目录服务的写入性能就非常差了,而且不支持事务处理等容错功能,因此不适合频繁修改数据。但是其读取性能十分的好,所以将不常修改但经常会读取的数据存储在目录服务中,整体效率会有较大提升,像企业员工信息、企业设备信息、证书公钥等具有层次性、且不需要频繁改写的数据都适合使用目录服务来存储。X.500 是 ISO 制定的一套目录服务的标准,它是一个协议族,定义了一个机构如何在全局范围内共享名称和与名称相关联的对象。通过它,可以将局部的目录服务连接起来,构建基于 Internet 的分布在全球的目录服务系统……而目录访问协议(DAP)是 X.500 的核心组成之一。

LDAP只是目录服务的一种派生而已,LDAP是一种协议。LDAP对已有的X.500进行了优化,使得只要一个账户通过了LDAP服务器的认证,则可以一个账户访问局域网内的所有授权资源,极大的减少了管理员的工作量。

基于 LDAP 协议的产品有很多,最有名两个的是开源的 OpenDirectory 以及微软开发的 ActiveDirectory。

2.2 LDAP解决了什么问题

解决了SSO也就是单点登陆,简单的来说,只要符合通过LDAP认证,则可以用同一个账号密码来登陆组织内所有的服务,避免了多次登陆的问题。例如登陆上qq号后,点击空间等各种应用,不用进行二次登陆,这就利用了LDAP实现了SSO。
简单来说就类似于一卡通,一个账号走天下。当公司来了新人的时候,只需要在LDAP里面加入他的账号,这样他就可以访问他账号权限下所有的系统,不需要每个系统分配一个账号,方便进行管理,当其离职的时候,只需要在LDAP服务器中删除账号记录即可。

3. LDAP到底是什么

我理解的LDAP应用是为了管理一个网络内的所有用户的账户而出现的,类似于一个号码簿,对不同的用户进行分类方便管理号码簿的人对其进行查找,可以理解其是一个数据库或者树。这里摘抄我看到的一篇文章里的话:

LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议(这个主要是相对另一目录访问协议X.500而言的;LDAP略去了x.500中许多不太常用的功能,且以TCP/IP协议为基础)。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于经常有写操作的数据存储。同时,LDAP只是一个协议,它没有涉及到如何存储这些信息,因此还需要一个后端数据库组件来实现。这些后端可以 是bdb(BerkeleyDB)、ldbm、shell和passwd等。

相信大家对LDAP已经有了自己的理解。总的来说LDAP的概念是:

  1. LDAP中文名是轻量级目录访问协议,还有一个目录访问协议是x.500,LDAP是对其对一个优化,去掉了其不常用的功能,因此叫做轻量级目录访问协议。

  2. LDAP像数据库,但是有很大的区别,数据库的存在是为了方便数据的增删改查,数据库可以存储数据。而LDAP是一个协议,它没有存储数据的功能,它提供了一种方式来优化数据的读取。
    只有域控能查看与修改整个域的LDAP属性,使用adsiedit.msc
    在这里插入图片描述

  3. LDAP的后端是有一个数据库对数据进行存储的,LDAP只是只是一个协议,并不是数据库本身,它代表一种数据存储与读取的方式。

  4. 一条LDAP记录代表了一个资产在局域网中的位置,如dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com 。

4. LDAP部分细节

LDAP目录以树状结构来显示数据,最顶层的根部称作基准DN,下图中基准DN为DC=test,DC=com。
在这里插入图片描述
LDAP中的每一条记录都是唯一的,并且称之为DN(Distinguished Name),与基准DN是不一样的,而处于LDAP的上叶子位置的部分被称作为RDN相对辨识名;例如:
dn:cn=tom,ou=animals,dc=mydomain,dc=org中tom即为 RDN;RDN在一个OU中必须是唯一的。
LDAP是倒着看的,从右向左依次:

  1. dc=mydomain,dc=org为基准DN。
  2. ou=animals为OU。
  3. cn=tom为RDN。

基准DN就像是树根,OU就像树枝,RDN就像是树叶。如果我们要找某一片特征树叶,就要先确定在哪棵树上,然后确定在指定树的哪个树枝上,最后确定对应哪片树叶。

借用他人的一个例子:

因为LDAP数据是“树”状的,而且这棵树是可以无限延伸的,假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有“分叉”(ou,呵呵MYSQL里面好象没有这 DD),最后就是这个苹果的名字(uid,记得我们设计MYSQL或其它数据库表时,通常为了方便管理而加上一个‘id’字段吗?)。好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵“歪脖树”的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……,晕了!你直接爬上去吧!我还是说说LDAP里要怎么定义一个字段的位置吧,树(dc=waibo,dc=com),分叉(ou=bei,ou=xi,ou= dong),苹果(cn=honglv),好了!位置出来了:
  dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com

5. AD与LDAP的关系

Active Directory应该是LDAP的一个应用实例,而不应该是LDAP本身,AD是基于LDAP协议的一个成熟的应用而已。
我理解的是AD可以对域内的所有资产进行增删改查,但是这一切的操作都是基于LDAP协议实现的,AD 域服务利用 LDAP 命名路径(LDAP naming path)来表示对象在 AD 内的位置,以便用它来访问 AD 内的对象。

6.思考

  1. LDAP不是数据库而是一种协议,市面上有很多基于LDAP协议而做出来的应用。我们使用的大多都是这种应用,类似于邮箱应用就基于SMTP协议一样。

  2. LDAP协议的产生目的是为了方便资产管理,这个资产可能是人,可能是物。

  3. 一般应用场景是:一个域内有一个LDAP服务器,上面存储了很多账号,当我们需要给域内增加一个应用的时候,只要这个应用至此LDAP验证,则此时域内所有LDAP服务器上的账号,都可以使用自己的账户来登陆并使用刚刚添加的应用。如果没有LDAP服务器,则需要给域内每个人准备一个应用的账号。

  4. LDAP主要在应用之间做身份认证,而kerberos是域内的基于主机的身份认证。

7. 基于LDAP的攻击

DC中一般会开放如下几个端口:

  • 389-LDAP
  • 636-LDAPS
  • LDAP全局目录
    在这里插入图片描述

LDAP数据的组织方式:
在这里插入图片描述
在这里插入图片描述
可使用ldapsearch工具与通过其他方式得到的凭据进行LDAP查询进行信息收集:

ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123"   -b dc=test,dc=com "(objectClass=computer)"     

在这里插入图片描述

  1. 查询所有的用户
    ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123"   -b dc=test,dc=com "(objectClass=user)"       sAMAccountName userPrincipalName memberOf
    

在这里插入图片描述

  1. 查询域内计算机
ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123"   -b dc=test,dc=com "(objectClass=computer)"       sAMAccountName

在这里插入图片描述

ldapsearch使用方法:

ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123"   -b cn=Computers,dc=test,dc=com "(objectClass=*)" 

-x 代表普通方式认证
-LLL代表一种显示结果的格式
-H 代表目标目标服务器上的ldap服务,一般是域控的ip或者ldap服务器的ip
-D 代表用户名,域内任意一个账户就可以,不必是域控的账户
-w 代表密码
-b 代表要查询的基础dn,如上述例子中 -b cn=Computers,dc=test,dc=com代表以cn=Computers,dc=test,dc=com为基础的dn,对其Computers下的数据进行查询,如下图:
在这里插入图片描述
如果在其的dn前加上cn=zhangsan,那么就只能查询zhangsan这个分支下所有的数据,如下图:
在这里插入图片描述

ldapsearch相关用法
LDAP学习与查询
LDAP命令用法

7.参考文章

LDAP服务原理详解
统一身份认证
kerberos security
ldapsearch相关用法
LDAP学习与查询
LDAP命令用法

Logo

Authing 是一款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务

更多推荐