ldap入门
2009-12-13 18:26:14 阿炯

LDAP的基本概念
LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,是一种基于 客户机/服务器模式的目录服务访问协议.其实是一话号码簿,LDAP是一种特殊的数据库。

LDAP目录的优势
LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。
LDAP服务器可以用“推”或“拉”的方法复制部分或全部数据,例如:可以把数据“推”到远程的办公室,以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。

LDAP同步配置:
# Where to store the replica logs for database #1
#replogfile     /var/lib/ldap/master-slapd.replog

replogfile /var/lib/ldap/master-slapd.replog
replica         host=192.168.7.108:389
binddn="cn=admin,dc=ldap,dc=monkey,dc=com,dc=de"
bindmethod=simple credentials='password'

LDAP 允许你根据需要使用ACI(一般都称为ACL或者访问控制列表)控制对数据读和写的权限。例如,设备管理员可以有权改变员工的工作地点和办公室号码,但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的,所以不用担心在客户端的应用程序上是否要进行安全检查。

什么时候该用LDAP存储数据?
LDAP对于存储下面这样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新。例如,这些信息存储在LDAP目录中是十分有效的:
* 公司员工的电话号码簿和组织结构图
* 客户的联系信息
* 计算机管理需要的信息,包括NIS映射、email假名,等等
* 软件包的配置信息
* 公用证书和安全密匙

ldap的存储规则

Information model 描述LDAP目录结构

ldap目录结构图如下
ldap目录的根      dc=ldap,dc=monkey,dc=com,dc=de  (基准DN)
/       \
ou                       users          groups
/\      /   \
ou                    user1  user2    it      other
/\   /  \
user                             admin bird  goog   qqq

LDAP目录树的最顶部就是根,也就是所谓的“基准DN”。基准DN通常使用下面列出的三种格式之一:
1)以X.500格式表示的基准DN :o="monkey.com", c=de
2)用公司的Internet地址表示的基准DN:o=monkey.com.de
3)用DNS域名的不同部分组成的基准DN,这也是现在最常用的格式:dc=monkey,dc=com,dc=de

在根目录下,要把数据从逻辑上区分开。大多数LDAP目录用OU从逻辑上把数据分开来。OU表示 “Organization Unit”,在X.500协议中是用来表示公司内部的机构:销售部、财务部,等等。现在LDAP还保留ou=这样的命名规则,但是扩展了分类的范围,可以分类为:ou=people, ou=groups, ou=devices,等等。更低一级的OU有时用来做更细的归类。例如:LDAP目录树(不包括单个条目)可能会是这样的:
dc=ldap,dc=monkey, dc=com,dc=de
ou=groups
ou=it
ou=purchase
ou=administration
ou=customer
ou=usa
ou=asia
ou=japan

一个单条LDAP记录就是一个条目,即目录条目.目录条目的组成如下:
dn: uid=goog,ou=Users,dc=ldap,dc=monkey,dc=com,dc=de (条目名)
objectClass: top
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: goog
sn: goog
uid: goog
uidNumber: 1027
gidNumber: 513
homeDirectory: /home/goog
loginShell: /bin/nologin
gecos: System User
description: System User
sambaSID: S-1-5-21-2655127250-259968048-1391940258-3054
sambaPrimaryGroupSID: S-1-5-21-2655127250-259968048-1391940258-513
displayName: System User
sambaPwdMustChange: 2147483647
sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
00000000
sambaAcctFlags: [U          ]
sambaLMPassword: 44EFCE164AB921CAAAD3B435B51404EE
sambaNTPassword: 32ED87BDB5FDC5E9CBA88547376818D4
sambaPwdCanChange: 1178523372
sambaPwdLastSet: 1178523372
userPassword:: e1NNRDV9Q3dOM3BEaStHcnVvMUMrUTEzZm1BU1BDRVl3PQ==

每个条目都有一个条目名,即DN(Distinguished Name)

