信息时代的生存哲学

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
用SSO保护web service安全

事实已经充分证明,Web Service是目前最典型的异构分布技术。一个典型的Web service设置将会充分利用多种不同的技术、对象模型和编程语言,其中或许会包含简单的Perl脚本和使用C++ 或 Java实现单个Web service,可能还会有建立在J2EE应用程序服务器之上的复杂应用。Web service的一个明显优势就是能够在不同环境下实现相互作用。但是要做到这一点,需要付出一定的代价:很难保证这些系统的安全性。为所有相关的技术找到一个公共的安全标准也是非常困难的。现在,我们将要谈论single sign-on——以一种灵活而又可互操作的方式实现异构系统的安全性。

基本概念


Web service中使用公共的安全体系结构所带来的主要问题在于安全体系结构具有典型的分布特征,并且这些体系结构通常要求系统中的所有部分都要实现关键性的功能和算法。所有安全系统都有一个令人遗憾的事实,这就是整个系统的安全级别与系统中最脆弱部分的安全级别相同。因此,我们要么避免使用某些技术,要么就对整个系统的安全性进行折衷。很明显,这极易出现不灵活性。避免使用某些技术通常是不切合实际的,而且还会与Web service(它们可以在任何技术之间架起联系的桥梁)背道而驰。有关这个问题的一个可能解决方案就是single sign-on(SSO)体系结构。

single sign-on 安全体系结构的基本想法就是将安全体系结构的复杂性迁移到所谓的SSO服务,因而使得系统的其他部分无须承担任何的安全职责。

在SSO体系结构中,在单个SSO服务器上可以找到所有的安全算法,该服务器是对所定义域进行鉴别的唯一场所。因此,SSO的鉴别/注册方法还有另外一个优点:即便一个用户在一个特定域中同许多不同的安全元素相互作用,他只需要进行一次sign-on。SSO 服务器其本身可能就是一个Web service,可以起到现有安全体系结构周围的外包装的作用,并提供诸如鉴别和授权之类不同类型的安全功能。 本文中,我们将主要关注SSO环境中的鉴别。实际上,SSO具有两种情形,我们首先介绍最简单的情形。

SSO的简单情形


在SSO的简单情形中,被鉴别的一方首先调用SSO服务器并且请求得到一个能够在特定域中标识其自身的鉴别符号。为了能够获得这个符号,被鉴别的一方首先必须提供正确的鉴别资格信息。鉴别资格信息具有多种不同的形式:例如,可以是简单的用户名/口令或者证书,但是也可以采用别的方法。SSO服务器使用底层潜在的安全体系结构对用户的资格信息进行验证。然后才能发布一个入场券,供调用的应用程序鉴别,从而区别于其他的应用程序。在SSO的简单情形中,这个符号并不会强加任何特定的信息,它仅仅只是用户在特定场合和地点中的唯一标识。被调用的应用程序收到该符号之后,通过把符号传递给SSO服务器对其进行验证。其中由SSO服务器进行实际的检验。下面这张图就很好的说明了这个概念:


图 1: SSO的简单情形
SSO方法的主要优势是很明显的:

● 对SSO 服务器中底层潜在的安全体系结构,实现、配置和维护也变得容易许多。分布式系统中的所有通信实体就没有必要单独实现所有的安全功能和机制。

● SOAP对于SSO服务器的接口使SSO体系结构变得非常通用。正如我们在前面所提到的,SSO本身也是一个Web service。如果SSO服务器能够显示其接口的WSDL, SSO API 就可以即刻产生并加以利用。

● 由于不必到处传递安全信用信息,SSO服务器增强了整个系统的安全性。SSO 服务器成为唯一可以接受安全信用信息的场所。而且,SSO的解决方案经常将联合性考虑在内,所以就可以在一个广阔的范围里进行鉴别(超出特定的安全域),而安全信用信息却仍然位于特定的安全域中。
 
高级SSO——使用SAML


每一次当用户被要求进行身份验证时,在前面的SSO简单情形中,SSO服务器调用就是必需的内容。更高级的方法允许符号本身可以包含一些有价值的安全信息,有了这些信息每次验证就不必调用SSO 服务器。符号可以包含鉴别或者授权信息。这些信息由SSO服务器生成并签署,因此如果符号的接收者信赖服务器,它就没有必要做进一步的验证。下图概括了上面所描述的情形:



