单点登录技术文档

更新时间:2024-01-27 13:10:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单点登录

单点登录技术文档

说明:本文档在我们最大努力范围之内确保其正确性、实效性和可观性,但并不代表所有的观点都是正确的,而仅代表个人看法。如发现不当之处,请多指教,谢谢!

另外,本文并不是给初学者看的。虽然我们尽可能把每个概念和操作步骤都说得比较明白,但是如果您对于Linux系统不是很熟的话,很多操作仍然可能存在困难。这种情况下我们建议您直接下载虚拟机安装试用,边实践边学习。

联系邮件:mypersonal1971@gmail.com。

1、 单点登录概述

单点登录的英文名称为Single Sign-On,简写为SSO,它是一个用户认证的过程,允许用户一次性进行认证之后,就访问系统中不同的应用;而不需要访问每个应用时,都重新输入密码。IBM对SSO有一个形象的解释“单点登录、全网漫游”。

SSO将一个企业内部所有域中的用户登录和用户帐号管理集中到一起,SSO的好处显而易见:

1. 减少用户在不同系统中登录耗费的时间,减少用户登录出错的可能性 2. 实现安全的同时避免了处理和保存多套系统用户的认证信息 3. 减少了系统管理员增加、删除用户和修改用户权限的时间

4. 增加了安全性:系统管理员有了更好的方法管理用户,包括可以通过直接禁止和删除用户来取消该用户对所有系统资源的访问权限

对于内部有多种应用系统的企业来说,单点登录的效果是十分明显的。很多国际上的企业已经将单点登录作为系统设计的基本功能之一。

1.1 单点登录产品

商业SSO软件

? 专门的SSO商业软件

? 主要有:Netgrity的Siteminder,已经被CA收购。Novell 公司的iChain。RSA公

司的ClearTrust等。

? 门户产品供应商自己的SSO产品,

? 如:BEA的WLES,IBM 的Tivoli Access Manager,Sun 公司的identity Server,

Oracle公司的OID等。

第 1 页

单点登录

上述商业软件一般适用于客户对SSO的需求很高,并且企业内部采用Domino、SAP、Sieble等系统比较多的情况下。单点登录产品通常需要在应用软件中增加代理模块,而商业SSO产品主要针对大型软件制作了代码模块。

因此,商业SSO软件除了价格问题外,另一个重要问题就是对客户自己的应用系统支持未必十分完善。

开源SSO软件 ? Opensso

? https://opensso.dev.java.net/

? OpenSSO基于Sun Java System Access Manager,是Sun公司支持的一个开源的SSO

项目。

? OpenSSO体系结构设计合理,功能比较强大。然而缺点是客户端支持不够广泛,

似乎只是对基于J2EE的应用支持的比较好。

? josso

? http://www.josso.org/

? 这是另一个Java写的单点登录产品,通常认为比OpenSSO更成熟一些。 ? JOSSO支持的客户端包括Java,PHP和ASP。 ? CAS

? http://www.ja-sig.org/products/cas/

? 这是耶鲁大学开发的单点登录产品,也是我们最后选定的单点登录产品。

? CAS的优点很多,例如设计理念先进、体系结构合理、配置简单、客户端支持广

泛、技术成熟等等。以后我们还要仔细介绍。

经过广泛分析和比较,最后我们选定CAS作为我们的单点登录产品。我们确信这是目前能够找到的最好的开源单点登录产品。

1.2 单点登录的实现机制

SSO的实现机制不尽相同,大体分为Cookie机制和Session机制两大类。

WebLogic通过Session共享认证信息。Session是一种服务器端机制,当客户端访问服务器时,服务器为客户端创建一个惟一的SessionID,以使在整个交互过程中始终保持状态,而交互的信息则可由应用自行指定,因此用Session方式实现SSO,不能在多个浏览器之间实现单点登录,但却可以跨域。

WebSphere通过Cookie记录认证信息。Cookie是一种客户端机制,它存储的内容主要包括: 名字、值、过期时间、路径和域,路径与域合在一起就构成了Cookie的作用范围,因此用Cookie方式可实现SSO,但域名必须相同。

目前大部分SSO产品采用的是Cookie机制,CAS也是如此。

注意,这种机制要求实现单点登录的应用,其余名必须是相同的。例如:a.chinacreator.com,b.chinacreator.com就可以经过配置后实现SSO。

以CAS为例,使用Cookie实现单点登录的原理图如图1所示。

第 2 页

单点登录

? 首先,单点登录分为“服务端”和“客户端”。服务端就是单点登录服务器,而客

户端通常是“函数库”或者“插件”。需要使用单点登录的应用程序,需要把客户端插件安装到自己的系统中,或者将客户端函数库包括在代码中。单点登录的客户端通常替换了原来应用程序的认证部分的代码。 ? 某个应用程序首先要发起第1次认证。大部分情况下,应用程序中嵌入的客户端会

把应用程序原来的登录画面屏蔽掉,而直接转到单点登录服务器的登录页面。

Web应用 单点登录客户端 首次登录 单点登录服务器 某种授权机制 认证 LDAP Web应用 单点登录客户端 Cookie Web应用 单点登录客户端

图 1 使用Cookie实现单点登录的原理图

? 用户在单点登录服务器的登录页面中,输入用户名和密码。 ? 然后单点登录服务器会对用户名和密码进行认证。认证本身并不是单点登录服务器