条目是具有区别名DN(Distinguished Name)的属性(Attribute)集合,属性由类型(Type)和多个值(Values)组成,类型规定了属性允许存放的值的约束条件,同时也规定了该类型的数据进行比较时规则,LDAP中是用语法(syntax)这一概念来表式属性的取值约束和比较规则的。常用的LDAP Syntax是字符型,为了检索的需要添加了BIN(二进制数据)、CIS(忽略大小写)、CES(大小写敏感)、TEL(电话型)等语法 (Syntax),而不是关系数据库提供的整数、浮点数、日期、货币等类型,同样也不提供象关系数据库中普遍包含的大量的函数,它主要面向数据的查询服务 (查询和修改操作比一般是大于10:1)。

在属性的基础上LDAP还用schema进一步约束目录条目。schema是一种类型定义机制,每种类型定义又成为objectClass,它规定一个该类型的目录条目实例必须的和可选的属性等其它约束。和面向对象的编程语言相似,objectClass支持继承,并且所有的objectClass都是 top的子类型,因为top定义了必须的属性objectClass,所以所有的目录条目实例都有objectClass这个属性。常见的 objectClass有:
InetOrgPerson, OrganizationalUnit, Organization
extensibleObject允许任何属性。

Example:
objectclass ( 1.3.6.1.4.1.42.2.27.4.2.10
NAME 'corbaContainer'
DESC 'Container for a CORBA object'
SUP top
STRUCTURAL
MUST cn )

对象类有五个组件:OID(对象标识)、唯一名称、父对象(SUP)、任何需要的属性(MUST)和允许的属性列表(MAY)。OID 是由 LDAP 目录的内部数据库机制使用的数据标识符。 从概念上讲,它们与 IP 地址相似,因为每个对象类都必须有一个唯一数字。并且象 DNS 和 IP 之间的关系那样,由创建它们的个人进行注册,并由这些人“拥有”。有关注册 OID 的更多信息,请参阅 Internet Assigned Numbers Authority(或 IANA)。

LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。

专用名词解释:
DN=Distinguished Name 一个目录条目的名字
CN=Common Name 为用户名或服务器名,最长可以到80个字符,可以为中文;
OU=Organization Unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文;
O=Organization 为组织名,可以3—64个字符长
C=Country为国家名,可选,为2个字符长
L=Location 地名,通常是城市的名称
ST 州或省的名称
O=Orgnization 组织名称
OU=Orgnizagion Unit 组织单位
STREET 街道地址
UID 用户标识

LDAP客户端和LDAP服务器端交互的一般过程

1. LDAP客户端发起连接请求与LDAP服务器建立会话,LDAP的术语是绑定(binding)。在 建立绑定时客户端通常需要指定访问用户,以便能够访问服务器上的目录信息
2. LDAP客户端发出目录查询、新建、更新、删除、移动目录条目、比较目录条目等操作   3. LDAP客户端结束与服务器的会话,即解除绑定(unbinding)

LDAP的操作基本上有三类:查询、更新和认证
查询是LDAP中最复杂的操作,它允许客户端指定查询的起点、查询的深度、属性需要满足的条件以及最终返回的目录条目所包含的属性。

查询的起点是通过base DN来指定的,查询的深度即范围有三种baseObject, singleLevel, wholeSubtree。baseObject只对base DN指定的目录条目进行查询;singleLevel只对base DN的直接子节点进行查询; wholeSubtree对base DN(包括base DN)的所有子节点查询。属性需要满足的条件是用search filter来表达的。此外,还可以指定别名的解析(Aliase Dereferrencing)和查询的结果集大小限定和查询时间限定。
search filter的基本语法是:
attribute operator value

主要的操作符有:=, >=, <=, =*, ~=其中=*可以表示匹配子字符串,~=近似相等。例子有sn=*表示sn有值的所有目录条目。cn=J*Smi*, sn~=smit。多个简单filter可以用关系操作符组成复合表达式,基本语法是:
(&(filter1)(filter2)...(filtern))
(|(filter1)(filter2)...(filtern))
(!(filter))
例子有:(|(sn=Miler)(sn=Smith)), (|(sn=Miler)(&(ou=Austin)(sn=Smith)))

