在WebLogic 8.1最新的 SP4版本中,最引人注目的要算是在安全方面,提供了用于和Microsoft Windows客户端进行Single Sign-On的Single Pass Negotiate Identity Assertion Provider。通过该Provider可以轻松完成从前认为技术难度很高的和Windows客户端的Single Sign-On。
这个简单,低成本的SSO解决方案相信对大多数的企业应用来说更具吸引力:
- 用户只需要开机时登录Windows域,就可以以登录用户的身份访问全部的基于WebLogic Server,IIS等的应用系统;
- 在后续的访问中,用户将不需要重新输入口令,这样使得口令不会以明文形式在内网传递,来自内网的安全威胁被降低了(企业的主要网络安全威胁来自内网),如果在内网启用SSL则成本太高;
- 只需要一次验证,因此不论是AD还是其他的存储用户信息的关系数据库,LDAP等,验证的开销降低了;
- 极大改善用户体验,提高了IT服务品质,也提高了用户的工作效率
在成本方面,对比一些SSO产品,简单的说:
- 不需要添置新的硬件,不需要购买新的软件License,并且可以充分利用大多数企业中非常成熟的MS AD资源;
* 而一些SSO产品,不仅需要添加新硬件,购买License,而且成熟的部署往往涉及到Load Balance,Failover等,成本骤然升高 - 不需要专门的运营维护人员,不需要专门的技术支持人员对服务器进行管理,现有的IT团队即可胜任,成本被进一步降低;
- 安装配置简单,不需要安装独立的软件,操作人员不需要专门的知识背景;
* 对比一些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的验证过程:
- 用户使用在AD中创建的用户帐号和口令登录Windows 2000 Domain;
- 用户向一个Web Server发送请求访问一个受限的资源;
- 如果用户未认证,Web Server将返回HTTP Code 401 Unauthorized以及HTTP Header WWW-Authenticate: Negotiate要求客户端提供认证信息;
- IE根据配置的SPN(后面将介绍)获得向KDC请求的Service Ticket或者其他一些凭证;
- IE使用这些信息封装成Negotiate Token发送给Web Server
- Web Server使用事先准备好的keytab验证IE提交的认证信息,或者将Kerberos Token中的信息提交到KDC验证;
- 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 配置过程
准备工作都完成后,我们可以开始具体的配置工作了。
- 在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文件,该文件非常重要,必须妥善保管,除了指定用户外,禁止任何其他人访问。 - 在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。 - 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 - 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的快乐!
来自:http://middleware123.com/weblogic/security/511.html