到底什么是 OpenLDAP?

本贴最后更新于 1911 天前,其中的信息可能已经事过景迁

这一篇主要介绍的是目录服务的相关基础常识, 尤其是由 slapd(8)提供的目录服务. 什么是 slapd, 什么是 x.500 标准. 在这篇中都会简单的介绍到.

什么是目录服务

首先强调一点此目录非彼目录. 这里的目录说的像是电话本那样的目录项形式.
一个目录就是特殊化的数据库, 可以提供搜索, 浏览, 除此之外还提供基本的查看和更新功能.
目录往往包含描述性的, 基于属性的信息. 并且支持复杂的过滤功能. 目录通常不支持在为处理大量复杂更新而设计的数据库管理系统中发现的复杂事务或回滚方案. 目录的更新是很简单直接的"all-or-nothing"原则. 目录一般用于相应高容量查找或搜索操作. 它们或许具有广泛复制信息的能力, 以提高可用性和可靠性. 同时缩短响应时间. 复制目录信息时,只要及时解决不一致问题,副本之间的临时不一致无伤大雅了, 也就是说是可以接受的.
提供一个目录服务有着许多不同的方式. 不同的方法允许将不同类型的信息存放在目录中, 对如何引用, 查询和更新信息, 如何保护未授权的访问等提出不同的要求.
一些目录服务是本地类型的, 为一些受限制的环境提供服务(比如说在单机上的指纹操作).还有一些服务是全局性的, 向更广阔的环境中提供服务(比如整个 Internet). 这种全局性的服务一般情况下都是分布式的, 也就是说它们的服务会分散到多台机器上. 所有的这些一起提供目录服务. 通常, 全局服务定义统一命名空间,无论您在何处与数据本身相关, 都可以提供相同的数据视图.
Web 目录 dmoz 是目录服务的一个很好的示例. 这些服务对网页进行编目, 专门用于支持浏览和搜索. 虽然有些人认为互联网域名系统(DNS)是全球分布式目录服务的一个例子, 但 DNS 不可浏览也不可搜索. 它被更恰当地描述为全局分布式查找服务.

官方说来 LDAP 是什么?

LDAP 代表的是轻量级的目录服务访问协议(Lightweight Directory Access Protocol). 就像这个命名, 它是个轻量级的协议用来访问目录服务的. 尤其是基于 X.500 的目录服务. LDAP 使用 TCP/IP 或者其他面向连接的网络服务进行数据传输.
结下来将会从用户的角度鸟瞰 LDAP.
什么类型的信息可以存储在目录中?
首先说 LDAP 信息模型是基于条目的. 条目是具有全局唯一可分辨名称(DN)的属性的集合. DN 用于明确指代条目. 每一个条目的属性有一个类型喝一个到多个值. 类型一般是易于记忆的字符串, 比如"cn"表示的就是 common name, "mail"表示的就是 email 地址. value 的语法格式取决于条目的属性类型. 比如说, 一个属性类型"cn"可能包含的值是"Babs Jensen", 一个属性类型"email"可能包含的值是"babs@example.com". 一个"jpegPhoto"属性类型可能包含一个 JPEG 格式的图片.
信息是怎么被安排的?
在 LDAP 中, 目录条目以分层树状结构排列. 传统上, 这种结构反映了地理和/或组织边界. 表示国家的条目显示在树的顶部. 下面是代表各州和国家组织的条目. 它们下面可能是表示组织单位, 人员, 打印机, 文档或您可以想到的任何其他内容的条目. 下面这个图就是传统意义下的 LDAP 目录树:
traditionalLDAPdirtree.png
还可以根据网络中域名的方式来安排树. 这种命名方法正变得越来越流行, 因为它允许使用 DNS 定位目录服务. 下面这个图就是基于 DNS 命名形式的 LDAP 目录服务:
WechatIMG26.png
LDAP 允许通过使用名为"objectClass"的特殊属性来控制条目中所需和允许的属性. "objectClass"属性的值确定条目必须遵守的模式规则. 条目由其可分辨名称引用, 该名称通过获取条目本身的名称(称为相对可分辨名称或 RDN)并连接其祖先条目的名称来构造. 这里有点抽象, 先不用管.
信息是怎么被访问的?
LDAP 定义了询问和更新目录的操作, 提供操作以添加和删除目录中的条目, 更改现有条目以及更改条目的名称. 但是大多数时侯, LDAP 是用来在目录服务中搜索信息的. LDAP 搜索操作允许搜索目录的某些部分以查找与搜索过滤器指定的某些条件匹配的条目. 可以从符合条件的每个条目请求信息.
如何保护信息免受未经授权的访问?
某些目录服务不提供保护, 允许任何人查看信息. LDAP 为客户端提供了一种机制, 用于对目录服务器进行身份验证或证明其身份, 为丰富的访问控制铺平道路, 以保护服务器包含的信息. LDAP 还支持数据安全性(完整性和机密性)服务.