图 2: 改进的SSO情形


Security Assertions Markup Language(SAML)是一项新的标准,它用来交换使用XML描述的与安全相关的信息。该标准当前正由OASIS在制定并以很快完成。SAML描述的安全信息主要采用有关安全主体的断定声明的形式来表述(例如用户,机器或者服务)。SAML定义了服务使用者发布SAML请求时所依据的协议。所谓的SAML授权机构将返回具有断言的SAML响应。断言总共有三种类型:

● 鉴别声明可以告知特定时间和场所中特定主体的鉴别

● 授权决定将允许或者拒绝主体访问某一特定资源

● 属性将进一步的限定主体(例如,允许的最高透支信息,权责等)。

SAML的使用其实并不局限于SSO情形。它可以用在更加广阔的范围里。如果我们的Web service应用程序能够理解SAML,对安全体系结构进行灵活的重新配置而不用重新编码,实现这一点应该不会很困难。

您可以看一看下面的SAML授权请求。请注意该请求中包含用户的资格信息(我们示例中指的是用户名和加密后的口令)和一些有关响应要求、资格类型等内容的描述。

<samlp:Request MajorVersion="1" MinorVersion="0" 
  RequestID="1fgtTGzMXSqpN++/LcFpBmZWrQg=">
  <samlp:RespondWith>AuthenticationStatement</samlp:RespondWith>
    <samlp:AuthenticationQuery>
      <saml:Subject>
        <saml:NameIdentifier Name="test"/>
        <saml:SubjectConfirmation>
          <saml:ConfirmationMethod>
           http://www.oasis-open.org/committies/security/docs/draft-sstc-core-25/pa
ssword
          </saml:ConfirmationMethod>
          <saml:SubjectConfirmationData>
            cGFzc3dvcmQ=
          </saml:SubjectConfirmationData>
        </saml:SubjectConfirmation>
      </saml:Subject>
    </samlp:AuthenticationQuery>
</samlp:Request>


该请求的响应包含使用一个属性/条件的鉴别声明,该属性/条件指定鉴别的有效期限:

<samlp:Response InResponseTo="1fgtTGzMXSqpN++/LcFpBmZWrQg=" 
  MajorVersion="1" MinorVersion="0" 
  ResponseID="upuSGdmqx7ov01mExYlt+6bDCWE=">
  <samlp:Status>
    <samlp:StatusCode Value="samlp:Success"/>
  </samlp:Status>
  <saml:Assertion AssertionID="+1UyxJDBUza+ao+LqMrE98wmhAI="
    IssueInstant="2002-03-03T14:33:58.456" Issuer="WASPCard"
    MajorVersion="1" MinorVersion="0">
    <saml:Conditions NotBefore="2002-03-03T14:33:58.466"
      NotOnOrAfter="2002-03-03T15:03:58.466"/>
      <saml:AuthenticationStatement
        AuthenticationInstant="2002-03-03T14:33:55.201"
AuthenticationMethod="http://www.oasis-open.org/committies/security/docs/draft-sstc-
core-25/password">
          <saml:Subject>
            <saml:NameIdentifier Name="test"
SecurityDomain="card:SQLDatabase"/>
            <saml:SubjectConfirmation>
              <saml:ConfirmationMethod>
http://www.oasis-open.org/committies/security/docs/draft-sstc-core-25/password
              </saml:ConfirmationMethod>
            </saml:SubjectConfirmation>
          </saml:Subject>
        </saml:AuthenticationStatement>
  </saml:Assertion>
</samlp:Response>


注:SAML鉴别声明具有签名,因此接收一方可以很容易地进行来源验证的检查并作出是否信任SAML声明提供者的决定。
安装


我们将需要安装 Systinet WASP 服务器高级版和 WASP CARD,这样才能顺利运行下面的演示样本。

注:您需要下载WASP服务器的最新版本(3.0.3 最终版),这样才能顺利运行演示样本。

1.请确保机器上已经安装Sun Java SDK 1.3.x.

