体验WebLogic Server 8.1 SP4新增功能之WebLogic Single Sign-On

体验WebLogic Server 8.1 SP4新增功能之WebLogic Single Sign-On

http://dev2dev.bea.com.cn/techdoc/webser/2005042002.html
在WebLogic 8.1最新的 SP4版本中,最引人注目的要算是在安全方面,提供了用于和Microsoft Windows客户端进行Single Sign-On的Single Pass Negotiate Identity Assertion Provider。通过该Provider可以轻松完成从前认为技术难度很高的和Windows客户端的Single Sign-On。

  这个简单,低成本的SSO解决方案相信对大多数的企业应用来说更具吸引力:

  1. 用户只需要开机时登录Windows域,就可以以登录用户的身份访问全部的基于WebLogic Server,IIS等的应用系统;
  2. 在后续的访问中,用户将不需要重新输入口令,这样使得口令不会以明文形式在内网传递,来自内网的安全威胁被降低了(企业的主要网络安全威胁来自内网),如果在内网启用SSL则成本太高;
  3. 只需要一次验证,因此不论是AD还是其他的存储用户信息的关系数据库,LDAP等,验证的开销降低了;
  4. 极大改善用户体验,提高了IT服务品质,也提高了用户的工作效率

  在成本方面,对比一些SSO产品,简单的说:

  1. 不需要添置新的硬件,不需要购买新的软件License,并且可以充分利用大多数企业中非常成熟的MS AD资源;

    * 而一些SSO产品,不仅需要添加新硬件,购买License,而且成熟的部署往往涉及到Load Balance,Failover等,成本骤然升高
  2. 不需要专门的运营维护人员,不需要专门的技术支持人员对服务器进行管理,现有的IT团队即可胜任,成本被进一步降低;
  3. 安装配置简单,不需要安装独立的软件,操作人员不需要专门的知识背景;
    * 对比一些SSO产品超厚的文档手册,以及一次又一次的培训等

  因此这使得大多数的SSO产品厂商面临了更大的挑战。在应用安全技术突飞猛进,SSO市场竞争激烈的今天,用户将有越来越多的自由去选择适合自己的SSO解决方案,用户将最终获益。所以我们要感谢那些为今天这些技术的发展做出贡献的人们。

  在我拿到WebLogic 8.1 SP4后,完成了WebLogic Web Server和Windows 的Single Sign-On的配置,最终效果比较理想,整个配置过程也比较简单。但是其间也遇到了一些问题,加上Bea在网站上提供配置文档(http://e-docs.bea.com/wls/docs81/secmanage/sso.html)很多地方说得并不清楚,甚至还有一些错误,所以希望通过本文更好的帮助大家完成SSO的配置。

1 准备
  
WebLogic Single Sign-On的主角是SPNEGO(Simple and Protected GSS-API Negotiation Mechanism)。所谓的Negotiate就是双方通过一定的协商,确定最终使用的认证协议。因此通过SPNEGO,双方可以使用Kerberos,也可以使用NTLM等安全协议来完成双方的认证。所谓的GSS(http://www.ietf.org/rfc/rfc1508.txt )就是Generic Security Service API,SPNEGO可以说是其表现形式,主要目的是提供通用的安全服务,保证应用在不同环境中的可移植性。

  由于SPNEGO和Kerberos的紧密关系,因此我们更多情况下是看到SPNEGO/Kerberos这样的组合。

  WebLogic的SPNEGO Identity Assertor仅支持Kerberos Token。通过下图我们可以明白,SPNEGO Token和Kerberos Token关系,以及SPNEGO Token对底层认证数据的封装:

(from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/http-sso-2.asp )
IE将Kerberos Token(Service Ticket以及一些认证必须的信息),使用SPNEGO Token封装,然后发送给WebLogic Web Server。Web Server通过SPNEGO Token中定义的协议类型确定使用的是Kerberos,然后从SPNEGO Token中解析中Kerberos Token进而完成后续的验证。

  SPNEGO Token使用二进制的ASN.1编码(LDAP协议中的LDAP Message即使用ASN.1编码),编码后的二进制数据通过Base64编码为可见字符后传送。具体可以参考http://www.faqs.org/rfcs/rfc2478.html。

  下面我们简单了解一下SPNEGO/Kerberos的验证过程:

  1. 用户使用在AD中创建的用户帐号和口令登录Windows 2000 Domain;
  2. 用户向一个Web Server发送请求访问一个受限的资源;
  3. 如果用户未认证,Web Server将返回HTTP Code 401 Unauthorized以及HTTP Header WWW-Authenticate: Negotiate要求客户端提供认证信息;
  4. IE根据配置的SPN(后面将介绍)获得向KDC请求的Service Ticket或者其他一些凭证;
  5. IE使用这些信息封装成Negotiate Token发送给Web Server
  6. Web Server使用事先准备好的keytab验证IE提交的认证信息,或者将Kerberos Token中的信息提交到KDC验证;
  7. WebLogic Web Server验证成功后装配相应的Subject,然后为此用户起一个Session,用户登录成功

  实际的验证过程是比较复杂的,读者可以参考:http://www.microsoft.com/technet/prodtechnol/windows2000serv/maintain/security/kerberos.mspx

2 环境
  
接下来,我们将以一个具体的环境为例进行说明。我们假设有下面的部署逻辑:

服务器端:
 * Windows 2000 Advance Server (Active Directory)
 * 域:SSO.COM
 * 机器域名:AD-SERVER.SSO.COM
 * RedHat Linux 7.2
 * 主机名:wls

 * WebLogic Server 8.1 SP4 (一定要是SP4)

客户端机:
 * Windows 2000 Professional
 * IE 6.0

注意:
 * 浏览器IE6.0和5.0以及5.5等在配置上会有不同
 * 检查Windows 2000 Advance Server是否已经安装了Setspn.exe,否则从该链接中获取并安装。
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/setspn-o.asp
 * 保证Windows 2000 Advance Server中存在Ktpass.exe,你可以在C:Program FilesSupport Tools下找到它,否则需要从Windows2000 AD Server安装盘中获取。
 * Kerberos实现对大小写敏感,因此配置中我们一律使用大写的域名
 * 默认情况下Windows2000 Ad Server跟运行weblogic 的RedHat Linux两个主机间的时间相差不能超过5分钟(Kerberos协议对时间是敏感的),否则验证会失败。根据实际情况我们可以缩短这个时间,获得更好的安全性。

3 配置过程
 准备工作都完成后,我们可以开始具体的配置工作了。

  1. 在Windows 2000 Advance Server上的配置
    (注意:以下的操作使用Administrator或者同等权限的用户操作)

    在Windows2000 Advance Server配置了Active Directory,同时将其作为DNS服务器。Windows2000 Ad Server将在每个Domain Controler上面启用KDC(Key Distribution Center),KDC包括两部分,分别是Authentication Service以及Ticket Granting Service。具体我们就不多说了,总之大家明白一旦配置好 Windows Domain Controller(通过AD建了一个Domain)这些就已经存在了并能正常工作,在Windows上除非有特殊要求,否则我们不需要多于的配置,或者启用KDC之类的操作。

    * 在DNS中为WebLogic Server所在主机配置DNS记录。

    DNS Name:wls.SSO.COM

    *在AD(域SSO.COM)中为WebLogic Server创建用户帐号

    帐号:wls
    注意,在创建用户帐号时,不能选择用户第一次登录时需要修改口令的选项。而且需要使用默认的DES加密类型,这个不要修改,其他类型不被WebLogic支持。

    以及测试用户帐号:TESTUSER

    *使用Setspn.exe为用户wls创建一个Service Principal Name

    该SPN将作为用户(wls)属性存放,IE将根据它来判断访问的是哪一个Service,进而从KDC请求该Service的Ticket。其中HTTP是服务类型,HOST可以代表全部类型,我们这里指定为HTTP。

    并且如果一个主机上,开了多个同样的服务,那么可以通过设置port来区分,具体参考http://www.microsoft.com/resources/documentation/WindowsServ/2003/all/techref/en-us/Default.asp?url=/Resources/Documentation/windowsserv/2003/all/techref/en-us/W2K3TR_adspn_how.asp 由于我这里只有一个WebLogic Server,所以没有指定。

    下面是配置示例:
    C:Program FilesResource Kit>setspn -A HTTP/wls.SSO.COM wls
    Registering ServicePrincipalNames for CN=wls,CN=Users,DC=SSO,DC=com
     HTTP/wls.SSO.COM
    Updated object

    完成后可以通过命令检查:
    C:Program FilesResource Kit>setspn -L wls
    Registered ServicePrincipalNames for CN=wls,CN=Users,DC=SSO,DC=com:
     HTTP/wls
     HTTP/wls.SSO.COM

    C:Program FilesResource Kit>

    *创建Kerberos Service Principal,并映射到wls用户
    C:Program FilesResource Kit>ktpass -princ http/wls .COM -pass *** -mapus
    er wls -out c: empwls.HTTP.keytab
    Successfully mapped http/wls to wls.
    Key created.
    Output keytab to c: empwls.HTTP.keytab

    Keytab version: 0x502
    keysize 43 http/wls.COM ptype 1 (KRB5_NT_PRINCIPAL) vno 1 etype 0x1 (DES-CBC-CRC) keylength 8 (0xa7c7e6ab9767fb37)
    Account has been set for DES-only encryption.

    WebLogic Web Server就是Kerberos Service,这里通过-princ指定了生成的Service Principal(kerberos 5格式:name/instance),它将代表一个WebLogic Web Server实体。这里是http/wls.COM(域名大写),它非常重要,Sun Krb5LoginModule(JDK1.4中提供)将通过它以及keytab对客户端提交的请求进行验证。它将配置在JAAS LoginModule Config Entry中。-pass参数指定了用户wls的口令,如果你前面选择了用户第一次登录必须修改口令,这里就惨了。

    Account has been set for DES-only encryption.这个信息也比较重要,如果没有DES-only,你的WebLogic认证可能会失败。

    上面的命令成功后将在磁盘上生成一个wls.HTTP.keytab文件,该文件非常重要,必须妥善保管,除了指定用户外,禁止任何其他人访问。
  2. 在RedHat上的配置
    *将文件wls.HTTP.keytab拷贝到Linux指定目录下
    如果是在真实环境中,这个拷贝过程必须非常安全。我建议使用启动WebLogic的Linux用户身份通过sftp将文件拷贝到启动WebLogic的目录下,方便我们后面的配置。

    拷贝完成后,立即删除Windows机器上的原文件。同时修改该文件属性为只有属主用户可读(属主用户为启动WebLogic的Linux用户)。可以使用如下命令修改文件访问属性:

    600 wls.HTTP.keytab
    502br>
    注意:如果你拥有多个keytab,那么使用ktutil合并这些keytab到一个 keytab文件中。默认安装的RedHat中似乎没有安装krb5-workstation这个RPM包(工具ktutil包含该RPM内),如果这样,需要下载RPM包进行安装,安装完成后/usr/kerberos/目录下会有我们需要的工具,大家可以通过该链接下载:http://rpmfind.net/linux/RPM/redhat/6.2/i386/krb5-workstation-1.1.1-9.i386.html
    具体合并过程和文档请参考相关文档,比如:http://e-docs.bea.com/wls/docs81/secmanage/sso.html#1101370

    * 配置JAAS Login Configruation Entry

    JAAS Login Configuration Entry被JAAS使用。WebLogic Negotiate Identity Assertor解析完成Negotiate Token后将通过Krb5LoginModule完成最终的用户验证。

    此验证过程通过我们前面生成的keytab参与来完成,不需要访问KDC机器。这降低了KDC认证方面的开销。

    com.sun.security.jgss.initiate {  com.sun.security.auth.module.Krb5LoginModule required  principal="HTTP/wls.COM" useKeyTab=true keyTab="wls.HTTP.keytab" storeKey=true;
    };
    com.sun.security.jgss.accept {  com.sun.security.auth.module.Krb5LoginModule required  principal="HTTP/wls.COM" useKeyTab=true keyTab="wls.HTTP.keytab" storeKey=true;
    };

    参数中的Principal为前面我们通过ktpass创建的Service Principal,这里是“HTTP/wls.COM”。keytab指向我们通过ktpass生成的keytab文件。

    将上面的内容保存为krb5Login.conf。
  3. WebLogic的配置
    * 为WebLogic 配置Single Pass Negotiate Identity Assertion Provider

    这个配置比较简单,请参考http://e-docs.bea.com/wls/docs81/secmanage/providers.html#1199872 ,这里就不多说了。 注意Supported Types中两个Token Type需要全都选择。

    * 创建一个Web应用

    创建一个sso.war,其中在web.xml中指定将全部的页面作为受限资源控制,用户必须经过身份验证才能够访问web应用页面。
    <security-constraint>
     <display-name>Security Constraint on Conversation</display-name>
     <web-resource-collection>
       <web-resource-name>Conversation web service</web-resource-name>
       <url-pattern>/*</url-pattern>
       <http-method>GET</http-method>
       <http-method>POST</http-method>
     </web-resource-collection>
     <auth-constraint>
     <role-name>*</role-name>
     </auth-constraint>
    </security-constraint>
    <login-config>
     <auth-method>CLIENT-CERT</auth-method>
    </login-config>

    Auth-method指定验证方式为CLIENT-CERT,这是必须的。Role-name为*表示只要用户拥有至少一个J2EE Security Role即可访问这些资源。用户成功登录后,其登录名就是一个Principal,WebLogic将默认将其映射为一个Security Role。因此只要用户成功登录,即可访问/*资源。所以如果用户没有登录,WLS将要求用户登录。

    在war包中的jsp文件内,比如index.jsp通过如下代码获取当前用户信息:

    <%=request.getRemoteUser()%>

    如果返回不为null,表明用户已经成功登录,其返回值就是登录用户的UID。使用WebLogic Console部署该应用,确保应用部署成功。

    * 在WebLogic控制台上增加一个用户帐号

    该帐号同1步在AD中创建的帐号必须完全一致,这里叫TESTUSER;或者你配置一个Active Directory Authentication Provider指向AD也可,但我没有实际操作,大家有兴趣的可以试一下。

    * 修改启动WebLogic脚本增加如下的系统变量
    -Dsun.security.krb5.debug=true
    -Djava.security.krb5.realm=SSO.COM
    -Djava.security.krb5.kdc= AD-SERVER.SSO.COM
    -Djava.security.auth.login.config=krb5Login.conf -Djavax.security.auth.useSubjectCredsOnly=false-Dweblogic.security.enableNegotiate=true"

    Krb5Login.conf为我们 前面编辑的configuration entry。AD-SERVER.SSO.COM指向我们的AD Server。可以在/etc/hosts文件中增加该名字到IP的映射会比较简单一些。sun.security.krb5.debug将使Krb5LoginModule输出调试信息。这里还要提醒大家realm等参数(SSO.COM)都需要大写。

    * 重新启动WebLogic
  4. IE浏览器的配置

    IE浏览器也需要适当配置,我们这里以IE6.0为例说明。主要两个地方需要配置:

    1. 工具 – Internet选项 -点击“本地Interanet”-点击“站点”-高级
    将*.SSO.COM加入,这样我们访问 wls.sso.com时,IE会将wls.sso.com作为本地网站来访问。

    2. 工具 -Internet选项 -高级 -安全
    “启用集成Windows身份验证”前面打勾。6.0版本前的IE会默认选择该选项,IE6默认没有选择。

    具体请参考连接http://msdn.microsoft.com/library/en-us/dnsecure/html/http-sso-1.asp 中关于IE的配置。

    完成后重新启动 Windows。

4 验证
  
找一个Windows 2000 Professional机器(切记不要是那台AD Server, AD上的IE只会向Web Server发出NTLM Token而非Kerberos Token, NTLM Token不被WLS支持),按照上面的IE配置方法完成配置后,将其加入到SSO.COM域。

  使用用户TESTUSER登录域,打开IE,访问http://wls.sso.com:7001/sso/index.jsp

  页面上将显示出用户的登录帐号,如果失败将会弹出用户登录对话框。失败了也不要紧,看一下WebLogic的输出,我们已经打开了debug开关,从其中的错误信息我们可以发现是什么原因。具体请参考JAVA GSS-API的Troubleshooting,链接如下:http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html

5 总结
  通过上面的介绍,相信大家已经可以成功配置自己的SSO了(可以看出整个过程还是比较简单的,对比一些SSO产品的超复杂配置过程)。由于时间原因,本文写的比较仓促,难免有疏漏的地方。如果哪些地方描述有错误,请给我指出;或者根据上面的配置没有成功的,也请告知我。希望与大家交流,共同分享成功配置SSO的快乐!
附源代码:下载源代码

6 参考资料
1. http://e-docs.bea.com/wls/docs81/secmanage/sso.html Bea关于WebLogic SPNEGO Identity Assertion Provider的配置指导
2. http://e-docs.bea.com/wls/docs81/secmanage/providers.html#1199872 Bea关于Identity Assertion Provider的配置文档
3. http://www.ietf.org/rfc/rfc1508.txt GSS的RFC文档
4. http://www.ietf.org/rfc/rfc2478.txt SPNEGO的RFC文档
5. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsecure/html/http-sso-2.asp 微软的MSDN上有大量关于SPNEGO/Kerberos的资料
6. http://www.microsoft.com/technet/prodtechnol/windows2000serv/maintain/security/kerberos.mspx 微软提供的关于Kerberos的资料
7. http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/setspn-o.asp 微软关于Setspn.exe工具的使用说明
8. http://web.mit.edu/kerberos/www/ Kerberos安全协议的网站

7 关于作者
作者马晓强,高级软件工程师,现在广东从事J2EE,LDAP相关的设计开发工作。对WebLogic,LDAP以及Single Sign-On等产品、技术很感兴趣。您可以通过 E-mail: iammxq.com.cn 与他联系。

你可能感兴趣的:(体验WebLogic Server 8.1 SP4新增功能之WebLogic Single Sign-On)