IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Open source | Java technology | WebSphere  >

Geronimo 叛逆者: 安全和 Apache Geronimo 的未来

对 David Jencks 的一次采访

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论


级别: 中级

Nicholas Chase, 自由作家, Studio B

2007 年 3 月 30 日

对于 Apache Geronimo 这样提供全面服务的应用服务器来说,需要具有全面服务的安全实现,就是说仅仅支持 SSL 连接还不够。安全实现是指保证应用程序中发出的内部请求的安全。在本部分,David Jencks 将与 Geronimo 叛逆者专栏的主笔讨论关于 Geronimo 的安全实现的当前和未来的看法。

开放源码软件的重要特点之一当然是人人都可参与其中,因此资源集所受的限制并非来自年度的聘用预算,而是项目的有趣程度。这意味着您可以拥有任意数量的开发人员,但是还意味着一个人可能参与几个领域,如果他(她)觉得这些领域有趣的话。

以 David Jencks 为例。我开始只与他探讨 Apache Geronimo 的安全性问题,但很快意识到,他比我想像的要忙碌得多。“我现在的工作是,借助容器管理的持久性来完成 JPA 支持”,感恩节前夕我坐下来跟他谈话时他这样告诉我。“我们成功地让 Daytrader 示例应用程序在 Geronimo 中使用 OpenJPA 运行。我对此非常兴奋;JPA 看起来将会是一个比实体 bean 或者甚至是 JDO1 都好得多的持久性解决方案(我尚未有机会使用 JDO2)。我也正致力于集成 [Apache] CXF 以便支持 JEE5 JAX-WS,并希望尽快实现对 Axis2 的集成。我还在尝试找出,如何重构部署系统,使其更简单更具可扩展性。我还希望抽出时间来实际论证可插入式 JACC。如果还能有空闲时间,我希望回去进行去年开始的 Jetspeed 2 集成。”

现在看来那确实是 一份满满当当的工作表!

把事情做得更好

他的工作确实很忙碌,但是如果您了解 David Jencks 最初如何成为 Apache Geronimo 项目的一员,您可能就不会那么吃惊了。当时他是 Geronimo 原始代码优化小组的一员,因为他觉得实现优化应该有更好的方法。“我已从事 JBoss 的研究多年,最后对项目管理和代码质量大失所望。我把 Geronimo 看作重新开始编写更好的服务器的机会。”

把事情做得更好,是他的座右铭。“Geronimo 中的大部分代码,是由编写过代码类似的早期版本的人员所编写,因而他们更了解如何把它做得更好。另外,与研究 JBoss 时相比,我们对 Geronimo 更注重改进现有的代码。当然,我不了解开始研究 Geronimo 之后 JBoss 的情况,因此这可能没有反映 JBoss 的现状”,他补充道。





回页首


Apache Geronimo 安全性

但是 David 从事的大部分工作都多多少少地涉及到了安全性,因此,我认为很适合与他讨论萦绕在我心头好久的那些问题。源代码是开放的,并且如果人们希望的话,他们完全可以了解您的一举一动,那么如何才能创建真正安全的应用程序?

“我认为所有安全专家都会同意,通过隐藏得到的安全性其实并不安全,惟一的安全解决方案是通过非常广泛的观察、测试、试图攻击等公开的方法实现的。(我并不是安全专家,但这似乎是一个共识。)我并不认为我们在破坏安全性方面作出了大量尝试。我只是要说,通常情况下对安全系统的运作方式保密并不会提高安全,事实恰恰相反。”

那么应该怎样做才能保证一个应用程序(如 Geronimo)的安全性?

“对于 J2EE/JEE 容器,首要考虑事项是支持规范”,他告诉我说,“EE 的安全性分为两部分:其中一部分已在规范中得到明确指定,而另外一部分就要由容器/JACC 提供程序的实现者去解决了。”

JACC 指定了应用服务器和安全提供程序如何相互交流以决定是否实现某个特定请求。这和提交给浏览者的请求关系不大,而和内部提出的请求有关。这个内部应用程序是否应该拥有访问用户的银行收支表的权限?那个应用程序能不能更新工作安排表?要根据安全角色来作出此类决定。





回页首


安全角色

“规范全面地指定了角色 与 EE 产品相关权限间的映射关系”,David 解释道,“此时的角色基本上是一个任意名称或字符串。但规范并未指定如何判断用户是否处于 特定角色。这本质上是 JACC 提供程序的功能。”