When should I use LDAP?

通常, 当您需要通过基于标准的方法集中管理, 存储和访问数据时, 应使用目录服务器. 在实际生产中的一些例子, 但是不仅限于此:

  • 机器认证
  • 用户认证
  • 用户/系统组
  • 地址簿
  • 组织代表(Organization Representation)
  • 审计追踪
  • 电话信息存储
  • 用户资源管理
  • 邮件地址查询
  • 应用配置存储
  • PBX 配置存储
    ....

How does LDAP work?

LDAP 使用的是 CS 模型. 一个或者多个 LDAP 服务器包含的信息组成了目录信息树(DIT). 客户端连接到服务器并询问它是一个问题. 服务器响应答案和/或指向客户端可以获取其他信息的位置(通常是另一个 LDAP 服务器). 无论客户端连接到哪个 LDAP 服务器, 它都会看到相同的目录视图; 提供给一个 LDAP 服务器的名称, 引用它在另一个 LDAP 服务器上的相同条目. 这是全局目录服务的一个重要特性.

What about X.500?

从技术上讲, LDAP 是 X.500 目录服务(OSI 目录服务)的目录访问协议. 最初, LDAP 客户端访问 X.500 目录服务的网关. 此网关在客户端和网关之间运行 LDAP, 并在网关和 X.500 服务器之间运行 X.500 的目录访问协议(DAP). DAP 是一种重量级协议, 可在完整的 OSI 协议栈上运行, 并且需要大量的计算资源. LDAP 旨在通过 TCP/IP 进行操作, 并以更低的成本提供 DAP 的大部分功能.
虽然 LDAP 仍然用于通过网关访问 X.500 目录服务, 但现在更常见的是在 X.500 服务器中直接实现 LDAP.
可以将独立 LDAP 守护程序或 slapd(8)视为轻量级 X.500 目录服务器. 也就是说, 它没有实现 X.500 的 DAP, 也不支持完整的 X.500 型号.
可以将数据从 LDAP 目录服务器复制到 X.500 DAP DSA. 这需要 LDAP/DAP 网关. OpenLDAP 软件不包括这样的网关.

通俗说来 LDAP 是什么?

LDAP 是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写, 其实是一种目录服务, 类似于我们在文件系统中所使用的目录, 类似于我们查询电话号码使用的电话号码簿, 类似于我们所使用诸如 NIS(Network Information Service)、DNS (Domain Name Service)等网络目录, 也类似于你在花园中所看到的树木. LDAP 是一种特殊的数据库. 但是 LDAP 和一般的数据库不同, 明白这一点是很重要的. LDAP 对查询进行了优化, 与写性能相比 LDAP 的读性能要优秀很多.

一般地, 目录服务提供什么样的服务呢?

通常是根据查询的标准返回一定的信息.
实例:

文件系统目录

ls /etc

返回 /etc 目录下所有的文件和子目录.

ls /etc/p*   

返回/etc 下所有以 p 开头的文件和子目录.

find /usr/local/apache -name index.html   

这将在"/usr/local/apache"目录下搜索名为 index.html 的文件/子目录.

NIS 目录

ypcat passwd   

这将从 NIS 数据库返回用户名、密码、用户 id 等信息.

ypmatch atif passwd   

返回用户 atif 的密码.

DNS 目录

nslookup www.linuxfocus.org   

返回 www. linuxfocus.org 的 ip 地址.

nslookup -type MX linuxfocus.org 

返回主机名符合 linuxfocus.org 的 MX 记录信息.

LDAP 目录
(我们将在下面详细阐述)

ldapsearch uid=aghaffar 

返回关于用户 aghaffar 的所有公开信息.
这和 find / -uid aghaffar unix 命令很类似.

ldapsearch uid=aghaffar mail   

返回用户 ughaffar 的邮件信息.

目录基础或根

在上面我们所提到的任何一种目录服务中都有一个我们开始浏览或搜索的开始点. 这个开始点就是通常所谓的根. 这和一棵数的根也很类似, 每棵都有一个根, 以及很多的树枝树叶.

  • 文件系统的根是 /
  • NIS 的根是域名, 比如 "linuxfocus.org"
  • DNS 根是 Internic(译者注: Internet 网络信息中心, Internet 的管理组织)
  • LDAP 同样有一个可定义的根, 比如 "o=linuxfocus.org", 这里 o 表示组织
    每个根都可以衍生出好多枝叶(正如同你邻居的花园中的树木一样) 对于文件系统来说, 它的枝叶就是一个个文件及子目录. 每一个枝叶都有一些属性. 比如文件系统的枝叶(文件及子目录)有以下的属性:
  • 名称
  • 修改时间
  • 所有者
  • 组(译者注: 所有者所在的组)
  • 等等
    下图显示了一个文件系统目录.
    属性由 unix 命令 ls -ld /usr 得到.

