|
|
Cams:一个经典、优美、概念清晰的基于Java的集中式认证和授权实现 [pre]Cams站点: www.cafesoft.com
翻译整理:胡拥军 hu.yong.jun@ctgpc.com.cn 2003-05-13
================================================================================================== 一.介绍 2 使用Cams进行集中访问管理 2 Cams服务器 3 安全域 4 访问控制服务 5 认证服务 7 Cams代理 8 Cams代理类型 8 Web单点登录(SSO) 8 二.与实际应用快速集成 10 步骤1 - 配置安全域注册 11 步骤2 - 配置系统安全域 12 步骤3 - 配置mydomain安全域 14 步骤4 - 配置Cams Web代理 15 步骤5 - 测试 15 ==================================================================================================
======== 一.介绍 ========
Cafesoft访问管理系统(简称Cams)是一个易于使用的、可靠的和经济的安全控制平台,它集中地控制、管 理和监控对受到保护的网络应用和数据的访问。管理员决定谁获得对系统资源的访问,Cams执行这个策略,并在 日志中记录结果,被Cams保护的资源可以驻留在内联网、外联网或互联网上。与在每一个应用本身中构建客户的 访问控制系统相比,Cams通过集中的应用安全管理和访问,使得站点更安全、更好管理。集中安全控制方式降低 了开发和管理的成本,缩短了产品进入市场的周期,提高了安全性和用户满意度。
作为Cams管理员,你需要一些关于Cams是如何组织和如何工作的基本知识,这样你就能配置Cams的访问控制、 认证和审计。本章对Cams作总体介绍,如何管理Cams服务器、安全访问和代理,请参考其它章节。 使用Cams进行集中访问管理
Cams是一个集中访问管理方案,在Cams中,分布的代理将安全判断委托给集中的授权机制??Cams服务器。Cams 设计来保护任何虚拟类型资源,包括:Web页面、文件、数据源和EJB等等。当代理发出访问控制请求后,Cams服务 器中的访问控制服务判断是否授权或拒绝对请求资源的访问,然后请求代理执行该决定。
图1展示了一个可能的Cams部署。在该部署中,用户1试图访问位于2个不同Web服务器上的资源,每个Web服务 器都有一个Cams Web代理,代理把访问控制和认证请求委托给中心Cams服务器。用户2试图通过Java客户应用或 Applet访问一个应用服务器,该服务器中有Servlet、EJB和数据源,应用服务器有一个内置的Cams应用服务器代 理,它也把访问控制和认证请求委托给中心Cams服务器。[/pre]
 [pre]图1 - 使用Cams进行集中访问管理
如上所示,Cams在中心Cams服务器执行访问控制策略和登录配置。Cams服务器还集中进行用户活动日志记录 和安全管理。虽然图1所示的使用图形用户界面发出请求的是实实在在的用户,但要记住的是,用户也可能是一台 计算机,例如,用户可能是商业伙伴的订单系统,它在你的站点自动地下订单。 Cams服务器
Cams的核心是Cams服务器,它有一些互相操作的高层的安全访问,包括:
1. 访问控制访问 - 授权或拒绝对资源的访问 2. 认证访问 - 验证用户标识,并为用户建立一个会话,直到用户登出或闲置超时 3. 会话访问访问 - 向代理提供用户的认证信息 4. 会话控制服务 - 控制对会话的修改和关闭
Cams服务器既是策略服务器,又是认证服务器,它处理访问控制和认证请求。Cams服务器所提供的服务可以在 3个逻辑层次上组织,如图2所示:[/pre]
 [pre]图2 - Cams服务的逻辑分层