更新操作
LDAP定义了以下更新操作:
add 创建新的目录条目到目录树种
delete 删除目录条目,只有叶子节点可以删除,删除别名并不影响被引用的节点
modify 修改目录条目的属性,包括增加、删除属性
modify DN 移动目录树

认证操作
LDAP定义了以下认证操作:
bind 该操作用于在LDAP的客户端和服务器之间建立会话
unbind 该操作用于结束LDAP会话
abandon 该操作用于放弃前一个操作

LDAP权限管理
可以通过ACL(访问控制表,Access Control List)来控制对目录的访问。
access to attrs=userPassword,sambaNTPassword,sambaLMPassword,sambaPwdLastSet,sambaPwdMustChange
by dn="cn=admin,ou=DSA,dc=ldap,dc=monkey,dc=com,dc=de" write
by dn="cn=smbldap-tools,ou=DSA,dc=ldap,dc=monkey,dc=com,dc=de" write
by dn="cn=nssldap,ou=DSA,dc=ldap,dc=monkey,dc=com,dc=de" write
by self write
by anonymous auth (need to bind)
by * none (no access)

LDAP+APACHE
如果让ldap 支持apache,你需要做:
1)在编译apache 时,加上以下参数:--with-ldap --enable-ldap --enable-auth-ldap
2)配置apache ,在httpd.conf里加上如下配置:

Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all

###### ldap config
AuthType Basic
AuthLDAPEnabled on
AuthName "Secure Access"
AuthLDAPBindDN cn=admin,dc=ldap,dc=monkey,dc=com,dc=de
AuthLDAPBindPassword xxxxxx
AuthLDAPURL ldap://192.168.7.108:389/ou=Users,dc=ldap,dc=monkey,dc=com,dc=de?uid?sub?(objectClass=*)
require valid-user

LDAP+PHP
如果让ldap 支持php,你需要做:
1)在编译php时,加上以下参数:--with-ldap=/usr/local/ldap

-------------------------------------------------------------------------------------------------------------------
一:LDAP介绍
1:首先,LDAP是一个协议。因此与平台无关,windows可以使用,那么linux也可
2:域账号管理:LDAP(Lightweight Directory Access Protocol),全名为轻量级目录读取访问协议
3:LDAP的架构是主从式,分为服务端和客户端。
4:可定义多层次域架构
5:可定制数据格式
6:安全性好,使用SSL访问数据
7:LDAP数据库,存储共享数据库,以供客户端查询
8:LDAP服务器
9:LDAP客户端
10:LDAP域,分为LDAP父域,LDAP子域,委派等
11:组织单元(Organizational Unit ,),简称OU
12:目录信息树,父域和所有的子域,称为目录信息数

二:OpenLDAP介绍
1:支持LDAPv1,v2,v3各个版本
2:默认支持的数据库格式是bdb
3:openLDAP的软件包

三:LDIF介绍(LDAP Data Interchange Format),称LDAP数据交换格式
说明:LDIF的一些必须了解的概念
项目:每一笔存储于LDAP数据库中的数据称为项目
属性:每一笔项目有一个或一个以上的属性
属性格式--属性:值(值必须是纯文本形式),是LDAP用来存储数据的最小单位,一种属性存储项目的某一个信息。
对象类别:项目存储什么样的属性是由对象类别来定义的,LDAP对象类别用来定义每一个项目要存储哪些属性,即LDAP项目要具备那些属性全由对象类别来定义,一个LDAP项目,可以同时被多个对象类别来定义。
区别名称:项目必须要有一个唯一的识别数据,不能有雷同的。

1:LDIF数据必须符合下列要求
1.1 使用#作为批注
1.2 使用纯文本(Text)的类型存储数据,所有二进制数据必须先转换为文本类型才能存入LDIF数据中
1.3 每一行存储一个属性
1.4 每一个项目必须以dn属性作为开始
1.5 如果有多笔项目,项目之间必须保留一行以上的间隔