区分名(DN, Distinguished Name)**

和自然界中的树不同, 文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性, 这一属性可以帮助我们来区别这些枝叶. 在文件系统中, 这些独一无二的属性就是带有完整路径的文件名. 比如 /etc/passwd, 该文件名在该路径下是独一无二的. 当然我们可以有 /usr/passwd, /opt/passwd, 但是根据它们的完整路径, 它们仍然是唯一的.
类似于 DNS 系统的 FQDN 正式域名, FQDN 也是唯一的.
在 LDAP 中, 一个条目的区分名称叫做"dn"或者叫做区分名. 在一个目录中这个名称总是唯一的. 比如, 我的 dn 是"uid=aghaffar, ou=People, o=developer.ch". 不可能有相同的 dn, 但是我们可以有诸如"uid=aghaffar, ou=Administrators, o=developer.ch"的 dn. 这同上面文件系统中 /etc/passwd/usr/passwd 的例子很类似.
我们有独一无二的属性, 在"ou=Administrators, o=developer.ch" 中 uid 和在"ou=People, o=developer.ch"中的 uid. 这并不矛盾.

LDAP 的好处

让我们来看一看迁移到 LDAP 所带来的好处.
LDAP 是一个开放的标准. 你将使用的大多数的新的应用程序都能够查询 ldap 数据库, 甚至 windows2000 使用 LDAP 作为他的目录服务. 信息的集中化将会带来巨大的利益, 单点管理, 减少错误, 减少数据复制等等.
LDAP 应用实例
如果我是康柏公司的推销员, 我可以测试向你销售 LDAP 并告诉你可以用它来作为"联系人管理", 但是我不受雇于康柏公司, 所以我会尝试向你介绍 LDAP 有趣的一些方面.
同一登录系统的单一数据源
用户帐号放置在一个集中的地方.
你可能会使用一个 LDAP 目录来管理你的用户, 放置用户的密码及其他信息, 而不仅仅是存放在/et/passwd 文件中. Windows/Unix/Mac 用户都可以使用这些信息.
建议:你可以使用 LDAP 信息来进行用户认证, 而不是用 shadow 或 nis 等等方式.
建议:你可以写一个小 web 程序来让用户不用登录到系统就可以更改他的存放在 LDAP 中的 unix 密码. 这时你将需要使用 pam_ldap, 可以参考资源列表中关于 pam_ldap 的 url.
注意:
统一登录系统的单一数据源!=同一登录系统

大多数 LDAP 销售商在向你销售 LDAP 时, 会告诉你如果你使用 LDAP, 你就可以拥有一个同一登录系统解决方案. 其实这只说对了一半. 同一登录系统并不是什么新玩艺, 只不过时 IT 经理的噱头而已.
同一登录系统的实例

  • 你用"aghaffar"登录工作站
  • 你访问公司的内部网, 内部网中的 web 页面是密码保护的, 你不用登录就可以访问, 因为 www 服务器可以识别你的身份.
  • 你开始运行一个程序, 比如 SAP, 再一次地, 你不需要密码, 因为系统已经拥有了你的身份和信息.
  • 等等等等
    当然你可以使用 LDAP 作为用户数据源, 而在几个不同的应用程序间进行会话管理的小戏法就是所谓的“统一登录系统”了, 要知道, 这和 LDAP 是风马牛不相及的.
    其实这可以用 LDAP, NIS, NT 域控制器帐号, 数据库, 平面文件实现的.
    建议:你可能想要将不同应用程序的信息集中化. 比如, 将 Netscape 的首选项、书签等信息存入 LDAP, 并且用户可以将这些信息从一部计算机移动到另一部, 从 LDAP 服务器下载他/她的信息. 这个用户可以从 Windows NT Netscape 迁移到 Linux/Solaris/Macintosh Netscape 的同时还使用同样的用户信息(对不起, 又提到了 Microsoft, 我知道这倒了你的胃口).

情景:我憎恶老是在 web 和书面上填充我的个人信息. 我不知道为什么人们老是想知道我的年龄、生日、办公室地址, 即使已经告诉过他们. 我们不得不建立庞大的表格, 表格的信息 75%都是一样的(姓名、主题、通信地址、楼层、管理员名字、部门).
建议:比如, 如果我的电话出故障了, 我给你的唯一信息是“我的电话出故障了”.
采取以下的措施可以尽量减少用户的厌烦:

  • 为用户提供问题提交表单
  • 页面提供用户名/密码验证 (每个对话验证一次, 下一次用户登录是能记住用户信息)
  • 页面提供两个表单元素 1) 反映问题的文字框 2)提交按钮.

也说了这么多了, 这篇文章也就是大概知道 LDAP 是个什么就行了. 至于怎么配置, 后续有兴趣会继续补充. Or, 自行 Google.

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...