网络适配器层能让Cams服务器在不同的TCP/IP端口上提供服务,并允许客户端使用不同的协议。服务提供层 提供安全服务,如认证和访问控制;这个抽象的层为Cams的扩展提供了灵活性,Cams几乎可以保护任何网络资源, 但使用的却是同一个服务提供层服务。
Cams代理通常在TCP/IP端口上访问安全服务,而象让Cams服务器终止等管理服务和访问控制在另外的端口上 可用,还可以通过防火墙,限制对某个Cams服务器的访问。当然,你也可以用Cams来实现Cams代理的认证和访问 控制。
Cams引擎层有安全域服务。安全域服务提供了一个根据管理的需要划分资源和用户的方式。什么是安全域?阅 读下节。
====== 安全域 ======
在Cams安全模型中,资源和用户账号都是被某个安全域所拥有,这使得访问管理可以根据组织和物理界限分区。 不同的安全域被不同的个人、部门和公司配置和管理。
每个安全域有它自己的服务,包括:
1. 访问控制服务 - 根据一个访问控制策略授权或拒绝对受保护资源的访问 2. 认证服务 - 验证用户标识,创建用户会话,直到用户登出或闲置超时 3. 会话访问服务 - 向代理提供用户认证的信息 4. 会话控制服务 - 控制会话的修改和关闭 5. 会话管理服务 - 管理经过认证的用户会话,如果闲置超时则使其过期 6. 服务管理服务 - 通过编程API,使客户安全域的特定服务可以使用或重用
前4个安全域服务就是服务提供层中服务的临摹,后2个服务(会话管理和服务管理)是安全域中特有的。作为 管理员,要特别在意访问控制服务和认证服务,因为它们有很多配置工作。下面介绍各个安全域的访问控制服务和 认证服务是如何组织的,以便更好理解如何配置它们。 访问控制服务
访问控制服务位于安全域中,它有其处理管道(pipeline),称为访问控制管道。这个管道包含有可插入的访 问控制阀序列。默认地,第一个访问控制阀是记录请求的日志器,最后一个控制阀(也称为基阀)使用特定于安全 域的访问控制策略来授权或拒绝访问。安全域中的访问控制服务的组件图如图3所示:[/pre]
 [pre]图3 - 安全域访问控制服务结构
============ 访问控制策略 ============
每个安全域使用一个访问控制策略来保护它所拥有的资源,访问控制策略中包含有权限集和一个访问控制规则 库。
==== 权限 ====
权限关联了一个资源集(用资源模式定义),资源集有2个可能的动作:用于授权或拒绝对资源访问的访问控 制规则或访问控制所要委托的安全域。一个特殊的系统安全域收到所有的访问控制请求,并把其中的大多数委托给 一个或多个其它的安全域,这些安全域是你要配置的。系统安全域还认证Cams系统管理员和代理,保护系统级资源。 访问控制规则
Cams的访问控制规则控制对资源的访问,通过以下条件:
· 经过认证用户角色 · 远程主机/IP地址 · 安全的连接(如SSL/TLS) · 日期/时间 · 认证方法
这些规则可以根据需要客户化,并用“AND”、“OR”和“NOT”操作符结合起来构成可重用的、结构化的表达 式。另外,使用编程API可以创建新的访问控制规则类型,并插入到任何Cams访问控制策略中。例如,你也许想创 建一个访问控制规则,它基于数据库中的值,如某个账户存款数量,来授权访问资源。 访问控制请求/响应
Cams代理发送一个访问控制请求给Cams服务器,检查用户对资源的访问。访问控制请求包含有请求资源的信息 (资源类型、资源唯一标识和一个或多个请求动作)。例如,一个用户通过Web浏览器访问http://www.cafesoft.com/index.html, 那么就有以下资源请求参数:
1. 资源类型:http 2. 资源标识:http://www.cafesoft.com/index.html 3. 动作:GET
访问控制请求还包含其它参数,这些参数对决定是否授权访问非常重要:
· 访问资源的客户的IP地址/主机名 · Cams会话标识(已经认证的用户) · 客户网络连接是否安全的标志 · 资源提供者的日期/时间
最终,Cams安全域中访问控制服务要处理访问控制请求,形成访问控制响应,返回给代理。了解更多关于Cams 访问控制服务如何工作,阅读“访问控制服务(Access Control Services)”一节。 认证服务
每个安全域中都有认证服务,认证服务有其自己的处理管道,称为认证管道。认证管道由可插入的认证阀序列 构成。默认地,第一个认证阀记录认证请求的日志,最后一个认证阀(又称基阀)根据认证请求的信息进行认证。 一个安全域的认证服务的组件构成如图4: [/pre]
 [pre]图4 - 安全域的认证服务结构
