LDAP的英文全U是Lightweight Directory Access ProtocolQ一般都UCؓ(f)LDAP。它是基于X.500标准的,但是单多了ƈ且可以根据需要定制。与X.500不同QLDAP支持TCP/IPQ这对访问Internet是必ȝ。LDAP 的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC|页中找到。现在LDAP技术不仅发展得很快而且也是Ȁ动h心的。在企业范围内实现LDAP可以让运行在几乎所有计机q_上的所有的应用E序从LDAP目录中获取信息。LDAP目录中可以存储各U类型的数据Q电(sh)子邮件地址、邮件\׃息、h力资源数据、公用密匙、联pMh列表Q等{。通过把LDAP目录作ؓ(f)pȝ集成中的一个重要环节,可以化员工在企业内部查询信息的步骤,甚至q主要的数据源都可以攑֜M地方?
LDAP目录的优势?
如果需要开发一U提供公׃息查询的pȝ一般的设计Ҏ(gu)可能是采用基于WEB的数据库设计方式Q即前端使用览器而后端用WEB服务器加上关pL据库。后端在Windows的典型实现可能是Windows NT + IIS + Acess 数据库或者是SQL服务器,IIS和数据库之间通过ASP技术用ODBCq行q接Q达到通过填写表单查询数据的功能;
后端在Linuxpȝ的典型实现可能是Linux+ Apache + postgresqlQApache和数据库之间通过PHP3提供的函数进行连接。用上q方法的~点是后端关pL据库的引入导致系l整体的性能降低和系l的理比较J琐Q因为需要不断的q行数据cd的验证和事务的完整性的认Qƈ且前端用户对数据的控制不够灵z,用户权限的设|一般只能是讄在表一U而不是设|在记录一U。?
目录服务的推Z要是解决上述数据库中存在的问题。目录与关系数据库相|是指h描述性的Z属性的记录集合Q但它的数据cd主要是字W型Qؓ(f)了检索的需要添加了BINQ二q制数据Q、CISQ忽略大写Q、CES Q大写敏感Q、TELQ电(sh)话型Q等语法QSyntaxQ,而不是关pL据库提供的整数、QҎ(gu)、日期、货币等cdQ同样也不提供象关系数据库中普遍包含的大量的函数Q它主要面向数据的查询服务(查询和修Ҏ(gu)作比一般是大于10:1Q,不提供事务的回滚QrollbackQ机Ӟ它的数据修改使用单的锁定机制实现All-or-NothingQ它的目标是快速响应和大容量查询ƈ且提供多目录服务器的信息复制功能?
现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是:(x)可以在Q何计机q_上,用很Ҏ(gu)获得的而且数目不断增加的LDAP的客L(fng)E序讉KLDAP目录。而且也很Ҏ(gu)定制应用E序为它加上LDAP的支持。?
LDAP协议是跨q_的和标准的协议,因此应用E序׃用ؓ(f)LDAP目录攑֜什么样的服务器上操心了。实际上QLDAP 得到了业界的q泛认可Q因为它是Internet的标准。商都很愿意在产品中加入对LDAP的支持,因ؓ(f)他们Ҏ(gu)不用考虑另一端(客户端或服务端)是怎么L(fng)。LDAP服务器可以是M一个开发源代码或商用的LDAP目录服务器(或者还可能是具有LDAP界面的关pd数据库)Q因为可以用同样的协议、客L(fng)q接软g包和查询命o与LDAP服务器进行交互。与LDAP不同的是Q如果Y件商想在Y件品中集成对DBMS的支持,那么通常都要Ҏ(gu)一个数据库服务器单独定制。不象很多商用的关系型数据库Q你不必为LDAP的每一个客L(fng)q接或许可协议付费 大多数的LDAP服务器安装v来很单,也容易维护和优化。?
LDAP服务器可以用“推”或“拉”的Ҏ(gu)复制部分或全部数据,例如Q可以把数据推”到q程的办公室Q以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配|。如果要在DBMS中用相同的复制功能Q数据库产商׃(x)要你支付额外的费用,而且也很隄理。?
LDAP允许你根据需要用ACIQ一般都UCؓ(f)ACL或者访问控制列表)控制Ҏ(gu)据读和写的权限。例如,讑֤理员可以有权改变员工的工作地点和办公室L(fng)Q但是不允许改变记录中其它的域。ACI可以Ҏ(gu)谁访问数据、访问什么数据、数据存在什么地方以及其它对数据q行讉K控制。因些都是由LDAP目录服务器完成的Q所以不用担心在客户端的应用E序上是否要q行安全查?
LDAPQLightweight Directory Acess ProtocolQ是目录服务在TCP/IP上的实现QRFC 1777 V2版和RFC 2251V3版)。它是对X500的目录协议的ULQ但是简化了实现Ҏ(gu)Q所以称量的目录服务。在LDAP中目录是按照?wi)型l构l织Q目录由条目QEntryQ组成,条目相当于关pL据库中表的记录;条目是具有区别名DNQDistinguished NameQ的属性(AttributeQ集合,DN相当于关pL据库表中的关键字QPrimaryKeyQ;属性由cdQTypeQ和多个|ValuesQ组成,相当于关pL据库中的域(FieldQ由域名和数据类型组成,只是Z方便索的需要,LDAP中的Type可以有多个ValueQ而不是关pL据库中ؓ(f)降低数据的冗余性要求实现的各个域必L不相关的。LDAP中条目的l织一般按照地理位|和l织关系q行l织Q非常的直观。LDAP把数据存攑֜文g中,为提高效率可以用基于烦引的文g数据库,而不是关pL据库。LDAP协议集还规定了DN的命名方法、存取控制方法、搜索格式、复制方法、URL格式、开发接口等LDAP对于q样存储q样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新?
例如Q这些信息存储在LDAP目录中是十分有效的:(x)
l 公司员工的电(sh)话号码簿和组l结构图
l 客户的联pM息?
l 计算机管理需要的信息Q包括NIS映射、email假名Q等{?
l 软g包的配置信息
l 公用证书和安全密匙?
什么时候该用LDAP存储数据
大多数的LDAP服务器都密集型的操作q行专门的优化。因此,当从LDAP服务器中d数据的时候会(x)比从专门为OLTP优化的关pd数据库中d数据快一个数量。也是因Z门ؓ(f)ȝ性能q行优化Q大多数的LDAP目录服务器ƈ不适合存储需要需要经常改变的数据。例如,用LDAP服务器来存储?sh)话L(fng)是一个很好的选择Q但是它不能作ؓ(f)?sh)子商务站点的数据库服务器。?
如果下面每一个问题的{案都是“是”,那么把数据存在LDAP中就是一个好L。?
l 需要在Mq_上都能读取数据吗Q?
l 每一个单独的记录Ҏ(gu)不是每一天都只有很少的改变?
l 可以把数据存在^面数据库Qflat databaseQ而不是关pd数据库中吗?换句话来_(d)也就是不什么范式不范式的,把所有东襉K存在一个记录中Q差不多只要满W一范式Q。?
最后一个问题可能会(x)唬住一些hQ其实用q面数据库去存储一些关pd的数据也是很一般的。例如,一条公司员工的记录可以包含经理的d名。用LDAP来存储这cM息是很方便的。一个简单的判断Ҏ(gu)Q如果可以把保数据存在一张张的卡片里Q就可以很容易地把它存在LDAP目录里。?
安全和访问控制?
LDAP提供很复杂的不同层次的访问控制或者ACI。因q些讉K可以在服务器端控Ӟq比用客L(fng)的Y件保证数据的安全可安全多了。?
用LDAP的ACIQ可以完成:(x)
l l予用户改变他们自己的电(sh)话号码和家庭地址的权限,但是限制他们对其它数据(如,职务名称Q经理的d名,{等Q只有“只诠Z权限。?
l l予“HR-admins"l中的所有h权限以改变下面这些用L(fng)信息Q经理、工作名U、员工号、部门名U和部门受?
但是对其它域没有写权限。?
l 止M人查询LDAP服务器上的用户口令,但是可以允许用户改变他或她自q口o。?
l l予l理讉K他们上的家庭电(sh)话的只读权限Q但是禁止其他h有这个权限。?
l l予“host-admins"l中的Q何h创徏、删除和~辑所有保存在LDAP服务器中的与计算Z机有关的信息
l 通过WebQ允许“foobar-sales"l中的成员有选择地给予或止他们自己d一部分客户联系数据的读权限。这允总们把客户联系信息下蝲到本地的W记本电(sh)脑或个h数字助理QPDAQ上。(如果销售h员的软g都支持LDAP,q将非常有用Q?
l 通过WebQ允许组的所有者删除或d他们拥有的组的成员。例如:(x)可以允许销售经理给予或止销售h员改变Web늚权限。也可以允许邮g假名Qmail aliaseQ的所有者不l过IT技术h员就直接从邮件假名中删除或添加用戗?
“公用”的邮g列表应该允许用户从邮件假名中d或删除自己(但是只能是自己)。也可以对IP地址或主机名加以限制。例如,某些域只允许用户IP地址?92.168.200.*开头的有读的权限,或者用户反向查找DNS得到的主机名必须?.foobar.com。?
LDAP目录?wi)的l构
LDAP目录以树(wi)状的层次l构来存储数据。如果你对自向下的DNS?wi)或UNIX文g的目录树(wi)比较熟?zhn)Q也很Ҏ(gu)掌握LDAP目录?wi)这个概念了。就象DNS的主机名那样QLDAP目录记录的标识名QDistinguished NameQ简UDNQ是用来d单个记录Q以及回溯到?wi)的剙。后面会(x)做详l地介绍。?
Z么要用层ơ结构来l织数据呢?原因是多斚w的。下面是可能遇到的一些情况:(x)
l 如果你想把所有的国客户的联pM息都“推”到位于到西雅图办公室(负责营销Q的LDAP服务器上Q但是你不想把公司的资理信息“推”到那里。?
l 你可能想Ҏ(gu)目录?wi)的l构l予不同的员工组不同的权限。在下面的例子里Q资产管理组对“asset-mgmt"部分有完全的讉K权限Q但是不能访问其它地斏V?
l 把LDAP存储和复制功能结合v来,可以定制目录?wi)的l构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每分钟更新的美国销售状늚信息Q但是欧z的销售情况就只要每小时更Cơ就行了。?
刨根问底Q基准DN
LDAP目录?wi)的最剙是根,也就是所谓的“基准DN"。基准DN通常使用下面列出的三U格式之一。假定我在名为FooBar的电(sh)子商务公司工作,q家公司在Internet上的名字是foobar.com。?
o="FooBar, Inc.", c=US
Q以X.500格式表示的基准DNQ?
在这个例子中Qo=FooBar, Inc. 表示l织名,在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前,一般都用这U方式来表示基准DN。但是事物L在不断变化的Q现在所有的公司都已l(或计划)上Internet上。随着Internet的全球化Q在基准DN中用国家代码很Ҏ(gu)让h产生h。现在,X.500格式发展成下面列出的两种格式。?
o=foobar.com
Q用公司的Internet地址表示的基准DNQ?
q种格式很直观,用公司的域名作ؓ(f)基准DN。这也是现在最常用的格式。?
dc=foobar, dc=com
Q用DNS域名的不同部分组成的基准DNQ?
p上面那一U格式,q种格式也是以DNS域名为基的,但是上面那种格式不改变域名(也就更易读)Q而这U格式把域名Qfoobar.com分成两部分 dc=foobar, dc=com。在理论上,q种格式可能?x)更灉|一点,但是对于最l用h说也更难记忆一炏V考虑一下foobar.comq个例子。当foobar.com和gizmo.com合ƈ之后Q可以简单的把“dc=com"当作?
准DN。把新的记录攑ֈ已经存在的dc=gizmo, dc=com目录下,q样q化了很多工作Q当Ӟ如果foobar.com和wocket.edu合ƈQ这个方法就不能用了Q。如果LDAP服务器是新安装的Q我你用这U格式。再h意一下,如果你打用活?
目录QActrive DirectoryQ,Microsoft已经限制你必M用这U格式。?
更上一层楼Q在目录?wi)中怎么l织数据
在UNIX文gpȝ中,最层是根目录QrootQ。在根目录的下面有很多的文g和目录。象上面介绍的那PLDAP目录也是用同L(fng)Ҏ(gu)l织h的。?
在根目录下,要把数据从逻辑上区分开。因为历史上QX.500Q的原因Q大多数LDAP目录用OU从逻辑上把数据分开来。OU表示“Organization Unit"Q在X.500协议中是用来表示公司内部的机构:(x)销售部、胦务部Q等{。现在LDAPq保留ou=q样的命名规则,但是扩展了分cȝ范围Q可以分cMؓ(f)Qou=people, ou=groups, ou=devicesQ等{。更低一U的OU有时用来做更l的归类。例如:(x)LDAP目录?wi)(不包括单独的记录Q可能会(x)是这L(fng)Q?
dc=foobar, dc=com
ou=customers
ou=asia
ou=europe
ou=usa
ou=employees
ou=rooms
ou=groups
ou=assets-mgmt
ou=nisgroups
ou=recipes
单独的LDAP记录
DN是LDAP记录的名字
在LDAP目录中的所有记录项都有一个唯一的“Distinguished Name"Q也是DN。每一个LDAP记录的DN是由两个部分l成的:(x)相对DNQRDNQ和记录在LDAP目录中的位置。?
RDN是DN中与目录?wi)的l构无关的部分。在LDAP目录中存储的记录w要有一个名字,q个名字通常存在cnQCommon NameQ这个属性里。因为几乎所有的东西都有一个名字,在LDAP中存储的对象都用它们的cng为RDN的基。如果我把最喜欢的吃燕麦_食谱存Z个记录,我就?x)用cn=Oatmeal Deluxe作ؓ(f)记录的RDN。?
l 我的LDAP目录的基准DN是dc=foobar,dc=com
l 我把自己的食׃为LDAP的记录项存在ou=recipes
l 我的LDAP记录的RDN设ؓ(f)cn=Oatmeal Deluxe
上面q些构成了燕麦粥食谱的LDAP记录的完整DN。记住,DN的读法和DNSL名类伹{下面就是完整的DNQ?
cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com
举一个实际的例子来说明DN
现在为公司的员工讄一个DN。可以用Zcn或uidQUser IDQ,作ؓ(f)典型的用户帐受例如,FooBar的员工Fran Smith
Q登录名QfsmithQ的DN可以Z面两U格式:(x)
uid=fsmith,ou=employees,dc=foobar,dc=com
Q基于登录名Q?
LDAPQ以及X.500Q用uid表示“User ID"Q不要把它和UNIX的uidh淆了。大多数公司都会(x)l每一个员工唯一的登录名Q因此用q个办法可以很好C存员工的信息。你不用担心以后q会(x)有一个叫Fran Smith的加入公司,如果Fran改变了她的名字(l婚Q离婚?或宗教原因?Q,也用不着改变LDAP记录的DN。?
cn=Fran Smith,ou=employees,dc=foobar,dc=com
Q基于姓名)
可以看到q种格式使用了Common NameQCNQ。可以把Common Name当成一个h的全名。这U格式有一个很明显的缺点就是:(x)如果名字改变了,LDAP的记录就要从一个DN转移到另一个DN。但是,我们应该可能地避免改变一个记录项的DN。?
定制目录的对象类型?
你可以用LDAP存储各种cd的数据对象,只要q些对象可以用属性来表示Q下面这些是可以在LDAP中存储的一些信息:(x)
l 员工信息Q员工的姓名、登录名、口令、员工号、他的经理的d名,邮g服务器,{等。?
l 物品跟踪信息Q计机名、IP地址、标{、型受所在位|,{等。?
l 客户联系列表Q客L(fng)公司名、主要联pMh的电(sh)话、传真和?sh)子邮gQ等{。?
l ?x)议厅信息?x)?x)议厅的名字、位|、可以坐多少人、电(sh)话号码、是否有投媄机。?
l 食谱信息Q菜的名字、配料、烹调方法以及准备方法。?
因ؓ(f)LDAP目录可以定制成存储Q何文本或二进制数据,到底存什么要׃自己军_。LDAP目录用对象类型(object classesQ的概念来定义运行哪一cȝ对象使用什么属性。在几乎所有的LDAP服务器中Q你都要Ҏ(gu)自己的需要扩展基本的LDAP目录
的功能,创徏新的对象cd或者扩展现存的对象cd。?
LDAP目录以一pd“属性对”的形式来存储记录项Q每一个记录项包括属性类型和属性|q与关系型数据库用行和列来存取数据有Ҏ(gu)的不同)。下面是我存在LDAP目录中的一部分食谱记录Q?
dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com
cn: Instant Oatmeal Deluxe
recipeCuisine: breakfast
recipeIngredient: 1 packet instant oatmeal
recipeIngredient: 1 cup water
recipeIngredient: 1 pinch salt
recipeIngredient: 1 tsp brown sugar
recipeIngredient: 1/4 apple, any type
h意上面每一U配料都作ؓ(f)属性recipeIngredient倹{LDAP目录被设计成象上面那样ؓ(f)一个属性保存多个值的Q而不是在每一个属性的后面用逗号把一pd值分开。?
因ؓ(f)用这L(fng)方式存储数据Q所以数据库有很大的灵zL,不必为加入一些新的数据就重新创徏表和索引。更重要的是QLDAP目录不必p内存或硬盘空间处理“空”域Q也是_(d)实际上不使用可选择的域也不?x)花费你M资源。?
作ؓ(f)例子的一个单独的数据?
让我们看看下面这个例子。我们用Foobar, Inc.的员工Fran Smith的LDAP记录。这个记录项的格式是LDIFQ用?
导入和导出LDAP目录的记录项。?
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
mailRoutingAddress: fsmith@foobar.com
mailhost: mail.foobar.com
userpassword: {crypt}3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
属性的值在保存的时候是保留大小写的Q但是在默认情况下搜索的时候是不区分大写的。某些特D的属性(例如QpasswordQ在搜烦的时候需要区分大写。?
让我们一点一点地分析上面的记录项。?
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
q是Fran的LDAP记录的完整DNQ包括在目录?wi)中的完整\径。LDAPQ和X.500Q用uidQUser IDQ,不要把它和UNIX的uidh淆了。?
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
可以ZQ何一个对象根据需要分配多个对象类型。person对象cd要求cnQcommon nameQ和snQsurnameQ这两个域不能ؓ(f)I。persion对象cd允许有其它的可选域Q包括givenname、telephonenumberQ等{。organizational Personlperson加入更多的可选域QinetOrgPerson又加入更多的可选域Q包括电(sh)子邮件信息)。最后,foobarPerson是ؓ(f)Foobar定制的对象类型,加入了很多定制的属性。?
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
以前说过了,uid表示User ID。当看到uid的时候,在脑袋里想一想“login"。?
h意CN有多个倹{就象上面介l的QLDAP允许某些属性有多个倹{ؓ(f)什么允许有多个值呢Q假定你在用公司的LDAP服务器查找Fran的电(sh)话号码。你可能只知道她的名字叫FranQ但是对人力资源处的人来说她的正式名字叫做Frances。因Z存了她的两个名字Q所以用M一个名字检索都可以扑ֈFran的电(sh)话号码电(sh)子邮件和办公戉KP{等。?
mailRoutingAddress: fsmith@foobar.com
mailhost: mail.foobar.com
p现在大多数的公司都上|了QFoobar用Sendmail发送邮件和处理外部邮g路由信息。Foobar把所有用L(fng)邮g信息都存在LDAP中。最新版本的Sendmail支持q项功能。?
Userpassword: {crypt}3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
gecos: Frances Smith
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
注意QFoobar的系l管理员把所有用L(fng)口o映射信息也都存在LDAP中。FoobarPersoncd的对象具有这U能力。再注意一下,用户口o是用UNIX的口令加密格式存储的。UNIX的uid在这里ؓ(f)uidnumber。提醒你一下,关于如何在LDAP中保存NIS信息Q有完整的一份RFC。在以后的文章中我会(x)谈一谈NIS的集成。?
LDAP复制
LDAP服务器可以用基于“推”或者“拉”的技术,用简单或Z安全证书的安全验证,复制一部分或者所有的数据。?
例如QFoobar有一个“公用的”LDAP服务器,地址为ldap.foobar.comQ端口ؓ(f)389。Netscape Communicator的电(sh)子邮件查询功能、UNIX的“ph"命o要用到这个服务器Q用户也可以在Q何地Ҏ(gu)询这个服务器上的员工和客戯pM息。公司的主LDAP服务器运行在相同的计机上,不过端口h1389。?
你可能即不想让员工查询资产管理或食谱的信息,又不惌信息技术h员看到整个公司的LDAP目录。ؓ(f)了解册个问题,Foobar有选择地把子目录树(wi)从主LDAP服务器复制到“公用”LDAP服务器上Q不复制需要隐藏的信息。ؓ(f)了保持数据始l是最新的Q主目录服务器被讄成即时“推”同步。这些种Ҏ(gu)主要是ؓ(f)了方便,而不是安全,
因ؓ(f)如果有权限的用户x询所有的数据Q可以用另一个LDAP端口。?
假定Foobar通过从奥克兰到欧z的低带宽数据的q接用LDAP理客户联系信息。可以徏立从ldap.foobar.com:1389 到munich-ldap.foobar.com:389的数据复Ӟ象下面这P(x)
periodic pull: ou=asia,ou=customers,o=sendmail.com
periodic pull: ou=us,ou=customers,o=sendmail.com
immediate push: ou=europe,ou=customers,o=sendmail.com
“拉”连接每15分钟同步一ơ,在上面假定的情况下够了。“推”连接保证Q何欧z的联系信息发生了变化就 立即被“推”到Munich。用上面的复制模式,用户Z讉K数据需要连接到哪一台服务器呢?在Munich的用户可以简单地q接到本地服务器。如果他们改变了数据Q本地的LDAP服务器就?x)把q些变化传到主LDAP服务器。然后,主LDAP服务器把q些变化“推”回本地的“公用”LDAP服务器保持数据的同步。这Ҏ(gu)地的用户有很大的好处Q因为所有的查询Q大多数是读Q都在本地的服务器上q行Q速度非常快。当需要改变信息的时候,最l用户不需要重新配|客L(fng)的YӞ因ؓ(f)LDAP目录服务器ؓ(f)他们完成了所有的数据交换工作