首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

《Spring Security3》第十二章通译(Spring Security扩展)

2012-09-22 
《Spring Security3》第十二章翻译(Spring Security扩展)?第十二章Spring Security扩展Kerberos是一个相互的

《Spring Security3》第十二章翻译(Spring Security扩展)

?

第十二章Spring Security扩展

Kerberos是一个相互的认证协议,用来对认证客户端——独立的用户或网络资源——这通过使用名为KDC(key distribution center)的中心凭证存储。客户端与KDC之间的交互很复杂,在一些互联网标准中有很好的文档(主要是RFC 4120, The Kerberos Network Authentication Service (V5),可以在以下地址查阅:http://tools.ietf.org/html/rfc4120)。

在本章中为了进行讨论,我们将会简化Kerberos设施检查凭证活动的细节。Kerberos认证和Kerberos设施的主要目的是对安全实体(principal)提供安全可信的认证,而这里的安全实体可以是用户、网络资源或软件应用。Kerberos的协议本身和软件实现最初是由麻省理工学院(MIT)开发的。鉴于Kerberos有这样一个光辉的背景,有很多不错的书详细讲解Kerberos的细节。

在Kerberos认证协议之上,开发出了GenericSecurity Service Application Program Interface (GSS-API),这也是基于RFC标准(RFC 2078,Generic Security Service Application Program Interface, Version 2,http://tools.ietf.org/html/rfc2078)。GSS-API提供了标准的、跨平台、跨语言的认证和安全接口,并包装了Kerberos(以及其它的认证提供者)。它的开发目标是为安全开发人员提供一致的认证和安全编程接口而不需要了解特定安全协议的细节。

GSS-API在Java语言中的标准实现在另一个RFC标准中定义(RFC2853, Generic Security Service API Version 2: Java Bindings,http://tools.ietf.org/html/rfc2853),它在Sun JVM的org.ietf.jgss包中实现。

【在java支持Kerberos和GSS-API中,有一个很重要的事情是API的实现以及API本身是JRE的一部分,不需要引入任何第三方的库。实际上,你可以查询Sun的站点(http://java.sun.com/javase/6/docs/technotes/guides/security/jgss/tutorials/index.html)来了解这些Sun JVM功能的更多文档。注意的是,其它的JVM实现可能不会像Sun JVM那样提供相同的功能。】

将GSS-API认证集成到web浏览器中是通过使用一个名为Simpleand Protected GSS-API Negotiation Mechanism (SPNEGO)的信息交换标准做到的。SPNEGO是明确两个GSS-API实现间行为的算法,确定了它们之间是否可以通过一个通用的安全协议进行通信。就Kerberos SPNEGO而言,我们希望客户端和服务端交互的通用安全协议是Kerberos。

尽管SPNEGO可以被用来进行支持GSS-API的应用或系统通信,但是对于web应用开发人员和安全设计人员来说,这个词汇更多是意味着web客户端认证。Microsoft支持的RFC 4559 (SPNEGO-based Kerberos and NTLM HTTP Authentication in MicrosoftWindows, http://tools.ietf.org/html/rfc4559)描述了服务器通过HTTP协议使用SPNEGO请求来要求GSS-API认证。客户端浏览器就可以响应SPNEGO请求并利用原生的操作系统支持从终端用户那里收集凭证信息。Microsoft为它的Windows操作系统开发了这个规范以支持两个GSS-API的实现——其专有的NT LAN Manager (NTLM)协议和开放的Kerberos协议。最终,这种从基于Window的客户端到Kerberos服务端资源的便利单点登录方式使得其他的浏览器也适应了这种基于浏览器的SPNEGO,包括Mozilla Firefox和Apple Safari。

希望我们没有使你掉进术语汤中(译者注:即被这些术语所迷惑)!让我们现实一些了解这些在基于web认证的场景下是如何工作的。

下图展现了在SPNEGO Kerberos认证过程中,三个参与者之间的交互:


《Spring Security3》第十二章通译(Spring Security扩展)
?在进入Spring Security实现Kerberos的SPNEGO认证之前,理解客户端浏览器和应用服务器之间的两个重要HTTP交互是很重要的。

在这里我们更多关注了浏览器和应用服务器的交互,因为这是大多数Spring Security集成所关注的部分。

【尽管SPNEGO成功实现并没有要求,但是我们建议在生产环境中使用SSL,这样SSO凭证能够在web客户端认证过程中保持安全。】

另一个要考虑的重要设施是KerberosKDC实现。存在开源的选择,其中最主要的就是MIT(著名的大学)的Kerberos实现,这也是Kerberos技术的最初贡献者之一,但是,在企业环境中,开发人员最常见的实现是Microsoft Active Directory (AD)。Windows服务器的ActiveDirectory可以作为Kerberos KDC的功能,所以如果一个组织使用了AD,那也就会自动启用了基于Kerberos的认证。

在Spring Security实现Kerberos认证


?我们可以看到o.s.s.extensions.kerberos.KerberosServiceAuthenticationProvider主要负责协调校验浏览器SPNEGO响应的合法性。稍后,我们将会介绍将这些类组织在一起的Spring Bean配置细节。

准备工作

注意的是Kerberos域是大小写敏感的,所以要确保在所有环境中大小写一致。便利起见,Kerberos域通常声明为大写。

???????? 这将会在当前目录下创建名为website.keytab的文件。你需要安全的将这个文件传输到运行web应用的机器上以在Spring Security中配置Kerberos。将其放在JBCP Pets web应用的WEB-INF/classes目录下——当我们稍后配置Spring Security Kerberos bean的时候会用到。

【留意这个keytab文件——它包含了到Kerberos域信息,这些信息与预认证凭证相同。不要使用不安全的文件传输技术来复制这个文件到目标服务器,因为这会使你有被网络监听的风险。如果这个文件是缺乏安全的,恶意用户可以使用这些凭证登录你的Kerberos域,就像web应用用户那样。】

注意,ktpass包含在Windows2008 Server和以后的版本中。以前版本的Windows Server可能需要安装Kerberos支持文件才能使用这些命令行工具。

配置Kerberos相关的Springbean

?要记住的是,与我们之前看到的其它SSO实现相同,这个过滤器负责解析SSO头并基于这个头信息来尝试认证用户。SpnegoAuthenticationProcessingFilter将会基于HTTP Authorization头中的凭证填充一个o.s.s.extensions.kerberos.KerberosServiceRequestToken对象。

?KerberosServiceAuthenticationProvider需要引用o.s.s.extensions.kerberos.KerberosTicketValidator代理实现,后者用来校验从认证token所获取的Kerberos ticket。Spring Security Kerberos Extension中提供的唯一实现是使用Sun JVM'sGSS-API来校验keytab的内容并为服务实体执行对Kerberos ticket的校验。


?祝贺你——如果你看到了这个弹出提示,在你提供正确的凭证后就能访问“My Account”页面了,你已经为你的web应用成功配置了Kerberos认证。

通过以上明确指明以上的配置(并将IE重启),你应该看到登录用户的凭证会通过SPNEGO认证自动发送到站点上,用户马上就会登录成功。

添加应用服务器所在机器到Kerberos域中


?通过修改默认的(为空)设置,Firefox会自动的将你的Windows域凭证基于请求发送到站点上。这个属性对于不熟悉的用户是隐藏的,如果这进行了修改的话,配置Firefox支持SPNEGO要比IE容易得多。

问题解决

?这两种方式都会在失败的情况下在应用服务器的控制台打印出一些有用的信息。

其它问题解决步骤

????????? 这里的关键是user-search-filter,它被userPrincipalNameLDAP属性所搜索——这与SPNEGO认证过程中提供的Kerberos安全实体名字相匹配。注意,你要提供一个manager-dn,它只是有访问AD的权限而实际上并不是域的管理员。

?配置技术中唯一要说明的是给认证过的用户匹配权限。回忆一下第九章中,Spring Security LDAP期望用户权限能以一种特殊的方式在LDAP中查询出来——如果你AD的设置与LDAP内置的匹配不相容,你可能需要写自己的LdapAuthoritiesPopulator实现。如果你需要这方面的指导,请查询这个接口的实现类作为指导和起点。

?在上面我们强调的配置是krbConfLocation属性,它指向了一个Kerberos V5文件。这个文件可以像前面章节提供的krb5.ini文件那样格式化(如果你想知道这个文件的内容,请查阅相关的Kerberos V5文档页面http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.1/doc/krb5-admin/krb5.conf.html)。

<authentication-manager alias="authenticationManager"> <authentication-provider ref="kerberosAuthenticationProvider"/></authentication-manager>

?在这些配置修改完成后,你可以重启应用并使用form来登录使用Kerberos的后台应用。记住你也需要一个UserDetailsService实现来处理GrantedAuthority与用户的匹配。记住你可以将这种风格的认证用在其它的AuthenticationProvider后台认证技术上,包括basic认证。

小结

???????? 在本章中,我们学习了怎样构建Kerberos环境,如Windows Domain提供的Microsoft Active Directory,来提供对Windows操作系统用户的集成单点登录。这为用户提供了统一且用户体验良好的(登录方式),并且减轻了系统管理员的负担。在本章中,我们:

l?学习KerberosSPNEGO认证协议重要元素的整体状况;

l? 学习了启用Kerberos的web应用所需要的设施和重要步骤;

l? 配置JBCP Pets来支持Kerberos后台的SPNEGO单点登录认证;

l? 了解启用Kerberosweb应用的常见问题解决办法;

l?学习了使用AD作为LDAP后台存储用户信息所需要的配置;

l? 学习了如何配置组合使用基于form的登录以及Kerberos后台系统。

???????? 下一章也是最后一章将会涵盖从较早版本的Spring Security进行迁移。我们希望你能喜欢。

?

?

热点排行