======== 登录配置 ========
每个安全域有它自己的登录配置,说明客户如何认证。登录配置包含登录配置条目,每个条目对应所要认证的 应用。
======== 登录模块 ========
每个登录配置条目引用一个或多个登录模块,登录模块让你配置认证是基于哪种用户库(译者注:即Realm), 如LDAP服务器、关系数据库和XML文件,用户库中包含有用户、口令、组和角色信息。Cams提供了很多可配置的登 录模块,它们符合JAAS API,支持LDAP、RDBMS(SQL)和XML用户库。如果有Cams不支持的用户库,你可以创建自 己的登录模块来实现认证。
更多关于Cams认证服务信息阅读“登录配置(Login Configuration)”一节。 Cams代理
Cams代理是一个软件组件,它把安全请求委托给Cams服务器。代理的目的是把访问控制请求和认证委托给Cams 服务器,并根据Cams服务器返回的结果执行相应动作。代理的安装和配置与代理所安装的环境有很大关系。 Cams代理类型
当前,Cams支持Web代理。Web代理安装于web服务器(如apache或Tomcat)中,它执行对以下资源的访问控制 和认证:web页面、cgi-bin文件、servlet和JSP页面等等。Web代理使用每个站点的登录页面提示用户输入认证信 息,然后把认证请求以及获得的用户凭证信息一起委托给Cams服务器。Web代理在特殊的HTTP header中附带上用户 信息,用于支持站点个性化。
了解如何安装和配置Cams Web代理,阅读“Cams Apache Web代理(Cams Apache Web Agent)”和“Cams Tomcat Web代理(Cams Tomcat Web Agent)”文档。 Web单点登录(SSO)
Web单点登录能让用户在一台服务器上认证,访问其它服务器(或同一台物理服务器上的虚拟主机)的资源时 无需再次认证。目前Cams只在单个DNS域以及其子域内支持单点登录。图5示意一个用户访问一个站点的经历,在 这个站点里,每个服务器都实现自己的认证和访问控制,不支持SSO。用户在www.travel.com上认证过了,当它继 续访问www2.travel.com和payment.travel.com上的资源时,它需要在每台服务器上再次认证。[/pre]
 [pre]图5 - 访问一个DNS域内的多个服务器(不支持SSO方式)
