作者:北京联合大学师范学院网络中心 王波
LDAP是目录服务的一种标准。当前流行的目录服务软件如Windows 2000的活动目录,以及Novell公司的NDS等都是遵循LDAP标准的具体产品。下面将介绍如何用OpenLDAP在Linux环境实现目录服务。
OpenLDAP 2.X的配置要点
在OpenLDAP 2.X中有两个主要配置文件,一个是/etc/openldap/ldap.conf;另一个是/etc/openldap/slapd.conf。
1./etc/openldap/ldap.conf文件
该文件的配置比较简单。主要定义LDAP 全局性的内容,具体如下:
#HOST 指明LDAP server的地址
HOST 10.22.1.201
#BASE 指明LDAP 目录树的基本dn,
BASE dc=vttc,dc=edu,dc=cn
2./etc/openldap/slapd.conf文件
/etc/openldap/slapd.conf是OpenLDAP最主要的配置文件。该文件定义了LDAP Server的守护进程slapd的配置情况,如下:
...
# ldbm database definitions 定义LDAP使用的数据库
database ldbm
#定义LDAP目录树的后缀
suffix "dc=vttc,dc=edu,dc=cn"
suffix "o=vttc"
#定义LDAP根管理员的dn
rootdn "cn=ldapadmin,o=vttc"
#定义LDAP根管理员的密码
rootpw "wb123"
#以上密码为明文,也可以采用加密格式的密码如下所示
# rootpw {crypt}ijFYNcSNctBYg
#定义LDAP数据库的存放位置,该目录应该事先建立好
directory /var/lib/ldap/vttc.edu.cn
# 建立索引
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index cn,mail,surname,givenname eq,subinitial
OpenLDAP 2.x中用suffix可以定义多个后缀。建立索引一定要在LDAP数据库创建之前,否则无效。建议用加密的口令。
配置完文件后,即可启动LDAP服务器。以Red Hat Linux 7.2为例,执行以下命令:
$ /etc/rc.d/init.d/ldap start
LDAP数据库的建立
1.规划目录树的原则
LDAP数据库是树型结构的,因此创建LDAP数据库也就是在创建一棵树。在具体创建目录数据库之前,应该仔细规划目录树的结构,当前有两种主要方案可以选择:第一种按照组织结构划分;第二种按照地理位置划分。规划目录树时可根据具体情况进行选择。
2.建立LDAP数据库的方法
在创建LDAP目录树的过程中,首先应该创建根。例如本例中定义的对象类型中有一个top类型,一般情况下top类型用来指定该条目位于目录树顶级。另外在定义每个条目时,可以指定多个对象类型,目的是让该条目同时具有多种类型的属性。
在编辑完该文件后,利用系统提供的命令行工具将该文件添加到LDAP数据库中。执行如下命令:
#ldapadd -f myrootdn.ldif -xv -D "cn=ldapadmin,dc=vttc,dc=edu,dc=cn" -W
其中,f指定LDIF格式文件名;x表示使用简单验证来代替SASL;v代表显示模式,在执行该命令时显示每步的结果,常用于调试阶段;D表示将后面指定的dn绑定到LDAP数据库;大写的W提示输入密码。
Perl访问LDAP
1.安装必要的软件包
Perl访问LDAP,需要安装两个软件包:一是perl-ldap-0.2701.tar.gz,该软件包提供了Perl访问LDAP的接口函数;二是Convert-ASN1-0.16.tar.gz,该软件包实现了ASN.1格式的编码/解码的转换。由于OpenLDAP 2.X采用ASN.1语法,所以该模块是必要的。这两个软件包都可以到CPAN上下载。限于篇幅,略去安装步骤。
2.利用Perl访问LDAP
以上两个软件包安装成功后,就可以利用Perl来访问LDAP。下面是通过Perl程序向LDAP中增加条目的实例:
#!/usr/bin/perl
use Net::LDAP;
#绑定到LDAP SERVER
$ldap=Net::LDAP->new('10.22.1.201') or die "$@";
#向LDAP数据库中增加条目
$ldap->bind('cn=ldapadmin,o=vttc',password=>'wb123');
$result=$ldap->add('cn=yyy,dc=vttc,dc=edu,dc=cn',
attr=>['cn'=>['yyy uuu'],
'sn'=>'yyy',
'objectclass'=>['person'],
]
);
$result->code && warn "failed to add entry:",$result->error;
$ldap->unbind;
print("done!\n")
3.基于OpenLDAP 2.X的身份验证实例
当前,绝大多数使用Perl开发的程序都需要外部软件包来支持。下面通过一个身份验证实例说明如何利用Net::LDAP等软件包访问LDAP数据库,代码如下:
#!/usr/bin/perl
#最重要的包,是Perl访问OpenLDAP的必备软件包
use Net::LDAP;
#典型的Perl-CGI
$|=1;
print "Content-type:text/html\n\n";
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs=split(/&/,$buffer);
foreach $pair(@pairs)
{
($key,$value)=split(/=/,$pair);
$value=~tr/+//;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
$FORM{$key}=$value;
}
#绑定到LDAP SERVER
$ldap=Net::LDAP->new('10.22.1.201') or die "$@";
$ldap->bind;
#在LDAP目录树中实现查询
$mesg=$ldap->search(base=>"dc=vttc,dc=edu,dc=cn",filter=>"(&(cn=$FORM{'name'}))");
$mesg->code && die $mesg->error;
#将查到Entry存到数组中
@myentries=$mesg->entries;
print ("<p>*******");
#取出查到的个数
$mycount=$mesg->count;
print "The Number of Search Result = $mycount ";
print ("*******");
if ($mycount==0)
{
print ("<p>$FORM{'name'} is not at LDAP DATABAE!!!");
}
else
{ #身份验证
my $entry=$mesg->entry(0);
$rightpasswd=$entry->get_value('userPassword');
#print ("<p>rightpasswd=$rightpasswd");
if ($rightpasswd ne $FORM{'passwd'})
{
print ("<p>Password ERROR!!!");
}
else
{
print ("<p>Password right,You can access Internet Now!");
}
}
#解除与LDAP SERVER的绑定
$ldap->unbind;
print("done!\n") ;