的功能,因此,通常会引入某种认证机制。认证机制可以有很多种,例如自己写一个认证程序,或者使用一些标准的认证方法,例如LDAP或者数据库等等。在大多数情况下,会使用LDAP进行认证。这是因为LDAP在处理用户登录方面,有很多独特的优势,这在本文的后面还会比较详细地进行介绍。 ? 认证通过之后,单点登录服务器会和应用程序进行一个比较复杂的交互,这通常是

某种授权机制。CAS使用的是所谓的Ticket。具体这点后面还会介绍。

? 授权完成后,CAS把页面重定向,回到Web应用。Web应用此时就完成了成功的

登录(当然这也是单点登录的客户端,根据返回的Ticket信息进行判断成功的)。 ? 然后单点登录服务器会在客户端创建一个Cookie。注意,是在用户的客户端,而

不是服务端创建一个Cookie。这个Cookie是一个加密的Cookie,其中保存了用户登录的信息。

? 如果用户此时希望进入其他Web应用程序,则安装在这些应用程序中的单点登录

客户端,首先仍然会重定向到CAS服务器。不过此时CAS服务器不再要求用户输入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登录。登录之后,CAS重定向回到用户的应用程序。

这样,就不再需要用户继续输入用户名和密码,从而实现了单点登录。

注意,这种单点登录体系中,并没有通过http进行密码的传递(但是有用户名的传递),

第 3 页

单点登录

因此是十分安全的。

1.3 单点登录、统一用户和单一用户管理

很多人谈论单点登录时,常常和统一用户,以及单一用户管理混淆了,要么误认为单点登录自然实现了单一用户管理;要么误认为统一用户或者单一用户管理就是单点登录。实际上,这三个概念是有明确的区别的。

统一用户就是指不同的系统,使用同一套用户处理的机制。

? 用户ID全局惟一,用户登录名,密码全局唯一,并且统一存储在单一系统中。 ? 用户的一些属性,如姓名、电话、地址、邮件等,统一存储在单一系统中。尽管各

应用系统还可以自行增加一些属性,但是基本的属性应该统一存储和管理。

? 应用系统不应该直接对用户信息的进行增加、修改和删除,但是可以进行查询。对

用户信息的增加、修改和删除,应该由专门的系统进行统一的管理。

目前比较标准的做法,是使用LDAP服务器,对用户信息进行统一管理。

很显然,统一用户是单点登录的基础,但是统一用户并不意味着实现了单点登录。 例如,如果我们在LDAP服务器中实现了用户的统一管理。然后我们可以设置应用程序A和B都使用LDAP进行用户认证。虽然此时A和B用以认证的用户,其用户名和密码都是一样的(都是从LDAP服务器中读出的),但是对应用A进行了登录之后,应用B还需要再次输入用户名和密码。因此,统一用户并不意味着单点登录。

在图1中可以很清楚地看到,用于统一用户管理的LDAP服务器,只是单点登录系统中的一个部分,主要用于认证。

单一用户管理则指所有的用户管理工作都在唯一的地方进行处理,而每个应用程序不再保留自己的用户管理功能。单一用户管理和统一用户管理的最大区别在于,统一用户管理之后,每个应用程序仍然保留自己的用户管理功能,用于额外的属性设置;而单一用户管理时,每个应用程序不再保留自己的用户管理功能。

我们举例来进行说明,最好的例子是“组”。大家都知道,“组”通常包含若干个用户,用以方便地进行一些设置,例如权限设置等等。

在LDAP服务器上可以设置组,但是如果某个应用程序希望使用自己设定的组怎么办?只能让该应用程序保留设定组的功能。那么又带来下面的问题。

如果应用程序中的组GroupA中,例如包含了用户User1和User2。而在LDAP服务器进行统一用户管理时,把用户User1删除了,增加了User3。此时GroupA中包含了一个无效的用户,并且缺少了一个有效的用户。此时怎么办呢?

也没有什么好的办法,只能进行用户的同步。在LDAP中进行用户操作之后,有某种同步的机制,在应用程序中进行相应的修改。

再举一个例子,Zope中的用户,是具有不同的权限的。而LDAP服务器中的用户,则通常没有权限这个属性。那么,如果Zope使用LDAP作为自己的用户源,如何设定用户的属性呢?

目前的解决方法是,在Zope中复制一个LDAP中的用户,然后手工设置用户的权限。此时,由于用户被复制了,因此又带来了同步的问题。

因此,即使实现了统一用户管理,仍然可能需要在应用程序之间,设置大量的用户管理的同步操作(尽管比没有统一用户管理之前简单多了)。这样,实际上没有达到所谓的“单

第 4 页

单点登录

一用户管理”,即在统一的地方进行全部的用户管理操作。

单一用户管理和应用程序的具体处理机制关系很大,因此目前还没有统一的方法进行处理。这需要在设计应用程序,以及设计LDAP服务器时,进行仔细的设计,并有大量的代码改造工作。

2、LDAP和CAS

由于LDAP是单点登录的基础,因此,本章先对LDAP做一个介绍,然后再介绍我们采用的单点登录产品CAS。

2.1 LDAP简述

LDAP是英文“Lightweight Directory Access Protocol”的简称,中文翻译为轻量级目录访问协议。它是一种因特网上的访问协议,主要用于从服务器上检索信息。

LDAP服务器用来保存信息,中文有时候也称为目录服务。既然LDAP服务器用于保存信息,那么它和普通的数据库有什么区别呢?