在一个支持SSO的站点上,一旦用户通过认证,它就可以使用同一个DNS域及其子域内的其它服务器。图6示意 该情形。[/pre]  [pre]图6 - 访问一个DNS域内的多个服务器(支持SSO方式)
Cams Web代理利用HTTP Cookie支持一个DNS域内的SSO,大多数浏览器默认支持Cookie。了解更多如何配置SSO 信息,阅读“Cams Apache Web代理(Cams Apache Web Agent)”和“Cams Tomcat Web代理(Cams Tomcat Web Agent)” 文档。
====================== 二.与实际应用快速集成 ======================
现在你已经安装好Cams了,也看到了Cams evaluator's portal,本文档指导你为你的集成环境快速配置Cams, 该指南的其它部分是详细信息的参考。
本文档解决最小安装状态下的Cams服务器和Cams Web代理的快速配置问题。本文档假设你成功安装Cams服务器, 并至少部署了一个Cams Web代理。如果你还没有完成该步骤,请阅读“安装指南(Installation Guide)”一节。
为了配置Cams,你要编辑安全域注册,每个安全域有一个XML注册文件,cams-webagent.conf对应Cams Web代 理的配置。以下步骤指导你如何修改Cams服务器的配置:
1. 配置安全域注册 2. 配置系统安全域 3. 配置mydomain安全域 4. 配置Cams Web代理 5. 测试
符号变量CAMS_HOME代表你所安装有Cams的目录。
======================= 步骤1 - 配置安全域注册 =======================
security-domain-registry.xml文件定义了一个Cams服务器中所有安全域。虽然安全域的配置数据的默认存放 位置是CAMS_HOME/conf目录,但可以在CAMS_HOME/conf/cams.conf文件中改变它的位置: security.domain.registry.factory.params=${cams.home.dir}/conf/domains/security-domain-registry.xml
我们使用它的默认存放位置。编辑CAMS_HOME/conf/domains/security-domain-registry.xml文件,在Cams发 布包中带有3个配置好的安全域:
· system - Cams服务器所要求 · examples - 即刚才看到的Cams evaluation portal · mydomain - 利用该安全域配置用户自己的安全域
在security-domain-registry.xml文件中,system和examples条目是使能的,而mydomain条目是禁止的,现在 禁止examples,使能mydomain。
<!-- Register the examples security domain --> <security-domain enabled="false"> <name>examples</name> <home>${cams.home}/conf/domains/examples</home> </security-domain> <!-- Register the mydomain security domain --> <security-domain enabled="true"> <name>mydomain</name> <home>${cams.home}/conf/domains/mydomain</home> </security-domain>
禁止一个安全域条目的好处是仍然可以保留安全域的配置数据,要想完全删除一个安全域,比如examples,你 可以在security-domain-registry.xml文件中删除examples条目,同时删除CAMS_HOME/conf/domains/examples目录。
下面假设你在注册文件中有2个使能的安全域:system和mydomain。
注意在security-domain-registry.xml文件中顶部的以下参数:
<var name="http.resource.base.id" value="http://localhost:8080"/> <var name="https.resource.base.id" value="https://localhost:8443"/> <var name="cams.resource.base.id" value="cams://localhost:9191"/> <var name="cams.logs.base.dir" value="${cams.home}/logs"/>
这些参数是该配置文件的变量声明,是代表资源权限的,Cams配置文件中会有很多这样的变量。例如,你也许 要改变localhost为一个实际的值:
<var name="http.resource.base.id" value="http://localhost:8080"/> <var name="https.resource.base.id" value="https://localhost:8443"/> <var name="cams.resource.base.id" value="cams://localhost:9191"/>
修改为:
<var name="http.resource.base.id" value="http://web_agent_hostname:8080"/> <var name="https.resource.base.id" value="https://web_agent_hostname:8443"/> <var name="cams.resource.base.id" value="cams://cams_server_hostname:9191"/>
现在保存该配置文件。
你可以声明任意数量的配置变量。配置变量是有层次结构的,它们继承自XML文档树中的父节点。变量值可以 修改,并在子节点中有效。当你有一个Web代理,它在每个系统中有不同的权限需求时,这点特别有用。有些配置 变量在所有的服务器中都可用,而有些则随着代理的不同而不同。另外,Cams服务器提供了以下内置配置变量:
· cams.home.dir - Cams服务器安装位置全路径 · cams.domain.dir - 某个安全域的全路径位置 · cams.domain.name - 当前安全域名
当你了解更多,使用更多权限后,就会发现配置变量特别有用。
======================= 步骤2 - 配置系统安全域 =======================
你需要修改system安全域条目,该步骤会涉及到关键的安全域配置文件,它们是:
· access-control-policy.xml · login-config.xml · security-domain.xml
几乎所有的安装都要修改前2个文件,security-domain.xml文件也许可以不用改动。在每个安全域中,还可以 发现cams-users.xml文件,该文件是内部的Cams用户库。
到system安全域目录下,编辑access-control-policy.xml文件。
Linux/UNIX:
cd $CAMS_HOME/conf/domains/system vi access-control-policy.xml
Windows
cd %CAMS_HOME%\conf\domains\system notepad access-control-policy.xml
<permission-collection type="http">标签为安全域定义HTTP资源权限。下面2个权限把HTTP和HTTPS资源请 求委托给examples安全域。
<!-- Delegate HTTP permissions to the default security domain --> <permission desc="Delegate all HTTP resource permissions" actions="GET,POST"> <resource-pattern id="${http.resource.base.id}/*"/> <owner id="examples"/> </permission> <!-- Delegate HTTPS permissions to the default security domain --> <permission desc="Delegate all HTTPS resource permissions" actions="GET,POST"> <resource-pattern id="${https.resource.base.id}/*"/> <owner id="examples"/> </permission>
对这2个权限,你要修改:
<owner id="examples"/>
改为:
<owner id="mydomain"/>
保存文件。这些HTTP资源模式的资源权限都会委托给mydomain安全域。注意<permission-collection type="cams"> 标签,该权限集定义了Cams Web代理连接权限,这些权限通常由system安全域自己来处理,不能委托给别人。你会 看到它对访问控制规则的引用:
<acr-ref id="cams agent rule"/>
在配置文件的访问控制库条目<acr-lib>中,“cams agent rule”条目要求经过认证的Web代理具有cams-agent 角色。打开cams-users.xml用户库文件,看到cams-tomcat-agent代理用户具有cams-agent角色,如果没有该角色, Tomcat Web代理就无法认证,也不能授权。所有的Cams Web代理都需要类似的用户账号,它们在cams-users.xml文 件中定义。你也可以选用其它的用户库,如LDAP或SQL数据库,你还可以为Web代理定义其它的访问控制规则,如要 求满足特定的条件等等。
如果你使用的是LDAP或SQL数据库作为用户库,你要修改login-config.xml文件。了解更多,阅读“登录模块” 文档。我们假设使用Cams用户库,它已经为mydoamin配置好了。
=========================== 步骤3 - 配置mydomain安全域 ===========================
在发布包中,mydomain安全域将所有的HTTP或HTTPS请求权限授给所有用户,编辑 CAMS_HOME/conf/domains/mydomain/access-control-policy.xml文件。
在<permission-collection type="http">标签下有:
<!-- Grant GET and POST permission to all HTTP resources --> <permission desc="HTTP Resource Permissions" actions="GET,POST"> <resource-pattern id="${http.resource.base.id}/*"/> <acr-ref id="granted"/> </permission> <!-- Grant GET and POST permission to all HTTPS resources --> <permission desc="HTTPS Resource Permissions" actions="GET,POST"> <resource-pattern id="${https.resource.base.id}/*"/> <acr-ref id="granted"/> </permission>
访问控制规则引用granted规则标识,<acr-ref id="granted"/>,是内置的Cams规则,它把该资源的访问权限 授给所有用户。在这里它应用于所有HTTP和HTTPS请求的根,为例限制mydomain安全域的HTTP请求,首先,定义访 问规则,要求用户具有myrole角色。因此在<acr-lib>和</acr-lib>之间插入以下内容:
<!-- Requires authenticated users to have the "myrole" role --> <auth-acr id="require myrole"> <role-constraint> <role-name>myrole</role-name> </role-constraint> </auth-acr>
编辑HTTP资源权限,将<acr-ref id="granted"/>改为:
<acr-ref id="require myrole"/>
权限条目看起来象这样:
<!-- Grant GET and POST permission to all HTTP resources --> <permission desc="HTTP Resource Permissions" actions="GET,POST"> <resource-pattern id="${http.resource.base.id}/*"/> <acr-ref id="require myrole"/> </permission>
保存文件。Cams服务器现在要求用户具有myrole角色,才可以访问mydomain安全域中的HTTP内容。
然后,你要在cams-user.xml文件中添加具有myrole角色的用户。在CAMS_HOME/conf/domains/mydomain/cams-user.xml 文件中添加以下行:
<user name="myuser" password="myuser" roles="myrole"/>
保存文件。
========================= 步骤4 - 配置Cams Web代理 =========================
在安装指南一节中,你已经安装好了Cams Web代理,我们假设前面的配置都正确无误。Cams Web代理要知道Cams 服务器的地址,它在用户库(通常是cams-user.xm)中还要具有所需要的认证信息。
本文档假设在Web站点的根目录下有一个index.html文件,还假设你已经配置好Cams登录页面、错误页面和拒 绝页面或脚本,这些页面或脚本参考特定代理安装文档。
============= 步骤5 - 测试 =============
启动Cams服务器,测试以上配置。
Linux/UNIX:
$CAMS_HOME/camsServer/bin/runcams.sh
Windows:
%CAMS_HOME%\camsServer\bin\runcams.bat
本文档假设你使用发布包中的Tomcat HTTP服务器。启动Tomcat Web代理:
Linux/UNIX:
$CATALINA_HOME/bin/startup.sh
Windows:
%CATALINA_HOME%\bin\startup.bat
注意:这些指令的执行之间没有顺序要求,Cams服务器和Cams Web代理的启动先后顺序无关。 测试以上集成,通过Web代理的HTTP访问资源内容。你会看到登录页面提示:
username: myuser password: myuser
点击提交,你就会看到index.html页面。 一切正常,成功![/pre] |
|