2.将文件congs.jar从Sun JAAS 1.0包(下载该包的地址为http://java.sun.com/products/jaas/index-10.html)复制到安装Java运行时间环境的 lib\ext子目录中。

3.将文件 jce1_2_1.jar, local_policy.jar, sunjce_provider.jar 和US_export_policy.jar 从 Sun JCE 1.2.1 包 (下载该包的地址为 http://java.sun.com/products/jce/index-121.html) 复制到安装Java运行时间环境的 lib\ext子目录中。

4.将文件java.security(位于安装Java运行时间环境)中的下列部分由:

security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.rsajca.Provider


更改为:

security.provider.1=com.sun.crypto.provider.SunJCE
security.provider.2=au.net.aba.crypto.provider.ABAProvider
security.provider.3=sun.security.provider.Sun
security.provider.4=com.sun.rsajca.Provider


注:机器上通常会安装至少两种Java 运行时环境 (JRE)。一个位于Java SDK 的jre 子文件夹中而另外一个位于Program Files 目录的JavaSoft\JRE子目录中(例如, C:\Program Files\JavaSoft\JRE)。您需要安装JAAS 1.0、JCE 1.2.1并更改两个JRE中的文件java.security 。有关安全安装要求的详细信息请参阅这里。

5.下载并安装Sun J2EE。您可以在这里找到该软件。

6.下载并安装WASP服务器高级Java版3.0.3。您可以从http://www.systinet.com/products/wasp_advanced/download/license.html下载该软件。然后您还需要将其解压缩并运行bin 子目录中的脚本install.bat 。

7.安装WASP服务器安全,方法是运行WASP bin 子目录中的脚本install-security.bat。除了服务器主机名之外 (第一项)都输入默认取值。您需要在服务器主机名一项中指定主机名 (我建议请您使用 localhost)。有关WASP 安全安装的详细信息位于http://www.systinet.com/products/wasp_advanced/doc/htmldata/

installation_guide_body.html#security_install。

8.从http://www.systinet.com/eap/wasp_card/download/license.html下载WASP Card并将文件cloudclient.jar 和 RmiJdbc.jar 从J2EE的安装目录的lib\cloudscape 子目录复制到WASP Card安装目录的etc\lib子目录中。

9.下载演示样本文件。将其解压缩到c:,这样他们就可以驻留在c:\wasp_demo 目录中。然后将环境变量(位于演示样本源代码BIN目录下的文件env.bat中)更改为指向Java, J2EE, WASP 服务器 and WASP Card 安装目录。启动Cloudscape 数据库,方法是使用脚本startDB.bat(位于演示样本安装目录的bin子目录下)。

10.安装WASP Card,方法是运行位于WASP Card安装目录的bin子目录中的脚本install.bat。请接受脚本提供的所有默认取值。有关WASP Card 安装的详细信息请参阅 这里。

11.停止 WASP服务器,方法是使用脚本 stopserver.bat (位于演示样本安装目录的bin子目录下)。请不要使用其他方法停止服务器,否则WASP Card 安装所做的更改信息都将丢失。

12.再次使用脚本 startserver.bat 启动 WASP 服务器 。

13.运行WASP Card HTTP browser console,方法是将浏览器指向http://localhost:6060/waspcard/console 并使用左边的注册链接来注册一个用户名为test 口令为 password的用户。您还需要指定一些其他的属性,如e-mail地址、全名等。

注:根据您所使用的Cloudscape版本,当在WASP Card 控制台发送第一条命令时,您或许会得到一条错误,这是因为此时可能发生了数据库的升级。 不过随后的命令应该不会再出现类似问题。

现在我们准备开始运行演示样本。

简单的SSO情形-hands-on 示例


我们仍然试着在空头市场挣钱:我们在前面已经用过的简单的股票报价示例将演示第一个简单的SSO 方法。客户端和服务器方的报头处理器 (com.systinet.demos.simple.ClientAuthenticator和 com.systinet.demos.simple.ServerAuthenticator)实现了SSO的所有功能。
posted on 2004-10-15 14:30  信息时代的生存哲学  阅读(724)  评论(0)    收藏  举报