“角色的例子可能有管理员、用户、人力资源部用户等等”,他继续说道,“它们只是某类动作的名称,并且只对应用程序和环境有意义。”

我想知道安全性是由服务器还是应用程序来处理,还是由两者共同处理。“其实,EE 声明式安全性的内在涵义是,服务器处理权限,而无需应用程序明确地进行检查。因而您可以为 Web 应用程序指定:一个角色可访问 /secure/admin 域中的页面,而另一个角色可访问 /notsosecure/workingstuff 中的页面。您的 Web 应用程序不需要任何代码来检查谁能做什么,容器将替您处理这一切。”

“首先研究请求的开始阶段,请求将附带一些安全信息,这些信息的形式是包含若干 JAAS 登录模块的登录配置所创建的主题。此主题基本上可以包含任何类型的信息,而这些信息的形式是主体和/或凭证。JACC 提供程序的工作就是,获取主题中的信息,可能将其与请求的信息合并,并决定该请求是否有权限进行相关操作。”

尽管如此,还是出现了一些并发症,这是因为:JACC 规范对于如何将用户映射到角色这一点规定得不多。“每个 JACC 实现对于如何将用户映射到角色都有具体的想法。但是‘如何做’,规范中并未指定,所以有很多种可能。”





回页首


Apache Geronimo 的实现

“在 Geronimo 中,我们要求在安全域中设置登录模块:这可能导致要使用包含各种主体的主题来表示用户。我们假定这些主体基本上是名称-类(name-class)对,并让您任意设置主体和角色之间的映射。那么,作为一个简单的例子,您的登录模块可能将类为MyRolePrincipal、名称为admin和/或user的主体添加到该主题,这取决于您的身份。如果应用程序后来声明角色为 SUPERUSER 和 PEON,则可以将 admin 映射到 SUPERUSER,并把 user 映射到 PEON”,他笑着说道。

“基本来讲,我们有相当直观的 JACC 提供程序,允许您将任意(简单的)主体映射到任意角色,但它不在请求中使用任何信息。这非常适合以下情形:拥有以某种方式指定了一些角色的现有安全系统,并且有一个从安全系统的角色观念到 J2EE 的角色观念的直观映射。但是也存在许多其他可能。”





回页首


未来计划

我问他 Geronimo 还能做什么。

“我认为有三个主要方面需要发展,”他告诉我说,“与其他安全系统集成、利用更多的 JACC 特性以及改进现有功能。”

与其他安全系统集成

我们首先谈到与其他安全系统的集成。“我们的 JACC 提供程序实现非常灵活,就像我们自己实现的一样”,David 解释说,“但是它可能太通用了,因而不能方便地进行管理。另一方面,有几种安全系统能够提供出色、强大的管理,从用户注册一直到管理权限,而且可以通过修改成为 JACC 提供程序。两个此类系统分别是 TripleSec 项目(即将成为 Apache Directory 的一部分)和 Jetspeed 2 安全管理系统。这二者都提供灵活的用户和权限管理,我认为可以轻松地将其修改成为 JACC 提供程序。它们与我们的系统的区别在于,它们明确地包含了用户管理的所有方面,包括 LoginModule;而当前 Geronimo 系统的基本思想则是与现有已提供适当登录模块的用户管理相接合。

“虽然这些可能的集成未必提供与现有身份验证系统集成的灵活性(尽管 TripleSec 可能与现有的企业 LDAP 系统集成),但是它们将提供功能强大的多合一安全解决方案,使您能够从一个位置管理与身份验证和授权相关的所有事情。我们还打算将一些现有的 JACC 实现与 Geronimo 一起示范使用,比如 IBM® Tivoli® software 提供的 JACC 实现。这些系统提供了但当前的 Geronimo 实现并没有提供(并且规范并没有清楚地说明)的另一项功能是动态地更改用户权限和在系统运行时对其进行一般的管理。”

利用更多的 JACC 特性