数据库使用“表”来储存数据,可以把一个数据库想象为日常生活中的“表格”。而LDAP用“树”来存储数据,可以把它想象为日常生活中的“电话号码簿页”,或者干脆把LDAP想象为大家常用的文件系统,就是由文件夹和文件组成的那种树形结构。

由于LDAP的结构方式不同,因此LDAP有一个很多特殊的特性,就是查询数据的速度特别快,但是写数据的速度较慢。LDAP的另一个特性就是比较适合于按照层次组织信息,例如企业的组织结构等。

由于LDAP的查询速度比数据库快,因此经常用于诸如地址簿、用户帐号存储、组织结构信息、域名解析系统等需要大量查询的领域。

2.2 LDAP的结构

图2是一个很简单的LDAP结构示意图。

首先,我们可以很清楚地看到,LDAP是按照树形目录进行组织的。

假设公司的域名是macromedia.com,则LDAP首先使用域名作为整个树的根,并且用dc=com,dc=macromedia这样的标记来进行标注。dc的意思指“Domain Component”。LDAP中以后会大量使用这些令人费解的缩写。

假设某天macromedia.com这个公司和apple.com这个公司合并,按照LDAP的树形结构,只不过多了一个分叉,而不会导致整棵树需要重新组织,这就是LDAP的好处之一。

dc节点的后面,就是ou节点。ou是Organizational Unit的缩写,可以把ou想象为文件夹,它是用来容纳其他节点的。ou可以对应部门、组或者任何要包含其他节点的东西。

ou下面的节点,可以是另一个ou,也可以是cn节点。cn是“Common Name”的缩写,它是树叶节点,可以把它对比为文件系统中的文件。cn节点通常用来存储用户的信息,例如某个用户的地址等。

这样,各个节点按照树形组织起来,就变成了图2的样子。

第 5 页

单点登录

图 2 LDAP结构示意图

2.3 权限和纲要

和数据库一样,LDAP可以设置权限,例如允许某些用户可以访问某些特定的树枝。权限的概念大家都很熟悉,这里就不再叙述了。

LDAP的纲要(Schema)用来描述保存在服务器中的数据的格式和属性。例如,我们希望在某个cn节点中保存用户的地址簿,那么到底地址簿中包含哪些信息呢?如何指定地址簿中只包含了工作电话,还是同时包含工作电话和家庭电话?

此时就需要使用schema。我们以一个例子进行说明。

#

# mozillaOrgPerson schema v. 0.6.3 #

# req. core # req. cosine

# req. inetorgperson

# attribute defs

