作者简介
Atif Ghaffar 就像只变色龙他经常变换角色从系统管理员到程序员再到教师项目管理员直至任何可以完成工作的角色有时候当他在电影院看电影的同时他也喜欢拿出笔记本电脑编写程序Atif始终坚信他是属于linux和开放源码社团的关于Atif的更多信息可以访问他的主页~aghaffar
摘要
本文将讨论LDAP以及在我们所喜爱的操作系统——linux上实现LDAP
已经有很多关于LDAP的文献所以我不想在这里再重复什么我不准备讨论高级的LDAP概念计划以及第二版和第三版LDAP的区别等等事实上我对这类问题也所知不多相反地我将尝试用简单明了的语言解释什么是LDAP 它能给我们带来的好处以及我们如何使用它
我不是一个LDAP专家我只是一个LDAP的初学者本文介绍的是我用LDAP做了些什么以及如何做我不会使你再像以前的我一样感到迷惑
问题既然你是个LDAP初学者为什么还要写一篇关于LDAP的文章?
最近我在一个项目上需要一位同事的帮助 这个项目的基础就是LDAP 我的同事可以在perl邮件服务器等等方面帮助我但是他对LDAP一无所知事实是每一次他想要深入学习LDAP 反而会对LDAP越来越迷惑 因为该项目的基础是LDAP 所以我给了这位同事半小时来学习LDAP结果是一切反而变得清晰明了了 原因很简单 LDAP是在前端的 只需要集中一点点注意力或者一些生动的例子就可以了
在本文中我也正想这样做
你可以在文中发现好多对学习LDAP有用的url
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 l
这将在/usr/local/apache目录下搜索名为l的文件/子目录
NIS目录
ypcat passwd
这将从NIS数据库返回用户名密码用户id等信息
ypmatch atif passwd
返回用户atif的密码
DNS目录
nslookup
返回的ip地址
nslookup type MX
返回主机名符合的MX记录信息
LDAP目录
(我们将在下面详细阐述)
ldapsearch uid=aghaffar
返回关于用户aghaffar的所有公开信息
这和find / uid aghaffar unix命令很类似
ldapsearch uid=aghaffar mail
返回用户ughaffar的邮件信息
目录基础或根
在上面我们所提到的任何一种目录服务中都有一个我们开始浏览或搜索的开始点 这个开始点就是通常所谓的根 这和一棵数的根也很类似每棵都有一个根以及很多的树枝树叶
* 文件系统的根是 /
* NIS 的根是域名比如
* DNS 根是Internic(译者注Internet网络信息中心 Internet的管理组织)
* LDAP同样有一个可定义的根比如 o= 这里o表示组织
每个根都可以衍生出好多枝叶(正如同你邻居的花园中的树木一样) 对于文件系统来说它的枝叶就是一个个文件及子目录每一个枝叶都有一些属性比如文件系统的枝叶(文件及子目录)有以下的属性
* 名称
* 修改时间
* 所有者
* 组(译者注所有者所在的组)
* 等等
下图显示了一个文件系统目录
属性由unix命令ls ld /usr得到
下面是一个LDAP目录的图示
我们将在下面讨论这张图
区分名(DNDistinguished Name)
和自然界中的树不同文件系统/LDAP/电话号码簿目录的每一片枝叶都至少有一个独一无二的属性这一属性可以帮助我们来区别这些枝叶
在文件系统中 这些独一无二的属性就是带有完整路径的文件名比如/etc/passwd该文件名在该路径下是独一无二的当然我们可以有/usr/passwd /opt/passwd但是根据它们的完整路径它们仍然是唯一的
类似于DNS系统的FQDN正式域名FQDN也是唯一的
在LDAP中一个条目的区分名称叫做dn或者叫做区分名在一个目录中这个名称总是唯一的比如我的dn是uid=aghaffar ou=People o=developerch不可能有相同的dn但是我们可以有诸如uid=aghaffar ou=Administrators o=developerch的dn这同上面文件系统中/etc/passwd 和 /usr/passwd的例子很类似
我们有独一无二的属性在ou=Administrators o=developerch 中uid和在ou=People o=developerch中的uid这并不矛盾
LDAP服务器
现在市场上有很多LDAP服务器大多数都可以在linux上运行本文将介绍openLDAP的使用
我为什么选择openLDAP? 为什么你应该选择openLDAP?
* openLDAP是开放源码的
openLDAP的官方网站是你可以下载其源代码包自己编译或者看看你的linux发行版是否已经包含了该软件包如果已经包含了就可以安装预先编译好的版本从而少花费些力气
我已经成功地在SuSEx 和 RedHatx上测试过openLDAP
构建LDAP目录
下面我们将介绍设置一个LDAP服务器的步骤
步骤
* 下载并安装openLDAP
* 配置 LDAP server
* 配置本地环境指向LDAP 安装
* 初始化LDAP 数据库
* 查询 LDAP
* 添加/修改 LDAP 条目
下载并安装openLDAP
正如前面所提到的可以从下载源代码包并根据它的相关文档进行安装或者安装预先编译好的包(包的安装或如何编译应用程序已经超出了本文讨论的范畴)
配置LDAP服务器
在我们的例子中我将为构建LDAP服务器你可以用你喜欢的编辑器编辑nf和f配置文件来更改名称等参数以适应你的具体需求
在我的服务器上配置文件在/etc/openldap目录下你的配置文件可能在/usr/local/etc/openldap或者别的地方这要根据你的linux发行版本或者编译openldap的具体情况而定
######### /etc/openldap/nf ###################################
# 下面的部分是我的suse linux 发行版本预先定义的
# 我们设置的部分在本文的第二和第三部分
include /etc/openldap/nf
include /etc/openldap/nf
schemacheck off
pidfile /var/run/slapdpid
argsfile /var/run/slapdargs
#######################################################################
# ldbm database definitions
#######################################################################
# 定义使用的数据库类型 缺省是ldbm
database ldbm
# 后缀或者根 这是你LDAP目录的顶节点
suffix o=
# LDAP的dbs 保存的位置
directory /var/lib/ldap
# 目录管理员的区分名
rootdn cn=Manager o=
# 保存ldap目录管理员的明文密码是很糟糕的但是我们将在刚刚开始使用ldap时这样做
rootpw secret
# 这就是所有的一切
编辑你的 /etc/openldap/nf配置文件
该文件位于ldap客户端(我们将使用同一计算机作为服务器和客户端当然这可以在同一计算机或不同的计算机上)
通常诸如ldapdelete ldapadd等等的ldap客户端会读该文件的内容
##########/etc/openldap/nf#########
# LDAP 的缺省设置
#
# 查看 nf() 可以获取更多的信息
# 本文件应该设置为对所有人可读
# 定义ldap服务器可以用主机名或ip地址
host
# 定义我们要查询的目录的根
# 我们将要使用的顶节点这不一定是目录的根比如我们可以使用
# base = ou=users o=linuxfocusch
# 这时我们的一切查询都将从树根o=的分支开始
现在启动ldap服务器
如果你使用SuSE预先编译好的openldap服务器你可以通过下面的命令启动ldap服务
/etc/rcd/ldap start
在RedHat该命令为
/etc/rcd/initd/ldap start
如果你是使用缺省设置自己编译并安装的你可以用/usr/local/libexec/slapd &启动ldap服务器如果没有使用缺省设置请找到slapd文件并运行它
在新安装的LDAP服务器上添加数据
到现在