还存在其他一些领域,Geronimo 的 JACC 实现能够引起一些关注。“J2EE 安全的传统限制之一是,它还没有任何表达约束的方式,比如“普通用户只能调用 $50,超级用户可调用 $2000,而老板可以随意调用。”我的理解是,当出现这类约束时,开发人员通常会放弃 J2EE 安全而开始自己编写代码。已经有人做了一些处理这类约束的尝试。JBoss 曾经有一个概念是 EJB 的 SecurityProxy,您可以在其中提供 EJB 业务接口的实现,该实现可以在代码中执行这些安全检查。我对 JBoss 的第一个贡献是规则引擎集成,用于评估 EJB 方法调用的规则,具体而言,您可以非常轻松地表达约束,比如关于 EJB 方法参数和返回值的约束。JACC 提供对请求参数的统一访问,因而 JACC 提供程序可在权限决定过程中使用参数(而不是结果)。我认为如果发现一种 JACC 实现能提供易于使用的语言来表达这类约束,将很有吸引力。一种可能是 XACML(eXtensible Access Control Markup Language),它似乎提供了这类实现以及更多内容。”

经验教训

David Jencks 的头脑中似乎有更好 的想法。当然,他一直在想办法改进 Geronimo。“通过与一些 CORBA 和 XACML 专家的交谈,我们学到了很多实现 CORBA CSIV2 的知识,这也导致了要重新评估一些非 CORBA 身份验证模型。关于身份验证,最简单的情形是,拥有一台不具备智能的客户机,比如 Web 浏览器,它要做的所有工作就是将用户[和]密码发送到实际的服务器;这跟在本地运行程序的情形基本相同。这种情况下,服务器只查看其是否认识用户[和]密码,并且这样就行了。但是,一旦处于更为复杂的情形,其中的客户机具有一定的智能或是另一台服务器时,就需要一种更高级的方法。

“我们最初的方法是尝试提供一种方式,在客户机上运行一些登录模块,而服务器上也运行一些登录模块,然后在服务器上对结果进行合并。例如,您可能需要在客户机上运行 Kerberos 登录模块,就是说,Kerberos 系统实际上对用户进行身份验证。我们当前的实现很笨拙并且不易理解。我们认为,我们可以提供更简洁、功能更强大的解决方案,这种方案类似于基于安全断言思想的 CSIV2 模型。概括地讲,该思想就是用户登录到客户机,然后客户机向服务器做出各种安全断言。基本上,这些事情可简化为:客户机说“Joe 登录了,因为我有安全证书,所以您应该信任我。”我们认为,可以使身份验证系统更简单、更易于理解并且功能更加强大。”

有人提出下面这个明显问题:为什么这一点还没有实现?

“我们的想法很多,但缺少人手”,David 说道,他的热情表露无遗,“我认为基于安全断言的身份验证和 XACML 或是其他基于规则的授权系统很有吸引力,我很乐意花时间去研究,但在过去的一年中,我只抽出了几天时间来研究使得 JACC 可插入的安全问题。Alan Cabrera,就是为我们编写了几乎所有安全解决方案的初始版本的人,也一直因其他项目而无法脱身。我们的 XACML 专家 Simon Godik 指出了我们可以实现的其他几项改进,并不是完全重新编写,但是没人有时间将其付诸实施。今年我希望能利用一些其他团体,比如带有 TripleSec 的 Apache Directory,来引入一些令人激动的特性,而无需自己完成所有的工作。一个很好的迹象是,我们的一名新委员会成员,Vamsavardhana Reddy,在改进一些安全特性的管理方面取得了很大的进步,比如 keystore。如果我们能吸引更多新的开发人员来处理这些问题,就更好了!”





回页首


结束语

Geronimo 或许是从头开始编写的,但它确实有关于安全性的成熟见解。 除了 J2EE 规范中的安全需求外,David Jencks 和 Geronimo 小组的其他成员正努力寻找一些能够对企业应用服务器的工作方式带来革命性影响的新思想。



参考资料

学习

获得产品和技术

讨论


关于作者

Nicholas Chase 在 Lucent Technologies、Sun Microsystems、Oracle和 Tampa Bay Buccaneers 等公司从事过 Web 站点的开发。他曾做过高中的物理老师、低放射性废弃物处理设备经理、在线科幻杂志编辑、多媒体工程师、Oracle 讲师以及一家交互式通信公司的技术主管。他是好几本书的作者,包括 XML Primer Plus(Sams)。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.







回页首


IBM、IBM 徽标、Tivoli 和 WebSphere 都是 IBM 在美国和/或其他国家的注册商标。 Java 是 Sun Microsystems 在美国和/或其他国家的商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款