2:常见属性如下

属性        说明
dn        定义该项目的区别名称
objectClass        存储项目的对象类别
ou        组织单元的名称
uid        UNIX账户的名称
cn            通用名称
userPassword        存储账户密码
uidNumber        用户账号的UID
gidNumber        群组账户的GID
homeDirectory        家目录
gecos        用户账号的批注
discription        项目的说明文字
loginShell        用户登陆的shell
memberUid        群组的成员

****LDAP允许自定义属性。

3:常见的对象类别

类别            说明
top            代表最顶层的抽象对象类别,也是LDAP中大部分对象类型的父类别
organizationalUnit            用来存储组织单元的数据
account            存储一般地账户数据
posixAccount            存储符合POSIX标准的用户账号数据
shadowAccount            存储账户的Shadow密码数据
posixGroup            存储符合POSIX标准的群组账号数据

****LDAP允许自定义对象类别

四:建立LDAP域服务器
1:所需软件
Openldap -----------------系统默认安装
Openldap-servers-------系统没有默认安装
Openladp-clients--------系统没有默认安装
Openladp-servers-sql------系统没有默认安装
Openladp-devel--------------系统默认安装

**系统没有默认安装的软件请使用yum install来安装,可以解除软件之间的依赖关系。

2:配置openladp服务器

2.1 配置文件
LDAP服务端  /etc/openldap/sldap.conf
重要参数说明:
参数                 说明
include               用来引入其他配置文件的
database             指定后端数据库类型
suffix                定义目录信息树的后缀
rootdn               定义管理者的区别名称
directory             后端数据库的路径
index                定义各种对象类别的索引

**建立LDAP服务器,红色加粗部分需要修改,其他默认就可。

2.2设置LDAP管理者的密码
rootpw     PASSWORD    ####密码是明文的

**可以使用加密的密码,生成之后黏贴过来即可
[root@www ~]#slappasswd

3:初始化LDAP数据库:离线添加和在线添加数据库项目
3.1 目的是生成:域项目和管理者项目
域项目的对象类别是-organization
管理者项目的对象类别是-organizationRole

3.2 离线添加项目

略...

-------------------------------------------------------------------------------------------------------------------

Unix系统中使用OpenLDAP的利弊
随着时间的推移,记忆会慢慢褪色,并在我们的脑海中变得混乱起来。事实证明,技术亦是如此:早在20世纪80年代,人们就创建了轻型目录访问协议(LDAP),以便各种应用程序在开放式系统互联(OSI)X.500目录服务中存/取信息(LDAP最初是因为运行DOS系统的X386电脑无法在 DOS要求的640KRAM中加载X.500的正常访问协议——目录访问协议(DAP),人们才创建了这样一个“轻型”DAP版本,以便这些平台可以查询该目录)。虽然X.500目录以及x386电脑已经像恐龙一样消失了,但通用开放架构库(repository)的理念却继续存在。

虽然LDAP保留了最初的X.500目录服务标准,但是它现在已经从一个支持DOS系统的低级协议发展到了目录服务本身。不止LDAP和库两者的概念出现了混乱,就连开放架构OpenLDAP也与LDAP本身混淆了。现在,许多公司都有“LDAP兼容”目录,比如微软的活动目录、IBM的 Tivoli Directory Service、甲骨文的Java System Directory Server企业版等,都带有企业内部的专有架构。当X.500消失的时候,开放式架构库也随之消失了。

