??xml version="1.0" encoding="utf-8" standalone="yes"?>
什么是LDAP?
什么时候该用LDAP存储数据Q?/strong>
LDAP目录树的l构
单独的LDAP记录
作ؓ例子的一个单独的数据?/strong>
LDAP复制
安全和访问控?/strong>
现在LDAP技术不仅发展得很快而且也是Ȁ动h心的。在企业范围内实?/span>LDAP可以让运行在几乎所有计机q_上的所有的应用E序?/span>LDAP目录中获取信息?/span>LDAP目录中可以存储各U类型的数据Q电子邮件地址、邮件\׃息、h力资源数据、公用密匙、联pMh列表Q等{。通过?/span>LDAP目录作ؓpȝ集成中的一个重要环节,可以化员工在企业内部查询信息的步骤,甚至q主要的数据源都可以攑֜M地方。如?/span>Oracle?/span>Sybase?/span>Informix?/span>Microsoft SQL数据库中已经存储了类似的数据Q那?/span>LDAP和这些数据库到底有什么不同呢Q是什么让它更具优势?Ll读下去吧!
LDAP的英文全U是Lightweight Directory Access ProtocolQ一般都UCؓLDAP。它是基?/span>X.500标准的,但是单多了ƈ且可以根据需要定制。与X.500不同Q?/span>LDAP支持TCP/IPQ这对访?/span>Internet是必ȝ?/span>LDAP的核心规范在RFC中都有定义,所有与LDAP相关?/span>RFC都可以在LDAPman RFC|页中找到?/span>
在日怺谈中Q你可能会听到有些hq么_“我们要把那些东西存在LDAP中吗Q?#8221;Q或?#8220;?/span>LDAP数据库中取出那些数据Q?#8221;Q又或?#8220;我们怎么?/span>LDAP和关pd数据库集成在一P”。严格地_LDAPҎ不是数据库而是用来讉K存储在信息目录(也就?/span>LDAP目录Q中的信息的协议。更为确切和正式的说法应该是象这LQ?#8220;通过使用LDAPQ可以在信息目录的正位|读取(或存储)数据”。但是,也没有必要吹毛求疵,管表达得不够准,我们也都知道Ҏ在说什么?/span>
pSybase?/span>Oracle?/span>Informix?/span>Microsoft的数据库理pȝQ?/span>DBMSQ是用于处理查询和更新关pd数据库那PLDAP服务器也是用来处理查询和更新LDAP目录的。换句话来说LDAP目录也是一U类?/strong>的数据库Q但是不是关pd数据库。不象被设计成每分钟需要处理成百上千条数据变化的数据库Q例如:在电子商务中l常用到的在U交易处理(OLTPQ系l,LDAP主要是优化数据读取的性能?/span>
现在该说?/span>LDAP目录到底有些什么优势了。现?/span>LDAP的流行是很多因数共同作用的结果。我在这里说的不q是一些基本的原因Q请你注意一下这不过是一部分原因?/span>
可能LDAP最大的优势是:可以在Q何计机q_上,用很Ҏ获得的而且数目不断增加?/span>LDAP的客LE序讉KLDAP目录。而且也很Ҏ定制应用E序为它加上LDAP的支持?/span>
LDAP协议是跨q_的和标准的协议,因此应用E序׃用ؓLDAP目录攑֜什么样的服务器上操心了。实际上Q?/span>LDAP得到了业界的q泛认可Q因为它?/span>Internet的标准。商都很愿意在产品中加入对LDAP的支持,因ؓ他们Ҏ不用考虑另一端(客户端或服务端)是怎么L?/span>LDAP服务器可以是M一个开发源代码或商用的LDAP目录服务器(或者还可能是具?/span>LDAP界面的关pd数据库)Q因为可以用同样的协议、客Lq接软g包和查询命o?/span>LDAP服务器进行交互。与LDAP不同的是Q如果Y件商想在Y件品中集成?/span>DBMS的支持,那么通常都要Ҏ一个数据库服务器单独定制?/span>
不象很多商用的关pd数据库,你不必ؓLDAP的每一个客Lq接或许可协议付贏V?/span>
大多数的LDAP服务器安装v来很单,也容易维护和优化?/span>
LDAP服务器可以用“?#8221;?#8220;?#8221;的方法复刉分或全部数据Q例如:可以把数?#8220;?#8221;到远E的办公室,以增加数据的安全性。复制技术是内置?/span>LDAP服务器中的而且很容易配|。如果要?/span>DBMS中用相同的复制功能Q数据库产商׃要你支付额外的费用,而且也很隄理?/span>
LDAP允许你根据需要?/span>ACIQ一般都UCؓACL或者访问控制列表)控制Ҏ据读和写的权限。例如,讑֤理员可以有权改变员工的工作地点和办公室LQ但是不允许改变记录中其它的域?/span>ACI可以Ҏ谁访问数据、访问什么数据、数据存在什么地方以及其它对数据q行讉K控制。因些都是由LDAP目录服务器完成的Q所以不用担心在客户端的应用E序上是否要q行安全查?/span>
LDAP对于q样存储q样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新。例如,q些信息存储?/span>LDAP目录中是十分有效的:
l 公司员工的电话号码簿和组l结构图
l 客户的联pM?/span>
l 计算机管理需要的信息Q包?/span>NIS映射?/span>email假名Q等{?/span>
l 软g包的配置信息
l 公用证书和安全密?/span>
大多数的LDAP服务器都密集型的操作q行专门的优化。因此,当从LDAP服务器中d数据的时候会比从专门?/span>OLTP优化的关pd数据库中d数据快一个数量。也是因Z门ؓȝ性能q行优化Q大多数?/span>LDAP目录服务器ƈ不适合存储需要需要经常改变的数据。例如,?/span>LDAP服务器来存储电话L是一个很好的选择Q但是它不能作ؓ电子商务站点的数据库服务器?/span>
如果下面每一个问题的{案都是“?#8221;Q那么把数据存在LDAP中就是一个好L?/span>
l 需要在Mq_上都能读取数据吗Q?/span>
l 每一个单独的记录Ҏ不是每一天都只有很少的改变?
l 可以把数据存在^面数据库Q?/span>flat databaseQ而不是关pd数据库中吗?换句话来_也就是不什么范式不范式的,把所有东襉K存在一个记录中Q差不多只要满W一范式Q?/span>
最后一个问题可能会唬住一些hQ其实用q面数据库去存储一些关pd的数据也是很一般的。例如,一条公司员工的记录可以包含经理的d名。用LDAP来存储这cM息是很方便的。一个简单的判断ҎQ如果可以把保数据存在一张张的卡片里Q就可以很容易地把它存在LDAP目录里?/span>
LDAP目录以树状的层次l构来存储数据。如果你对自向下的DNS树或UNIX文g的目录树比较熟悉Q也很Ҏ掌握LDAP目录树这个概念了。就?/span>DNS的主机名那样Q?/span>LDAP目录记录的标识名Q?/span>Distinguished NameQ简U?/span>DNQ是用来d单个记录Q以及回溯到树的剙。后面会做详l地介绍?/span>
Z么要用层ơ结构来l织数据呢?原因是多斚w的。下面是可能遇到的一些情况:
l 如果你想把所有的国客户的联pM息都“?#8221;C于到襉K囑֊公室Q负责营销Q的LDAP服务器上Q但是你不想把公司的资理信息“?#8221;到那里?/span>
l 你可能想Ҏ目录树的l构l予不同的员工组不同的权限。在下面的例子里Q资产管理组?#8220;asset-mgmt”部分有完全的讉K权限Q但是不能访问其它地斏V?/span>
l ?/span>LDAP存储和复制功能结合v来,可以定制目录树的l构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每分钟更新的美国销售状늚信息Q但是欧z的销售情况就只要每小时更Cơ就行了?/span>
LDAP目录树的最剙是根,也就是所谓的“基准DN”。基?/span>DN通常使用下面列出的三U格式之一。假定我在名?/span>FooBar的电子商务公司工作,q家公司?/span>Internet上的名字?/span>foobar.com?/span>
o="FooBar, Inc.", c=US
Q以X.500格式表示的基?/span>DNQ?/span>
在这个例子中Q?/span>o=FooBar, Inc. 表示l织名,在这里就是公司名的同义词?/span>c=US 表示公司的总部在美国。以前,一般都用这U方式来表示基准DN。但是事物L在不断变化的Q现在所有的公司都已l(或计划)?/span>Internet上。随着Internet的全球化Q在基准DN中用国家代码很Ҏ让h产生h。现在,X.500格式发展成下面列出的两种格式?/span>
o=foobar.com
Q用公司?/span>Internet地址表示的基?/span>DNQ?/span>
q种格式很直观,用公司的域名作ؓ基准DN。这也是现在最常用的格式?/span>
dc=foobar, dc=com
Q用DNS域名的不同部分组成的基准DNQ?/span>
p上面那一U格式,q种格式也是?/span>DNS域名为基的,但是上面那种格式不改变域名(也就更易读)Q而这U格式把域名Q?/span>foobar.com分成两部?/span> dc=foobar, dc=com?/span>在理ZQ这U格式可能会更灵zM点,但是对于最l用h说也更难记忆一炏V考虑一?/span>foobar.comq个例子。当foobar.com?/span>gizmo.com合ƈ之后Q可以简单的?#8220;dc=com”当作基准DN。把新的记录攑ֈ已经存在?/span>dc=gizmo, dc=com目录下,q样q化了很多工作Q当Ӟ如果foobar.com?/span>wocket.edu合ƈQ这个方法就不能用了Q。如?/span>LDAP服务器是新安装的Q我你用这U格式。再h意一下,如果你打用活动目录(Actrive DirectoryQ,Microsoft已经限制你必M用这U格式?/span>
?/span>UNIX文gpȝ中,最层是根目录Q?/span>rootQ。在根目录的下面有很多的文g和目录。象上面介绍的那PLDAP目录也是用同LҎl织h的?/span>
在根目录下,要把数据从逻辑上区分开。因为历史上Q?/span>X.500Q的原因Q大多数LDAP目录?/span>OU从逻辑上把数据分开来?/span>OU表示“Organization Unit”Q在X.500协议中是用来表示公司内部的机构:销售部、胦务部Q等{。现?/span>LDAPq保?/span>ou=q样的命名规则,但是扩展了分cȝ范围Q可以分cMؓQ?/span>ou=people, ou=groups, ou=devicesQ等{。更低一U的OU有时用来做更l的归类。例如:LDAP目录树(不包括单独的记录Q可能会是这LQ?/span>
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
?/span>LDAP目录中的所有记录项都有一个唯一?#8220;Distinguished Name”Q也是DN。每一?/span>LDAP记录的DN是由两个部分l成的:相对DNQ?/span>RDNQ和记录?/span>LDAP目录中的位置?/span>
RDN?/span>DN中与目录树的l构无关的部分。在LDAP目录中存储的记录w要有一个名字,q个名字通常存在cnQ?/span>Common NameQ这个属性里。因为几乎所有的东西都有一个名字,?/span>LDAP中存储的对象都用它们?/span>cng?/span>RDN的基。如果我把最喜欢的吃燕麦_食谱存Z个记录,我就会用cn=Oatmeal Deluxe作ؓ记录的RDN?/span>
l 我的LDAP目录的基?/span>DN?/span>dc=foobar,dc=com
l 我把自己的食׃?/span>LDAP的记录项存在ou=recipes
l 我的LDAP记录的RDN设ؓcn=Oatmeal Deluxe
上面q些构成了燕麦粥食谱?/span>LDAP记录的完?/span>DN。记住,DN的读法和DNSL名类伹{下面就是完整的DNQ?/span>
cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com
现在为公司的员工讄一?/span>DN。可以用Zcn?/span>uidQ?/span>User IDQ,作ؓ典型的用户帐受例如,FooBar的员?/span>Fran SmithQ登录名Q?/span>fsmithQ的DN可以Z面两U格式:
uid=fsmith,ou=employees,dc=foobar,dc=com
Q基于登录名Q?/span>
LDAPQ以?/span>X.500Q用uid表示“User ID”Q不要把它和UNIX?/span>uidh淆了。大多数公司都会l每一个员工唯一的登录名Q因此用q个办法可以很好C存员工的信息。你不用担心以后q会有一个叫Fran Smith的加入公司,如果Fran改变了她的名字(l婚Q离婚?或宗教原因?Q,也用不着改变LDAP记录的DN?/span>
cn=Fran Smith,ou=employees,dc=foobar,dc=com
Q基于姓名)
可以看到q种格式使用?/span>Common NameQ?/span>CNQ。可以把Common Name当成一个h的全名。这U格式有一个很明显的缺点就是:如果名字改变了,LDAP的记录就要从一?/span>DN转移到另一?/span>DN。但是,我们应该可能地避免改变一个记录项?/span>DN?/span>
你可以用LDAP存储各种cd的数据对象,只要q些对象可以用属性来表示Q下面这些是可以?/span>LDAP中存储的一些信息:
l 员工信息Q员工的姓名、登录名、口令、员工号、他的经理的d名,邮g服务器,{等?/span>
l 物品跟踪信息Q计机名?/span>IP地址、标{、型受所在位|,{等?/span>
l 客户联系列表Q客L公司名、主要联pMh的电话、传真和电子邮gQ等{?/span>
l 会议厅信息:会议厅的名字、位|、可以坐多少人、电话号码、是否有投媄机?/span>
l 食谱信息Q菜的名字、配料、烹调方法以及准备方法?/span>
因ؓLDAP目录可以定制成存储Q何文本或二进制数据,到底存什么要׃自己军_?/span>LDAP目录用对象类型(object classesQ的概念来定义运行哪一cȝ对象使用什么属性。在几乎所有的LDAP服务器中Q你都要Ҏ自己的需要扩展基本的LDAP目录的功能,创徏新的对象cd或者扩展现存的对象cd?/span>
LDAP目录以一pd“属性对”的Ş式来存储记录,每一个记录项包括属性类型和属性|q与关系型数据库用行和列来存取数据有Ҏ的不同)。下面是我存?/span>LDAP目录中的一部分食谱记录Q?/span>
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配料都作ؓ属?/span>recipeIngredient倹{?/span>LDAP目录被设计成象上面那样ؓ一个属性保存多个值的Q而不是在每一个属性的后面用逗号把一pd值分开?/span>
因ؓ用这L方式存储数据Q所以数据库有很大的灵zL,不必为加入一些新的数据就重新创徏表和索引。更重要的是Q?/span>LDAP目录不必p内存或硬盘空间处?#8220;I?#8221;域,也就是说Q实际上不用可选择的域也不会花费你M资源?/span>
让我们看看下面这个例子。我们用Foobar, Inc.的员?/span>Fran Smith?/span>LDAP记录。这个记录项的格式是LDIFQ用来导入和导出LDAP目录的记录项?/span>
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的属性(例如Q?/span>passwordQ在搜烦的时候需要区分大写?/span>
让我们一点一点地分析上面的记录项?/span>
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
q是Fran?/span>LDAP记录的完整DNQ包括在目录树中的完整\径?/span>LDAPQ和X.500Q?/span>uidQ?/span>User IDQ,不要把它?/span>UNIX?/span>uidh淆了?/span>
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
可以ZQ何一个对象根据需要分配多个对象类型?/span>person对象cd要求cnQ?/span>common nameQ和snQ?/span>