attributetype ( 1.3.6.1.4.1.13769.2.1.5 NAME 'mozillaPostalAddress2' EQUALITY caseIgnoreListMatch

SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

attributetype ( 1.3.6.1.4.1.13769.2.1.6 NAME 'mozillaHomePostalAddress2' EQUALITY caseIgnoreListMatch

SUBSTR caseIgnoreListSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )

attributetype ( 1.3.6.1.4.1.13769.2.1.10

NAME ( 'mozillaHomeFriendlyCountryName' )

第 6 页

单点登录

EQUALITY caseIgnoreMatch

SUBSTR caseIgnoreSubstringsMatch

SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

# defined in \RFC 2256

#

# attributetype ( 2.5.4.6 NAME ( 'c' 'countryName' ) # DESC 'RFC2256: ISO-3166 country 2-letter code' # SUP name SINGLE-VALUE )

# defined in \#

# attributetype ( 0.9.2342.19200300.100.1.43 # NAME ( 'co' 'friendlyCountryName' ) # DESC 'RFC1274: friendly country name' # EQUALITY caseIgnoreMatch

# SUBSTR caseIgnoreSubstringsMatch

# SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )

# objectClass defs

objectclass ( 1.3.6.1.4.1.13769.2.2.1 NAME 'mozillaOrgPerson' SUP top AUXILIARY MAY ( sn $

givenName $ cn $

displayName $

mozillaNickname $ title $

telephoneNumber $

facsimileTelephoneNumber $ mobile $ pager $

homePhone $ street $

postalCode $

mozillaPostalAddress2 $ mozillaHomeStreet $

mozillaHomePostalAddress2 $ l $

mozillaHomeLocalityName $ st $

mozillaHomeState $

mozillaHomePostalCode $ c $

mozillaHomeCountryName $ co $

mozillaHomeFriendlyCountryName $ ou $ o $ mail $

mozillaSecondEmail $ mozillaUseHtmlMail $ nsAIMid $

mozillaHomeUrl $ mozillaWorkUrl $ description $ mozillaCustom1 $ mozillaCustom2 $ mozillaCustom3 $ mozillaCustom4 ) )

第 7 页

单点登录

上面的例子是Mozill地址本的schema。attributetype用来定义一个属性的名称、类型、限制条件等。objectclass则用来定义节点包含了哪些属性,每个属性的名称是什么。

objectclass类似于数据库中,定义表的字段。

LDAP中的节点,可以是任何一种objectclass,例如,同一个ou下面的节点A,可能是objectclassA,而节点B,可能是objectclassB。这就类似于文件系统中,一个文件夹下面可以有多种不同的文件。

LDAP的节点,允许指定多种不同的objectclass。例如,如果我们希望用户地址本中,同时还包含用户的登录密码。一种方法是我们重新创建一个objectclass,另一种方法就是我们同时指定节点,具有地址簿信息的inetOrgPerson,以及密码信息的simpleSecurity。实际上,通过组合不同的objectclass来实现自己想要的节点类型,用得更普遍一些。

2.4 LDIF

LDIF是一种文件格式,它用来导入和导出LDAP中的数据,类似于数据库中的SQL。

新建了一个LDAP服务器之后,如何向其中输入数据呢?答案就是使用LDIF。尽管有些图形化界面的工作,可以直接通过图形界面操作LDAP服务器,然而一些初始化的数据,通常还是通过LDIF文件输入。

LDIF是纯文本的文件格式,一个例子如下:

dn: ou=shichangtuozhanbu,ou=Leader,dc=anystep,dc=com ou: shichangtuozhanbu

objectClass: organizationalUnit objectClass: top

description:: 5biC5Zy65ouT5bGV6YOo

dn: ou=dakehubu,ou=Leader,dc=anystep,dc=com objectClass: top

objectClass: organizationalUnit ou: dakehubu

description:: 5aSn5a6i5oi36YOoAE3jnKjCow==

dn: cn=user,ou=xitongshi,ou=ITzhichengbu,ou=Leader,dc=anystep,dc=com sn:: 6JSh6Z+1 cn: user

mail: caiyun@wztelecom.cn telephoneNumber: 81889012 objectClass: inetOrgPerson objectClass: top

objectClass: simpleSecurityObject

userPassword: {MD5}4QrcOUm6Wau+VuBX8g+IPg== uid: 4540

我们先看第1部分,蓝色文字标出的区域。

第 8 页

单点登录

首先需要说明的,是“dn”。dn是Distinguished Name的缩写,可以简单地将其想象为LDAP上某个节点的路径,只不过路径的写法刚好和文件路径的写法相反,dn是根节点在最后,各个分支节点依次向前排列。例如

dn: ou=shichangtuozhanbu,ou=Leader,dc=anystep,dc=com

表明当前节点是dc=com -> dc=anystep -> ou=Leader -> ou= shichangtuozhanbu。

下一行ou: shichangtuozhanbu表明当前节点是一个ou类型的容器,名字是shichangtuozhanbu。

后面指明当前节点的objectclass,有多个objectclass,这里就会都列出来。 description是节点的描述名称,这里的一长串字符,实际上对应的是中文字。

绿色文字标出的,是一个地址簿节点。sn是名,也是中文。后面是一些电子邮件、电话之类的信息。

LDIF对于批量化地创建或者导入LDAP数据,是非常有用的。

2.5 LDAP相关软件

LDAP的服务器软件很多,除了商业软件之外,比较常用的是开源的OpenLDAP。 完全使用LDIF文件来生成LDAP数据,除了使用软件之外,手工操作会显得比较麻烦。因此,也出现了很多图形界面客户端。

一个比较好的LDAP客户端是phpldapadmin,这是一个PHP编写的LDAP客户端,基本上具备了所有常用的功能,缺点就是执行比较慢,操作有点麻烦。

phpldapadmin的一个屏幕截图如图3所示。

图 3 phpldapadmin的一个屏幕截图

2.6 CAS基本情况

CAS单点登录系统最早由耶鲁大学开发。2004年12月,CAS成为JA-SIG中的一个项目。JA-SIG的全称是Java Architectures Special Interest Group,是在高校中推广和探讨基于

第 9 页

单点登录

Java的开源技术的一个组织。

CAS的服务端是使用Java写的,基于Tomcat5来运行。 CAS的客户端很多,包括: ? Apache客户端AuthCAS

? 如果用户的认证是通过Apache来实现的,那么使用这个客户端就能够实现单

点登录。有些网页邮件系统是通过Apache来实现认证的。

? uPortal客户端

? uPortal是Java写的一个门户系统。 ? Java客户端

? CAS本身是使用Java写的,因此对Java客户端的支持也最完善。 ? Acegi客户端

? Acegi是Spring Framework的安全机制,而Spring Framework是一个应用较广

的J2EE应用程序框架。

? .NET C# 客户端CASP

? 这是一个使用C#写的CAS客户端,用于.NET程序的单点登录。 ? ASP.NET的例子

? ASP.NET没有专门的客户端,但是有一个例子来说明如何在ASP.NET中使用

CAS。这个例子直接校验CAS的ticket,而不是校验用户名和密码。

? Perl 客户端PerlCAS

? Perl语言的客户端 ? PHP客户端phpCAS

? 这个不用说了,让PHP支持CAS的客户端,用得很广泛。 ? Zope客户端ACASUserFolder

? 让Zope和Plone系统支持CAS的客户端,也用得很广泛。 ? Prado、Ruby、Seraph、WebObjects等客户端。

? 这些国内用得比较少,就不一一描述了。

CAS还有一个列表,列出了经过CAS认证的应用程序,包括:

CASifying Oracle Applications

? ? ?

Oracle Calendar Web Client with mod_cas Oracle Portal

Oracle 11i Applications

ESUP-Portail CASified Applications

ESUP-Portail has CASified and re-distributes many open source applications:

? ?

CASified Horde Sun One CAS Proxy

第 10 页

单点登录

CASifying Misc. Applications

? ? ? ? ? ? ?

Sakai

PeopleSoft

Tomcat Manager

Apache Pluto Poral Driver Outlook Web Access WebCalendar Magnolia CMS

这个列表中没有包含SAP、Lotus Domino、WebSphere、Weblogic等常用的商业系统,这可能就是CAS和商业单点登录产品相比最大的弱项了吧。

2.7 CAS原理简介

CAS被设计为一个独立的Web应用,目前是通过若干个Java servlets来实现的。CAS必须运行在支持SSL的web服务器至上。应用程序可以通过三个URL路径来使用CAS,分别是登录URL(login URL),校验URL(validation URL)和登出URL(logout URL)。

CAS的工作原理如图4所示。

图 4 CAS的工作原理

? 应用程序一开始,通常跳过原来的登陆界面,而直接转向CAS自带的登录界面。

当然也可以在应用程序的主界面上增加一个登录之类的按钮,来完成跳转工作。

第 11 页

单点登录

? 如果用户喜欢的话,也可以手工直接进入CAS的登录界面,先进行登录,在

启动其他的应用程序。不过这种模式主要用于测试环境。

? CAS的登录界面处理所谓的“主体认证”。它要求用户输入用户名和密码,就像普

通的登录界面一样,如图5所示。

图 5 CAS的登录界面

? ?

?

?

主体认证时,CAS获取用户名和密码,然后通过某种认证机制进行认证。通常认证机制是LDAP。

为了进行以后的单点登录,CAS向浏览器送回一个所谓的“内存cookie”。这种cookie并不是真的保存在内存中,而只是浏览器一关闭,cookie就自动过期。这个cookie称为“ticket-granting cookie”,用来表明用户已经成功地登录。

认证成功后,CAS服务器创建一个很长的、随机生成的字符串,称为“Ticket”。随后,CAS将这个ticket和成功登录的用户,以及服务联系在一起。这个ticket是一次性使用的一种凭证,它只对登录成功的用户及其服务使用一次。使用过以后立刻失效。

主体认证完成后,CAS将用户的浏览器重定向,回到原来的应用。CAS客户端,在从应用转向CAS的时候,同时也会记录原始的URL,因此CAS知道谁在调用自己。CAS重定向的时候,将ticket作为一个参数传递回去。

? 例如原始应用的网址是http://www.yale.edu/tp,在这个网址上,一开始有如下

语句,转向CAS服务器的单点登录页面https://secure.its.yale.edu/cas/login?service=http://www.yale.edu/tp/auth.jsp。 ? CAS完成主体认证后,会使用下面URL进行重定向

http://www.yale.edu/tp/authenticate.jsp?ticket=

ST-2-7FahVdQ0rYdQxHFBIkKgfYCrcoSHRTsFZ2w-20。

第 12 页

单点登录

? 收到ticket之后,应用程序需要验证ticket。这是通过将ticket 传递给一个校验URL

来实现的。校验URL也是CAS服务器提供的。

? CAS通过校验路径获得了ticket之后,通过内部的数据库对其进行判断。如果判断

是有效性,则返回一个NetID给应用程序。

? 随后CAS将ticket作废,并且在客户端留下一个cookie。

? 以后其他应用程序就使用这个cookie进行认证(当然通过CAS的客户端),而不

再需要输入用户名和密码。

2.8 选择CAS的理由

经过对开源SSO软件进行全面考察之后,我们认为CAS是目前最好的选择:

? ? ? ? ?

不过同时也应该看到,CAS目前还不支持SAP、Lotus Domino、WebSphere、Weblogic等常用的商业系统,因此如果希望对上述系统进行单点登录,那么只能选择商业软件了。

完全开放的、有完整文档的协议 开源软件,代码尽在掌握

有着对Java,.Net,PHP,Zope,Apache等多种客户端的成熟支持 并且有良好的社区支持,和不断升级的版本 大量的实际部署,成熟可靠

3、单点登录系统安装

尽管CAS已经算比较容易安装和调试的了,然而将整个单点登录系统完全安装并运行起来,仍然是一个复杂的工作。以笔者为例,尽管非常熟悉Linux系统,仍然花了整整12天才全部调通。

下面的安装步骤尽可能详细,但如果您仍然无法安装成功,或者根本没有兴趣执行这些繁琐的操作,那么请直接下载虚拟机使用。虚拟机上所有的软件都处于“Ready”状态,而且下载尺寸比Linux服务器更小。

3.1 安装Linux服务器

我们选择SuSE Enterprise Server 10作为基本的Linux服务器。为什么选择这个服务器?理由如下:

? 目前国际通行的高品质Linux服务器,实际上只有Novell公司的SLES(SuSE

Enterprise Server)和RedHat公司的RHEL(RedHat Enterprise Linux)。 ? SLES 10包含的各种软件包版本比RHEL 4.3新。例如PHP5、Tomcat5等,在SLES

中都是默认的,而在RHEL中需要自己去配。

? SLES的图形界面非常值得称道,笔者认为用起来更简单,很有一些像Windows

服务器那样易于使用的感觉,如图6所示。

第 13 页

单点登录

图 6 SLES 10及其Yast管理界面

SLES可以从Novell公司的网站上下载,网址为http://www.novell.com/products/server/eval.html。下载时需要先填写一个注册表单。

下载的版本虽然是60天试用版,然而这个60天试用的意思是试用SLES的在线升级和技术支持服务,并不是说SLES服务器只能用60天。SLES产品本身是基于GPL的,可以免费下载和持续使用。

当然,对于商业公司,也许购买服务更合适一些,毕竟在线升级对于系统的安全和保持最新状态还是很有意义的。

另一个国内的下载站点是http://download.chinaunix.net/download/0013000/12357.shtml。至少在写本文的时候,这个站点是有效的,并且其下载速度是非常快的。

下载了之后,就可以进行安装了。这里要特别说明的是,除非您熟悉Linux,否则不要轻易尝试Linux系统的直接安装。特别是如果您希望在Windows机器上的某个分区上安装Linux,那么就要特别小心了,各种误操作很容易把硬盘上的数据毁掉。所以对于不太熟悉的用户,我们高度推荐您使用虚拟机而不是直接安装Linux系统。

如果您是Linux高手,那么按照提示安装SLES 10,应该不会有难于理解的地方。如果您的硬盘空间足够的话,最好把所有的包都装进去,这样省得以后缺这个、少那个的。如果您按照本文进行操作,而有些莫名其妙的错误的话,最大的可能就是缺少了某个软件包。

在安装中,您需要输入您的IP地址。这里假设服务器的IP地址是192.168.1.6(当然您可以按照您的喜好设置成任何IP地址)。

安装完成后,就要开始检查软件包,并进行一些基本的配置。

首先在开始菜单中,单击Yast,进入管理界面。SLES的管理软件称为Yast,这是一个

第 14 页

单点登录

非常好用的图形界面管理软件。

单击“软件”>“软件管理”,进入软件包管理界面,如图7所示。

图 7 软件管理

搜索PHP,此时会列出所有PHP的扩展软件包。特别检查一下php5-ldap是否安装进去了,这个软件包是使用LDAP必不可少的。推荐将所有的扩展都安装进去,例如php5-mysql之类,这样避免以后的麻烦。

随后,再检查一下tomcat5是否安装了,如果没有安装,则安装它。如果您很熟悉tomcat5的话,可以只安装基本的包,否则可以同时安装管理包和例子包。

软件包安装完成后,在Yast中,单击“网络服务”>“http服务器”,修改Apache2的配置,如图8所示。将Apache2服务的端口号修改为8091。这一步并不是必须的操作,只不过在我们的系统中提供Web服务的程序比较多。为了方便管理,将apache2服务设定为8091端口。在实际的应用系统中,您仍然可以根据需要,设定80等端口。

下面设置服务的运行级别,这样使得系统启动时,服务自动启动,而不再需要一个一个地手工启动。进入“系统”>“系统服务(运行级别)”,在弹出的窗口中,选择“专家方式”如图9所示。

选择apache2服务,然后在窗口的底部,选中“3”和“5”。这个意思是在Linux的启动模式3(字符界面启动)和启动模式5(图形界面启动)中,默认启动apache2服务。

同样的方法,设置tomcat5和ldap服务。

第 15 页

单点登录

图 8 修改apache2配置

图 9 设置服务的运行级别

第 16 页

单点登录

重新启动Linux系统。在浏览器中输入http://192.168.1.6:8091,此时应该出现“It works”字样,表明apache2服务正常工作了。

此时还不用测试tomcat5和ldap服务器,因为后面还要对它们进行配置。

3.2 LDAP服务器

SLES中,默认安装的是OpenLDAP,这是一个开放源代码的LDAP服务器。

配置LDAP服务器的第1步,是修改slapd.conf配置文件。通常在默认的slapd.conf的基础上进行修改。

打开/etc/openldap/slapd.conf文件,进行编辑,结果如下:

#

# See slapd.conf(5) for details on configuration options. # This file should NOT be world readable. #

include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/rfc2307bis.schema include /etc/openldap/schema/yast.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. #referral ldap://root.openldap.org

pidfile /var/run/slapd/slapd.pid argsfile /var/run/slapd/slapd.args

# Load dynamic backend modules:

modulepath /usr/lib/openldap/modules # moduleload back_ldap.la # moduleload back_meta.la # moduleload back_monitor.la # moduleload back_perl.la

# Sample security restrictions

# Require integrity protection (prevent hijacking)

# Require 112-bit (3DES or better) encryption for updates # Require 63-bit encryption for simple bind # security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:

# Root DSE: allow anyone to read it

# Subschema (sub)entry DSE: allow anyone to read it # Other DSEs:

# Allow self write access to user password # Allow anonymous users to authenticate # Allow read access to everything else # Directives needed to implement policy: access to dn.base=\ by * read

access to dn.base=\ by * read

access to attrs=userPassword,userPKCS12 by self write by * auth

access to attrs=shadowLastChange

第 17 页

单点登录

by self write by * read

access to *

by * read

# if no access controls are present, the default policy

# allows anyone and everyone to read anything but restricts # updates to rootdn. (e.g., \#

# rootdn can always read and write EVERYTHING!

####################################################################### # BDB database definitions

#######################################################################

loglevel 0

TLSCertificateFile /etc/ssl/servercerts/servercert.pem TLSCACertificatePath /etc/ssl/certs/

TLSCertificateKeyFile /etc/ssl/servercerts/serverkey.pem database bdb

suffix \

rootdn \#rootpw secret

rootpw {SSHA}64Zasvn23ICx14ql4Y8vdghly3ovK7zQ directory /var/lib/ldap checkpoint 1024 5 cachesize 10000

index objectClass,uidNumber,gidNumber eq index member,mail eq,pres

index cn,displayname,uid,sn,givenname sub,eq,pres

在上面的slapd.conf文件中。只有蓝色的文字,是我们修改的,其他地方保持默认值即可。

? suffix \

? 这是用来指定LDAP所属的域,应该换成您自己单位的域名。例如,您的域

名是my.org则这里应该写为suffix “dc=my,dc=org”。

? rootdn \

? 这是指定LDAP的根。除了域名要换成您自己的域名之外,Manage也可以改

成您自己喜欢的某个根用户名称,例如root,admin之类。

? rootpw {SSHA}64Zasvn23ICx14ql4Y8vdghly3ovK7zQ

? 这是指定LDAP根的密码。这个密码是采用SSHA编码的,其实际的值是

“secret”,以后要求您输入LDAP的密码时,就输入“secret”。 ? 当然您可以换成您自己喜欢的密码,只不过要自己去生成SSHA的编码。LDAP

也接受md5等其他格式的加密方式。

然后,您还需要自己创建一个LDIF文件,例如可以将它放在root下,名字为base.ldif。

dn: dc=anystep, dc=com objectClass: top objectClass: domain

domainComponent: anystep

dn: cn=Manager, dc=anystep, dc=com objectClass: top

objectClass: organizationalRole cn: Manager

第 18 页

单点登录

dn: o=hosting, dc=anystep, dc=com objectClass: top

objectClass: organization o: hosting

dn: ou=postfix, dc=anystep, dc=com objectclass: top

objectclass: organizationalUnit ou: postfix

dn: ou=PloneGroup, dc=anystep, dc=com objectclass: top

objectclass: organizationalUnit ou: PloneGroup

dn: ou=Leader, dc=anystep, dc=com objectclass: organizationalUnit objectclass: top ou: Leader

这里的LDIF只包含到第1级的组织名称。其他的我们可以用图形界面来生成。同样,您可以根据自己的需要,修改域名和组织名称。

然后在Linux终端执行下面语句:

service ldap restart

ldapadd -x -D \

这样首先重新启动LDAP服务,然后将base.ldif文件添加到LDAP中,对其进行初始化。

然后对LDAP服务器进行测试,看看其是否运行正常。首先测试LDAP的389端口,是否处于监听状态。输入语句:

netstat -an | grep 389

正确的结果应该类似:

tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN tcp 0 0 :::389 :::* LISTEN

然后测试LDAP的搜索功能。

ldapsearch -x -b ' ou=Leader, dc=anystep, dc=com'

正确的话,应该列出搜索的结果:

# extended LDIF #

# LDAPv3

# base < ou=Leader, dc=anystep, dc=com> with scope subtree # filter: (objectclass=*)

第 19 页

单点登录

# requesting: ALL #

# search result search: 2

result: 32 No such object

matchedDN: dc=anystep,dc=com

# numResponses: 1

LDAP测试正确后,就可以开始安装图形界面的管理工具。当然,您也可以不用这个管理工具,而直接使用LDIF文件导入数据。

首先从http://phpldapadmin.sourceforge.net/中下载软件。然后将其解压缩到/srv/www/htdocs路径下,这个路径是apache2的应用路径。如果您觉得文件phpldapadmin后面的版本号碍事的话,可以修改文件夹的名字,去掉版本号。

然后进入/srv/www/htdocs/phpldapadmin/config,将config.php.example复制为config.php,然后打开config.php文件,对配置进行修改。

config.php将需要的配置都注释起来,如果用户想修改,就去掉注释,并进行修改。我们一共修改了如下语句。

$ldapservers->SetValue($i,'server','name','NewChoice LDAP Server');

$ldapservers->SetValue($i,'server','host','192.168.1.6'); $ldapservers->SetValue($i,'server','base',array('ou=Leader, dc=anystep, dc=com'));

$ldapservers->SetValue($i,'server','auth_type','cookie');

第1句用来对这个LDAP服务器起一个名字,名字是什么无所谓,喜欢就好。 第2句用来指定服务器的地址。

第3句用来指定希望操作的分枝的路径。例如,我们只希望在ou=Leader这个分支下面,增加或者修改我们的LDAP节点,就指定这个分支。指定分支之后,该分支以外的其他分支,在图形界面中是不出现的。

第4句设置使用cookie登录。

修改完配置文件后,在浏览器中输入http://192.168.1.6:8091/phpldapadmin,此时应该出现如图10所示的界面。

第 20 页

单点登录

图 10 phpldapadmin的登录界面

单击“Login…”,进入登录画面。输入用户名为cn=Manager,dc=anystep,dc=com,密码为secret,单击Authenticate按钮,就进入了LDAP服务器。

图 11 phpldapadmin的登录界面

界面的左边,是按照树形结构列出的LDAP的内容。单击一个节点,在右边列出其值。这个可以增加、修改属性,或者删除节点等。

在左边单击“Create new entry here”,可以增加一个新的节点。此时右边的窗口会显示

第 21 页

单点登录

出很多预设的节点类型,选择您希望添加的节点类型,按照提示进行操作即可。

phpldapadmin的详细使用方法超出了本文的范围,反正这个软件也不复杂,您自己尝试一下,很快就能掌握。

注意必须创建admin或者root这样的用户,很多单点登录的应用程序必须使用这样的用户进行管理员账户的登录。

然后至少您还需要创建一些用于测试(或者实际使用)的账户。其LDIF的例子如下:

dn: cn=user,ou=xitongshi,ou=ITzhichengbu,ou=Leader,dc=anystep,dc=com sn:: 6JSh6Z+1 cn: user

mail: user@newchoice.cn telephoneNumber: 81570112 objectClass: inetOrgPerson objectClass: top

objectClass: simpleSecurityObject

userPassword: {MD5}4QrcOUm6Wau+VuBX8g+IPg== uid: 4540

注意,其至少有两个objectClass,一个是inetOrgPerson,这是标准的地址簿类型,另一个是simpleSecurityObject,这是标准的用户密码类型。

3.3 安装SSL和Tomcat

CAS需要SSL(安全套接字层)才能正常工作。SSL是一套提供身份验证、保密性和数据完整性的加密技术,最常用来在Web浏览器和Web服务器之间建立安全通信通道。

为支持SSL通信,必须为Web服务器配置 SSL 证书。SSL证书最好由专业的CA机构颁发。http://www.microsoft.com/china/technet/security/guidance/secmod30.mspx上有一篇很好的文档,介绍如何申请证书。

不过如果只是自己使用的话,也可以自己生成一个证书。

在Linux的终端中,输入:

rm .keystore

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -validity 365

第1步操作用于删除原来的SSL文件(如果有的话)。第2步操作用于生成一个新的证书,最后的365代表证书有效的时间。

输入第2步的指令后,会提示很多问题:

? 首先要求输入密码,目前密码是changeit,这是SSL证书默认的密码。 ? 随后要求输入“公用名”。注意这个参数是很重要的,公用名应该和您的服务器网

站的名称一致。对于内部网络,可以使用IP地址。例如我们就使用192.168.1.6。 ? 随后要求输入证书的“组织单位”和“组织”,这个输入您的公司名称或者其他什

么的,都可以。

第 22 页

单点登录

? 随后输入“城市”、“省”、“国家”。国家输入的是代码,中国是cn。 ? 最后列出您输入的信息,并要求确认。输入“y”。

? 例如我们输入的信息是:CN=192.168.1.6, OU=newchoice, O=newchoice,

L=Beijing, ST=Beijing, C=cn correct?

? 最后输入回车,确认密码。

这样就创建了一个证书。此时,在/root下面,生成一个.keystore文件,这个文件就是证书文件。

然后执行命令:

cp .keystore /usr/share/tomcat5/

这一步将.keystore文件复制到/usr/share/tomcat5/下面。注意,这一步非常重要,否则不成功。因为tomcat5默认指定的是这个位置下的证书文件,而如何指定路径则需要进一步尝试。为了简单起见,将文件复制过去。

如果您希望将证书导出为文件,可以执行下面的操作:

$JAVA_HOME/bin/keytool -export -alias tomcat -keypass changeit -file server.crt

最后一个参数是文件名。

完成了证书创建之后,还需要修改tomcat的配置。

编辑/srv/www/tomcat5/base/conf中的server.xml文件,将

maxThreads=\ enableLookups=\

acceptCount=\ clientAuth=\

这个语句前后的注释去掉,这样就设置了tomcat支持SSL连接。另外,还需要将

maxThreads=\ enableLookups=\ debug=\ disableUploadTimeout=\

这个语句中的端口号由原来的8080修改为8082。因为我们后面的Plone系统默认会使用8080端口号,为了避免冲突,因此需要修改tomcat的端口号。

修改完成后,输入下面的命令,重新启动tomcat服务:

Service tomcat5 restart

在浏览器中输入https://192.168.1.6:8443就可以通过SSL访问tomcat了。如果是IE的

第 23 页

单点登录

话,首先会弹出一个对话框,提示你证书不是由信任的机构颁发的。这个是很自然的,因为证书是自己生成的。

单击“查看证书”,单击“安装证书”,在向导种选择“将所有的证书放在下面存储区”,然后单击“浏览”,选择“受信任的根证书颁发机构”。单击确定安装证书。这样IE以后就会认为证书是由受信任的机构颁发的。

如果不想安装,也可以直接在对话框中单击“是”。之后应该出现tomcat的主页,如图12所示。

出现这个主页,就表明tomcat运行正常,并且已经支持SSL了。

图 12 tomcat的主页

3.4 CAS安装

首先,访问http://www.ja-sig.org/products/cas/downloads/index.html下载CAS的最新版本。目前我们使用的版本是cas-server-3.0.5.tar.gz。

在root终端下,输入:

tar –zvxf cas-server-3.0.5.tar.gz

这样解开压缩包。进入cas-server-3.0.5/webapp/WEB-INF文件夹,编辑deployerConfigContext.xml文件。这个文件是用来配置CAS的认证方式的,默认的方式是CAS自己写的演示代码,我们需要将其修改为使用LDAP认证。

这个文件修改如下:

第 24 页

单点登录

| The AuthenticationManagerImpl considers them in order, finding a CredentialToPrincipalResolver which

| supports the presented credentials. | | AuthenticationManagerImpl uses these resolvers for two purposes. First, it uses them to identify the Principal

| attempting to authenticate to CAS /login . In the default configuration, it is the DefaultCredentialsToPrincipalResolver

| that fills this role. If you are using some other kind of credentials than UsernamePasswordCredentials, you will need to replace

| DefaultCredentialsToPrincipalResolver with a

CredentialsToPrincipalResolver that supports the credentials you are

| using. | | Second, AuthenticationManagerImpl uses these resolvers to identify a service requesting a proxy granting ticket.

| In the default configuration, it is the

HttpBasedServiceCredentialsToPrincipalResolver that serves this purpose.

| You will need to change this list if you are identifying services by something more or other than their callback URL.

+-->

第 26 页

单点登录