基于LDAP实现多认证源的统一身份认证实践——以华东师范大学图书馆为例
李欣, 刘丹
华东师范大学图书馆 上海 200062
摘要

在实际应用基础上, 提出一套基于LDAP实现多认证源的统一用户身份管理解决方案,并对其中涉及的关键技术进行详细介绍。通过LDAP代理服务技术解决某些商业应用系统不支持多认证源的问题,为大型机构实现统一身份认证管理提供一种参考模式。

关键词: LDAP; 目录服务; 统一身份认证
中图分类号:TP391
A Practice of Uniform Identity Authentication Against Multiple Authentication Sources Based on LDAP——A Case Analysis of East China Normal University Library
Li Xin, Liu Dan
East China Normal University Library, Shanghai 200062, China
Abstract

The paper gives a solution to solve uniform identity authentication against multiple authentication sources by setting up a LDAP proxy server. This solution evades the problem that commercial system does not support multiple authentication sources and is appropriate for large-scaled organization.

Keyword: LDAP; Directory service; Uniform identity authentication
1 引 言

在高等学校数字化校园建设中,应用系统不断增加,而各应用系统如果各自建立一套自己的用户身份管理机制,一方面将造成管理成本日益增加,另一方面用户在访问多个应用系统时需要输入不同的用户账号、口令等信息,造成应用系统的易用性降低和用户管理工作量的增加。因此,在数字图书馆建设中通过统一身份认证系统实现对分散用户信息的统一管理,建立具有较强安全控制的统一用户身份认证系统已经成为数字化校园建设的重要内容。

华东师范大学在2003年实现了基于校园网的统一身份认证,同时建立了基于学校的统一人员编码规则。图书馆在统一使用学校的身份认证系统之前,一直采用同一Web认证页面提供两个不同认证入口的方式,如图1所示。

图1 同一Web认证页面提供两个不同认证入口

在将图书馆应用纳入校级统一身份认证体系过程中,笔者发现需要解决以下问题:

(1)对于在2003年之前离退休人员,学校实行了新的编码规则,产生了现有图书馆读者数据库中的这部分人员的ID与学校人员信息数据库中的ID不一致。若统一采用校级人员信息数据库进行身份认证,将无法通过新的校级用户ID对应到图书馆的原有读者记录,这样直接影响通过图书馆自动化集成系统进行续借和预约以及个人借阅信息查询等操作。若将其原有用户信息加入到校级人员信息数据库,在其中对于同一个人会产生两个不同的用户ID,因此破坏了学校的统一编码规则。

(2)因图书馆资源服务的特殊性,经常会有一些特殊需求的临时用户需要短期利用图书馆资源,这样的用户由于不受校级认证源信任,无法在校级的人员信息数据库中随时加入和删除。

(3)由于图书馆的自动化集成系统属于商业产品,尽管支持LDAP(Lightweight Directory Access Protocol)协议,但其认证接口无法进行定制,不支持对多个认证源进行查询。

(4)希望采用一个认证入口。考虑到利用校级人员信息数据库进行统一身份认证将给读者带来诸多便利,同时要解决图书馆应用中存在的上述问题,因此产生了基于多认证源统一身份认证的需求。

2 LDAP简介

LDAP是目录访问协议的一种,它基于X.500标准,但是简化了实现方法,所以称为轻量级的目录服务。相对于通常用于认证的关系数据库而言,LDAP目录服务倾向于包含描述的、基于属性的信息,并支持复杂的过滤器操作[ 1]。它的数据组织树型结构,在目录服务中称之为目录信息树(Directory Information Tree,DIT),DIT的基本组成单元是条目(Entry),条目由多个属性构成,且可扩展。LDAP协议规定了DN的命名方法、存取控制方法、搜索格式、复制方法等,并提供了存取这些信息的服务[ 2]。数据组织的树型结构可以限定在目录信息树的任一分枝上进行目录查找,这一特性使目录服务相对于专门的关系型数据库的数据处理速度快一个数量级。LDAP的分布式目录服务通过分区(Partition)和复制(Replication)功能将目录信息树上的数据分布到多个物理服务器上实现,为应用系统和服务中的信息存储和管理提供了一个可扩展的结构。