X.500开放标准化的目录(可以用一个供应商的库直接替换另一个供应商的库)已经被今天的LDAP兼容目录所取代,这种目录提供互操作性,即两个供应商的产品可以彼此兼容。但是,OpenLDAP的互操作性使用的是古老的社区开发标准OSI模型。OpenLDAP不像现在的商业产品,它是开源的LDAP兼容目录。它实际上是由更早的X.500的许多残存内容组成。OpenLDAP由OpenLDAP组织负责维护和支持,由OpenLDAP基金会进行协调。OpenLDAP基金会是一个非营利性机构(依靠公司赞助和个人捐款),以促进开源LDAP开发为宗旨。OpenLDAP像大多数LDAP兼容产品一样遵循互联网工程任务组(IETF) RFC-4510标准。该标准定义了与LDAP兼容目录进行相互协作所需要的标准和协议。

OpenLDAP 的最佳使用案例
OpenLDAP的价值有哪些,企业应该如何使用它呢?OpenLDAP可以运行在Windows 和Unix平台上,并且是一个免费的,与LDAP兼容的目录软件。这意味着它可以用作独立的库,或者作为在供应商专有库和应用软件中所使用的源代码。

在Windows系统中采用OpenLDAP不能代替微软的活动目录,因为如上所述,所有的商业LDAP兼容库都是各公司专有的。这意味着活动目录实现了微软其他产品所使用的其他专用对象和API。通过购买微软的这些授权产品,使用Windows系统的企业会得到一些先进的功能,但如果企业使用的应用程序与活动目录不兼容,那么他们必须付更多的钱进行整合、购买授权插件等,或者选择另外一种目录结构。当多种应用程序需要访问LDAP目录时,OpenLDAP可以作为活动目录的代替品,企业不必为使用活动目录而支付额外的费用或获得授权。比如,OpenLDAP可以仿效活动目录的通用地址列表(GAL),为需要该信息的内部开发应用程序提供此信息。此外,其他使用LDAP进行认证以及对象存储的应用程序和平台也可以利用这个免费库。

OpenLDAP也是由社区所开发的。与供应商有限的开发人员和预算相比,这一点使得OpenLDAP可以带来更多的创新。OpenLDAP支持最新LDAP标准(v3.3)中很多可选的LDAP功能和扩展功能,这些功能未必会出现在其他的商业LDAP兼容产品中。目前的OpenLDAP发行版本支持30多种可选功能和扩展功能,包括基于DNS的服务位置(RFC 2247 & RFC 3088)、X.509证书图表RFC 4523)、密码修改操作(RFC 3062)以及其他的功能等等。因为这些功能一般不会得到商业供应商的支持,所以OpenLDAP可能是企业的唯一选择,因为它们需要获取这些功能来支持各种不同的应用程序。那么,这里面有没有隐含的不利因素呢?免费并不意味着成本不会增加。这是因为任何开源软件都会有一些固定成本,或在时间上,或在资源上,比如说:

◆OpenLDAP没有专业人士提供服务,所以负责安装、配置以及维护OpenLDAP的人员必须精通LDAP软件并能创建整合程序,以便把OpenLDAP绑定到使用OpenLDAP数据的应用程序上。

◆OpenLDAP没有GUI界面。所有的安装和配置都必须通过命令行完成。

◆多语言支持只存在于OpenLDAP工程之外的邮寄列表中(特别是没经过OpenLDAP项目认可或者批准的邮件列表)。

◆产品支持由OpenLDAP 网站的问题跟踪系统提供,该系统由OpenLDAP的成员独立支持。

◆尽管OpenLDAP的技术支持网站对更新和补丁有所计划和记录,但是升级和补丁并不是定期公布的。

最后一点必须指出的是,OpenLDAP软件的运行没有保障,正如上文所述,提供支持的组织只能靠赞助和个人捐款。但是,即便存在这些限制,OpenLDAP还是提供了那些专有软件产品不愿提供、也无法提供的功能。当企业希望保持应用程序基础设施多样性而商业目录产品又不能满足所需的自定义水平时,OpenLDAP则将脱颖而出。市场上有了OpenLDAP之后,供应商们总是会想起那个库可以互换的时代。他们需要继续提供各种创新的产品,否则有一天OpenLDAP可能会使得他们的产品走向灭亡。

该文章最后由 阿炯 于 2012-05-07 12:25:40 更新,目前是第 4 版。