简介

LDAP(Lightweight Directory Access Protocol),轻型目录访问协议。它是基于X.500标准的轻量级目录访问协议。LDAP通常将信息以树的形式存储,一个对象下可以有多个子对象,这样的结构叫做DIT(Directory Information Tree),即目录信息树。

活动目录是微软面向Windows Standard Server,Windows Enterprise Server以及Windows Datacenter Server 提供的,它存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。活动目录使用了一种结构化的数据存储方式,并且以此作为基础对目录信息进行合乎逻辑的分层组织。大多数web应用在尝试使用统一身份认证的时候,就是使用LDAP作为支撑,保证了统一用户身份认证存储。LDAP支持跨平台,可以在单独的服务器上部署实现LDAP,实现与域控相同的功能,从而任何应用都可以直接访问LDAP目录实现认证,信息获取,信息存储,并不是完全依赖域控。

LDAP基础

  1. 基础模型
    信息模型: LDAP的信息表示方式。因为是面向对象的数据库,所以用户对象,计算机对象等通过对象类描述。对象类包含类和属性,为了应付多而复杂的层级关系,在设计时赋予了类继承的特性,降低了复杂度。
    命名模型: LDAP中的条目定位方式。在LDAP中,每个对象都拥有独一无二的DN属性RDN,DN是整个树中唯一的表示,RDN是DN中每一个用逗号分隔开的表达式,如”CN=admin,DC=123root,DC=cin”中有3个RDN。
    功能模型: 包括查询类操作,如搜索,比较;更新类操作,如添加目录,删除条目,修改条目或条目名;认证类操作,如绑定,解绑;其他操作,如放弃和扩展等。
    安全模型: LDAP中的安全模型提供3种认证机制,即匿名认证基本认证SASL(Simple Authentication and Secure Layer)认证。匿名认证即不对用户进行认证,该方法仅对完全公开的方式适用;基本认证是通过用户名和密码进行身份识别,又分为简单密码认证和摘要密码认证;SASL认证是在SSL和TLS安全通道基础上进行的身份认证,包括数字证书的认证。

  2. 应用特性
    名唯一: 在当前活动目录下不能出现相同的对象名,而且该限制是不区分大小写的。如果拥有一个叫Admin的用户,将不允许出现一个为admin的组。
    可继承: 可以继承动态访问权限。通过继承子对象,将自动获取并推迟其父对象的访问权限。如果更改父对象的访问权限,相同的更改将应用于目录树中父对象之下的所有子对象。将资源分组到组织单元之中,通过单个管理操作基于继承来管理资源,从而节省时间。基于继承的管理还提供了前所未有的管理可扩展性。活动目录将网络实体的完全访问权限静态存储在其关联对象的访问控制列表(ACL)中,确保对父对象的访问更改最终应用于所有子对象。如果父对象的权限更改,将为每个子对象重建ACL,一边反映更改。此重建过程需要消耗大量CPU周期和磁盘空间。父对象的权限更改与子对象的ACL重建间存在延迟,因此父对象的访问权限更改不会立即应用于子对象。
    可复制: 基于微软的知识一致性检查器(KCC)进行信息复制,KCC是一个在所有域控上运行并且为林生成复制拓扑的内置进程,会根据网络状态和目录服务配置创建单独的复制拓扑。
    跨平台: 可以在任何计算机平台上使用LDAP客户端进行访问目录服务,也可以很容易在定制软件上完成LDAP支持。
    树结构: 活动目录仅支持OpenLDAP中的树形结构,这样可以更好地体现域内组织架构。

  3. 全局编录服务器
    全局编录服务器(Global Catalog,GC)存储结构和配置目录分区与域控无差别,它本身也是域控,GC只是附加的能力,默认情况下,新林创建的第一个域服务器是GC,此后将新的域控添加到已存在的域中需要指定称为GC。GC存储的是有关整个林中所有域的所有对象信息,而不是仅存储一个活动目录域中的信息。KCC创建复制拓扑,确保每一个活动目录都可以将分区内容传递到林中的每一个GC中。
    默认情况下会在域中的GC上监听TCP端口3268(或3269用于SSL上的LDAP)。直接使用LDAP客户端连接GC相应端口即可访问全局目录,当使用该端口连接时将只允许只读方式。

通信流程

LDAP

  1. 认证
    使用客户端时,请求方发送bindRequest连接LDAP服务,同时会发送用户名和密码进行认证,特殊情况下也允许匿名访问连接。使用简单密码认证时,密码以明文方式保存。
  2. 校验
    接收方会校验bindRequest凭据的可用性,再通过bindResponse返回登录结果。
    在这个包中,有resultCode字段:
    success(0): 认证通过
    operationsError(1): 服务器遇到内部错误
    protocolError(2): 无法识别的版本号或不正确的PDU结构
    authMethodNotSupported(7): 无法识别的SASL机制名称
    strongAuthRequired(8): 服务器要求使用SASL机制执行身份验证
    referral(10): 服务器无法接受此绑定,客户端应尝试另一个
    saslBindInProgress(14): 服务器要求客户端发送新的绑定请求,使用相同的SASL机制,以继续身份验证过程
    inappropriateAuthentication(48): 服务器要求尝试匿名绑定或不提供凭据的客户端提供某种形式的凭据
    invalidCredentials(48): 提供了错误的密码或无法处理SASL凭据
    unavailable(81): 服务器正在关闭
  3. 请求
    当接收方判断登录成功后,根据访问控制请求方进行查询,删除,修改等操作。
    searchRequest: 查询方法,对baseObject目录进行过滤
    modifyRequest: 修改object里的class属性,operation中包括增删改操作
    deleteRequest: 删除object
    modifyDNRequest: 移动或重命名该DN
  4. 响应
    搜索的响应结果分为两部分: searchSesEntrysearchResDone。searchSesEntry包含查询的结果信息,searchResDone返回的是查询状态。

CLDAP

CLDAP(Connectionless Lightweight Directory Access Protocol),是面向无连接的轻量目录访问协议,比LDAP需要的资源更少,因此它使用UDP而不是TCP。

  1. 请求
    客户端发起CLDAP请求
  2. 响应
    服务端返回CLDAP响应包,数据包中记录了关于目标服务器的域内信息,主要通过DS_FLAG值体现。