LDAP支持广泛的应用编程语言,如C、Java、PHP、Perl等都有自己的LDAP API,用户可以轻松选择适合自己的编程语言进行LDAP相关应用的开发。最新的LDAP协议版本是V3,其后续的开发已经纳入全球互联网最具权威的技术标准化组织IETF(Internet Engineering Task Force)。

目前,LDAP协议已经成为一个被广范支持的用于统一身份认证跨平台和标准的协议,它的易于集成不同应用系统的特点,成为支持网络系统的重要底层基础技术之一,是进行统一身份认证的一个优选方案。

3 系统设计

统一身份认证系统的实现方式取决于人员信息的组织模式,无论采用何种信息组织模式,都需要建立机构(含分支机构)统一编码规则。

(1)采用唯一的用户信息数据库来管理用户信息,这种模式需要将机构的所有人员信息集中到一个逻辑的数据库中。这种唯一性是一种逻辑概念,可以是一个物理数据库,也可以是分布式的、多个物理数据库。系统通过逻辑关系整合为一个数据库,相互之间存在紧密的关联关系,形成目录树。这种数据组织模式对数据的要求较高,机构内的每一个分支机构需要建立树型关联关系,但实现统一身份认证过程较为简单。

(2)将机构中相互独立且彼此之间存在相互信任关系的单个人员信息数据库,通过LDAP代理功能实现一个统一的逻辑视图,为认证接口提供唯一的访问点。这种数据组织模式简化了人员信息集中管理的树型制约关系,相对简单灵活,但实现统一身份认证的过程相对繁琐。本系统针对模式(2)给出具体解决方案。

3.1 建立数据组织结构

以华东师范大学图书馆为例,针对特定的需求,系统采用LDAP代理方式对其数据进行组织,其认证源目录树结构如图2所示。

图2 华东师范大学图书馆LDAP目录树结构

图2中的认证源1为校级LDAP人员信息数据库,它包含了学校的院系所以及图书馆的受信任的人员信息,代表了通常意义上的LDAP目录树结构。认证源2包含了不受校级人员信息数据库信任的、只能访问图书馆应用的人员信息(包括上述第一种需求的人员,保持其原有图书馆系统中的ID不变,而第二种需求人员可以根据人员命名规则直接包含在此,由图书馆自行负责人员信息的增、删、改管理,不受校级认证源限制)。因为代理LDAP服务器架构在图书馆应用之上,因此由LDAP代理服务器约定了认证源1和认证源2相互信任的关系为:任何一个通过认证源1或认证源2的用户都可以访问图书馆应用。而图书馆应用的第三个特殊需求,正是通过代理功能整合认证源1和认证源2成为一个逻辑整体来满足,同时实现了第4种需求的单一认证入口。

3.2 建立身份认证模型

LDAP协议对目录操作共有4类:查询类操作、更新类操作、认证类操作、其他类操作[ 3]。应用程序正是利用LDAP认证类操作的绑定(Bind)技术来实现身份认证的,其标准的认证过程描述为:应用程序首先通过一个给定账户或匿名绑定到LDAP服务器,然后利用待认证用户ID(该用户ID所对应的属性应该在LDAP目录中具备唯一的属性值)获取对应条目的DN,再使用该DN与用户提交的密码进行一次LDAP绑定操作,绑定的前提是LDAP目录条目具备用户密码属性(UserPassword),如果绑定成功,则认证通过,否则认证失败。

为了保证身份认证在客户端和LDAP服务器之间的会话安全,OpenLDAP利用其支持SSL/TLS、Kerberos、SASL (Simple Authentication and Secure Layer) 等安全机制,可根据需要选择不同的会话安全级别。在学校的应用环境中,图书馆的应用服务和LDAP服务器往往作为网络的二级节点,设备布局在具有防火墙的局域网内,因此也可以使用默认的明文认证。若需要实现加密认证,在各应用系统认证接口上采用SSL/TLS 即可以实现,但在并发认证用户数量较大时,加密这些信息可能会占用一定的系统资源。

通过LDAP代理服务器实现多认证源统一身份认证的流程如图3所示:

图3 LDAP代理服务器实现多认证源统一身份认证流程

以用户ID为“18791201”为例,其认证过程如下:当用户发起一个应用系统请求时,通过①提交用户ID和密码请求服务,应用服务收到请求后转入认证过程②,认证模块匿名绑定到LDAP代理服务器,以dc=proxy为Search Base,查找uid为用户提交ID的条目,代理服务器在收到查询请求后依据配置顺序,将虚拟Search Base转换成真实Search Base对被代理服务器进行查询。代理服务器将依次查询两个认证源,任何一个通过后将结束查询并返回命中信息,若两个认证源均不通过将返回未命中信息,并将查询结果返回给认证模块,若未命中则转入⑤认证未通过;若命中则以命中条目DN(如uid=18791201,dc=proxy)和用户提交的密码绑定代理服务器,则转入④认证通过。

4 系统实施

建立本地用户信息数据库,利用LDAP的Metadirectory功能实现对校级和本地目录服务的透明代理,完成用户信息数据的统一管理。而对于类似只支持单一LDAP认证的商业应用系统来说,如本馆的图书馆自动化集成系统,只要在相应的配置文件中将人员信息认证源指向LDAP代理服务器即可实现。

系统基于Linux操作系统Red Hat社区开源版CentOS5.2搭建操作系统平台,LDAP服务器和后台数据库分别由开源的OpenLDAP 2.4.23和Berkeley DB 4.7.25实现。

4.1 搭建本地LDAP服务器

LDAP只是一个协议,它不涉及到如何存储信息,因此还需要一个后端数据库支持来实现数据存储。使用开源Berkeley DB 后端BDB配置本地DIT,用于存储本地用户信息。

(1)配置本地目录信息树,主要是根据信息(o=libpri),利用Berkeley DB来实际存储数据,编辑slapd.conf文件:

#使用bdb实现存储本地数据

database bdb

#定义该数据库存储的目录信息树的根

suffix "o=libpri"

#定义该目录信息树的管理员用户和密码

rootdn "cn=admin,o=libpri"

rootpw {SSHA}ae8oHRG09b+Fzx897wHfgIbqzCHMa0Wh

#指定数据存储目录(以本馆为例)

directory /data/openldap

#索引设定

index objectClass eq

(2)编辑文本文件init.ldif,添加根条目:

dn:o=libpri

objectclass:top

objectclass:organization

o:libpri

(3)使用ldapadd命令添加根条目

ldapadd -x -D"cn=admin,o=libpri" -W -f init.ldif

本地用户信息可使用上述方式加入,也可以使用后面介绍的编程方式由用户提交。

4.2 搭建本地LDAP代理服务器

通常,LDAP后端只能代理一个LDAP服务器,这种代理方式不能满足需求,因此选择Metadirectory后端来实现代理多个LDAP服务器。为了节省硬件开支,通过将LDAP代理服务器和存储本地用户信息的LDAP服务器配置为两个后端,实现了将两者构建在同一台物理服务器上。

编辑slapd.conf,配置本地LDAP代理服务器:

#定义Meta 后端

database meta

#定义LDAP代理服务器的Suffix,以此为Search Base的查询都通过此后端执行

suffix "dc=proxy"

#定义LDAP代理后端的管理员用户和密码

rootdn "cn=admin,dc=proxy "

rootpw {SSHA}ae8oHRG09b+Fzx897wHfgIbqzCHMa0Wh

#代理的第一个服务器(校级LDAP的IP地址)及其虚拟Search Base

uri ldap://111.111.111.111/dc=proxy

#将虚拟Search Base转化成真实的Search Base

suffixmassage "dc=proxy" "o=ecnu"

#代理的第二台服务器(本地LDAP的IP地址)

uri ldap://122.122.122.122/dc=proxy

#将虚拟Search Base转化成真实的Search Base

suffixmassage "dc=proxy" "o=libpri"

通过上述配置,实现了对校级和本地LDAP目录服务的代理,suffixmassage指令将针对代理服务器的Search Base转换成被代理服务器的实际Search Base,提供了对被代理目录服务的透明查询。

4.3 客户端数据接口实现

这种客户端的应用开发方法,方便用户以Web方式操作本地LDAP服务器中的数据,如修改密码等,它主要利用了LDAP具有对多应用编程语言接口的支持能力(LDAP API),以客户端编程方式实现本地用户数据操作,用户可以轻松实现自己的特定需求。仅以向本地存储用户数据的目录信息树添加人员信息条目为例,介绍基于PHP的编程算法。至于在添加临时用户信息的过程控制环节,如分别对多个认证源查重以及身份确认等细节,每个机构有其特殊规定,因不具有普遍性,在此不再详细介绍。

主要程序片段如下:

//连接LDAP服务器

$con = ldap_connect("122.122.122.122");

//以管理员身份绑定到LDAP服务器

ldap_bind($con, "cn=admin,o=libpri", "password");

//构造条目

$dn = "uid=".$ID.",o=libpri";

$attributes = array(

"objectclass" =>array(

0 =>"top",1 =>"person",2 =>"uidObject"),

"uid" =>$ID,

"sn" =>"Surname",

"cn" =>"Common Name",

"userPassword" =>$password);

//添加条目

ldap_add($con, $dn, $attributes))

5 结 语

统一身份认证系统的实现,降低了用户信息数据库的冗余,避免了在多个用户信息数据库之间的更新与同步操作,实现了一个独立于应用之外的、能够为所有应用系统提供统一身份认证服务的平台,应用系统不再需要开发各自独立的用户认证模块,有效降低了开发成本。本文设计的用户统一身份认证系统,不仅适用于通常意义上的统一身份认证需求,同时为解决整体机构中某些个体机构的特殊需求提供了解决方案。利用LDAP具有的代理服务相关技术,建立了华东师范大学图书馆的统一身份认证体系,既满足了校级用户认证需求,同时较好地解决了图书馆用户的特殊需求,实现了多认证源的用户统一身份认证管理。目前,该系统在华东师范大学图书馆中已正式投入使用,实现了对图书馆数字资源、自动化集成系统、馆员园地、Wiki等需要身份认证才能访问的所有应用系统的统一用户身份管理。实践证明,不仅提高了数字图书馆各种应用系统的安全性、可靠性,也给用户提供了极大的方便,达到了统一身份认证的设计目标。同时,该系统取代了原有基于自动化集成系统用户代理方式的商业认证系统,取得了很好的社会效益和经济效益,为大型机构实现统一身份认证管理提供了一种参考模式。

The authors have declared that no competing interests exist.

作者已声明无竞争性利益关系。

参考文献
[1] OpenLDAP Software 2. 4 Administrator’s Guide [EB/OL]. [2011-02-11]. http://www.openldap.org/doc/admin24/. [本文引用:1]
[2] Butcher M. Mastering OpenLDAP: Configuring, Securing and Integrating Directory Services[M]. Packt Publishing, 2007. [本文引用:1]
[3] 左晓珲, 沈富可, 任肖丽, . 基于LDAP的校园网统一身份认证技术简介[J]. 计算机与数字工程, 2006, 34(9): 86-88. [本文引用:1]