Q & A: WebSphere Application Server 常见安全性问题

由于处理环境的完整性利害攸关,安全性相关问题必须尽快得到解决。为此,本文对关于 IBM® WebSphere® Application Server 安全性的一些常见问题作出了简洁明了的回答。 本文来自于 IBM WebSphere Developer Technical Journal 中文版

Keys Botzum, 高级技术人员, EMC

Keys Botzum IBM Software Services for WebSphere 的一名高级技术人员。Botzum 在大型分布式系统设计方面有着十多年经验,并且专攻安全性问题。他使用过各种分布式技术,包括 Sun RPC、DCE、CORBA、AFS 和 DFS。最近,他着重研究 J2EE 及其相关技术。他拥有斯坦福大学计算机硕士学位和卡内基梅隆大学应用数学/计算机科学学士学位。

Botzum 发表过许多 WebSphere 和 WebSphere 安全性方面的文章。Keys Botzum 的其他文章和演示文稿可以在 http://www.keysbotzum.comIBM developerWorks WebSphere 上找到。他还著有 IBM WebSphere:Deployment and Advanced Configuration 一书(与 Bill Hines 合作完成)。


developerWorks 专家作者

Bill O'Donnell, WebSphere 首席安全架构师, EMC

Bill O'Donnell 是 WebSphere 产品开发组织的一名 WebSphere 首席安全架构师。他负责 WebSphere Application Server 的安全性架构。Bill 在大型机和分布式系统开发方面有超过 25 年的经验,特别专注开发架构和基础设施架构。Bill 精于端到端基础设施和应用程序安全性。他发表过多份红皮书,且是 Secrets of SOA 一书的作者。Bill 是 WebSphere Application Server 安全性网站 的发起人之一。



2010 年 6 月 28 日

重要的常见问题

与应用程序服务器安全性同样重要的一个主题区提出了一些同样值得关注的问题。为帮助您更好地了解 IBM® WebSphere® Application Server 常规安全性及其在环境中的应用方式,这里有一些最常见的问题,它们对 WebSphere Application Server V6.1 和 V7.0 都适用。

下面所列问题和答案归为三大类:

注册表

  1. WebSphere Application Server 何时联系注册表获取用户信息?
  2. WebSphere Application Server 能与 NIS 一同使用吗?
  3. 如果我想在 Windows 环境中使用非管理员帐户启用安全性,应该怎么做?
  4. 如果我想在 UNIX® 环境中使用非根服务器 ID 启用安全性,应该怎么做?
  5. Local OS 身份验证在分布式环境中可行吗?
  6. 我的用户们通过一个 userid 进行身份验证,我想从 LDAP 上使用另一个 ID 鉴定它们,这可行吗?
  7. 使用联合存储库时,有办法能确保我的文件存储库在 LDAP 服务器出现故障时仍能继续运行吗?

身份验证

  1. 在 WebSphere Application Server 应用程序中使用表单架构登录时,我为什么需要启用 SSO?
  2. 我想强制用户在定期的 “不活动超时” 之后重新登录。对于会话超时和 LTPA 超时,WebSphere Application Server 应当如何处理?
  3. 有方法能避免我的 LTPA 密钥在单元之间变得不同步吗?
  4. WebSphere Application Server 单元能跨多个 DNS 域吗?
  5. 为什么不推荐使用 SWAM?
  6. 我什么时候应该使用自定义登录模块(而非 TAI)来断定身份信息?

其他安全性问题

  1. 我如何在不引起服务器中断的前提下更改我的密码(数据库、LDAP 等)?
  2. WebSphere Application Server 专有扩展能为 J2EE™ 安全性提供什么选项?
  3. WebSphere Application Server 存储 XOR 加密的密码。我想使用更强大的密码保护。我能做些什么?
  4. 我如何调试 Java™ 2 安全性异常和 AccessControlExceptions?
  5. 关于如何使用 WebSphere Application Server 对 Microsoft Active Directory 进行最佳配置,有任何文档可供参考吗?

注册表

1. WebSphere Application Server 何时联系注册表获取用户信息?

WebSphere Application Server 查询注册表以获取用户信息和管理操作。因此,为使 WebSphere Application Server 单元能够运行,注册表必须近乎 100% 可用。

下面是 WebSphere Application Server 联系注册表的原因:

  • 当用户进行身份验证时(密码或凭证,且不需要 Web SSO 代理)。在下面几种情况下 WebSphere Application Server 可能要查询注册表:
    • 检查用户的密码时。
    • 将凭证信息映射到 userid 时。
    • 将 userid 转换为注册表 uniqueid(例如,LDAP DN)时。
    • 获取组信息时。
  • 首次将一个 LTPA 令牌传递给服务器时。 即使首次(例如,由 WebSEAL 或 IIOP 通信流)将一个 Lightweight Third Party Authentication (LTPA) 令牌传递给一个服务器,WebSphere Application Server 仍然会获取组信息,因为 LTPA 令牌仅包含用户的可分辨名称(DN)。这同样适用于 Trust Association Interceptors (TAIs) ,因为它们通常只提供 userid。如果使用 WebSphere Application Server V5.1.1,并启用主题传播以及 TAI 或登录模块项目组信息(WebSphere Application Server V5.1.1 中新的 WebSEAL TAI 就会这么做),这时 WebSphere Application Server 就不会查询该用户的用户群信息的 LDAP。
  • 如果主题传播失败。即使启用了主题传播,假如主题传播失败(例如,服务器出现故障),那么 WebSphere Application Server 会尝试重新创建主题,除非已经设定了自定义缓存键。
  • 当用户为获得管理操作而进行身份验证时(Web、JMX 等)。
  • 凡在应用程序启动时,都对照注册表来验证角色绑定。
  • 管理员在管理控制台设置绑定信息时

2. WebSphere Application Server 能与 NIS 一同使用吗?

WebSphere Application Server 不直接支持 NIS (Network Information Service) 进行身份验证。它支持 LDAP、OS 和自定义设置。在运行 UNIX 操作系统时,WebSphere Application Server 使用标准的 UNIX 密码 APIs(getpw* 等)来验证用户密码(这种情况下,WebSphere Application Server 必须作为根运行)。如果这些 APIs 调用 NIS,WebSphere Application Server 会使用 NIS 进行身份验证,不过这对 WebSphere Application Server 是透明的。然而,在 UNIX 上使用 OS 注册表时,多节点单元就不受支持。

也许可以编写一个自定义注册表来使用 NIS。

大部分情况下,这个问题的答案是否定的。

3. 如果我想在 Windows 环境中使用非管理员帐户启用安全性,应该怎么做?

在以非管理员身份运行 WebSphere Application Server 进程时,如果启用了全局安全性,用户注册表必须是 LDAP 或自定义注册表。

要使用 Local OS 用户注册表,产品进程运行所属的用户必须有 AdministrativeAct 作为操作系统权限的一部分,以调用验证或收集用户和组信息的 Windows 操作系统。该进程需要由这些权限提供的特殊授权。本例中的用户不应该与安全服务器 ID(要求使用注册表中的有效用户)相同。该用户登录到计算机(如果使用命令行启动产品进程)或服务面板中的 Log On User 设置(如果使用服务启动产品进程)。如果计算机也是域的一部分,除了将 Act 作为本地计算机中操作系统权限的一部分之外,该用户应该是域中 Domain Admin 组的一部分,可以调用域中的操作系统 APIs。

4. 如果我想在 UNIX® 环境中使用非根服务器 ID 启用安全性,应该怎么做?

在将 WebSphere Application Server 作为非根运行时,如果启用了全局安全性,用户注册表必须是 LDAP 或自定义注册表。

要使用 Local OS 用户注册表,产品进程运行所属的用户必须拥有根权限。需要使用该权限调用 UNIX 操作系统 APIs 来进行身份验证或收集用户和组信息。该进程需要由这些根权限提供的特殊授权。要使用 Local OS 用户注册表,需要将节点代理、部署管理器和应用程序服务器进程作为根运行。

5. Local OS 身份验证在分布式环境中可行吗?

在 WebSphere Application Server Network Deployment 中,如果应用程序服务器节点分布在多个虚拟服务器上,这时就不能使用 Local OS 身份验证。在这个环境中必须使用 LDAP 或自定义注册表。不过有一个例外:Windows 域注册表是一个集中式注册表,因而可在这种情形下使用。注意,虽然 NIS 从技术上讲是一个集中式注册表,但是它不适合在 WebSphere Application Server Network Deployment 中使用。

欲了解更多信息,可参阅信息中心文章:Local operating system registries

6. 我的用户们通过一个 userid 进行身份验证,我想从 LDAP 上使用另一个 ID 鉴定它们,这可行吗?

这可以通过配置 WebSphere Application Server 来实现。假定每个用户的 LDAP 条目有一个属性,该属性包含可用于第二个 userid 的字符串。例如,这个属性名为 myname。再假定用作身份验证的 userid 包含于一个名为 uid 的 LDAP 属性中。

在 WebSphere Application Server LDAP 配置(从管理控制台中,单击 Security > User Registries > LDAP > Advanced LDAP Settings)中,将 User ID 映射字段从 *:uid 改为 *:myname。这实际上告诉 WebSphere Application Server 将返回应用程序的 J2EE 主体设置为 myname LDAP 属性的值。WebSphere Application Server 通常会返回用于登录的同一个 userid。

举例来说,假定用户的 LDAP 条目含有以下属性/值对:uid=dale.sue.ping,myname=sueping

完成上述 WebSphere Application Server LDAP 配置更改后,用户会使用 dale.sue.ping 的 userid 登录,通过 WebSphere Application Server/LDAP 验证身份,成功验证之后,WebSphere Application Server 会将 J2EE 主体设置为 sueping

如果应用程序能够提取 J2EE 主体,该应用程序会将用户看作 “sueping” 而非 “dale.sue.ping”。

7. 使用联合存储库时,有办法能确保我的文件存储库在 LDAP 服务器出现故障时仍能继续运行吗?

是的,有一个配置选项能在其他注册表出现故障时继续验证过程,只要在仍然正常运行的其中一个注册表中找到 ID。能够实现该功能的联合存储库配置命令是:

$AdminTask createIdMgrRealm -name ibmRealm -allowOperationIfReposDown true

欲了解更多信息,可参阅信息中心文章:IdMgrRealmConfig command group for the AdminTask object


身份验证

8. 在 WebSphere Application Server 应用程序中使用表单架构登录时,我为什么需要启用 SSO?

通过启用 SSO,WebSphere Application Server 能在不同的 Web 请求间将用户状态保持为 LTPA cookie。如果不启用 SSO,每个请求都需要验证。如果选择使用表单架构登录,一旦表单完成验证,用户会重定向回最初请求的 URL。没有 SSO,用户的身份验证信息会丢失,且授权会失败。在使用基本身份验证时看不到这种现象,因为身份验证信息存在于每个 HTTP 请求中,WebSphere Application Server 会在需要时使用它(这确实对安全性和性能都有影响)。

9. 我想强制用户在定期的 “不活动超时” 之后重新登录。对于会话超时和 LTPA 超时,WebSphere Application Server 应当如何处理?

WebSphere Application Server LTPA 令牌根据登录会话的生存期终止,而不以不活动性为基准。因此,如果用户有一段时间不执行任何操作,Application Server 登录会话不会终止。不过,HTTPSession 确实基于不活动性终止。如果您需要基于闲置状态终止应用程序的使用,就必须在应用程序中用代码明确地表示出来。您可以在用户携带到期会话(实际上是一个新的会话)时捕捉该会话,如果认为有必要,就强制他们重新登录。 记住,这样做会破坏应用程序间的单点登录。

第二种方法仅对第一种方法做细微修改,即在发生最后一个客户请求时使用 HTTPSession.getLastAccessTime() 来计算。如果时间在很久以前,当然就可以停止访问并强制使用新的身份验证。

两种方法都不能通过使用 servlet 筛选器变得对应用程序代码透明。

应该注意到,IBM Tivoli® Access Manager 提供基于生命期和闲置状态的身份认证会话超时设置。

用户常常会问,为什么 WebSphere Application Server 这样运作。为什么它不能将闲置登录会话看作超时对待?原因在于 WebSphere Application Server 基本上是一个松耦合的分布式系统。参与一个 SSO 域的应用程序服务器不需要互相通信。它们甚至不需要位于同一个单元。因此,如果您想限制一个 LTPA 令牌(又叫 SSO 令牌)的闲置生命期,就需要通过最后使用时间对每个请求(或一分钟间隔期间看到的第一个请求)更新令牌本身。这意味着,令牌自身会频繁变化(即,浏览器会频繁接受新 cookies),且 WebSphere Application Server 需要解密并检验看到的入站令牌,以对它进行验证。这样做开销很大(如今的 WebSphere Application Server 仅在第一次在应用程序服务器上使用令牌时对其进行验证)。不可能通过智能缓存来解决这些问题,不过这不是 WebSphere Application Server 目前的运作方式。

10. 有方法能避免我的 LTPA 密钥在单元之间变得不同步吗?

是的。WebSphere Application Server V6.1 引入了一个默认启用的特性,它能自动重新生成 LTPA 密钥。虽然这是个可进行简单单元配置的不错的特性,但是任何拥有多个单元且需要 LTPA 密钥在单元之间同步的用户都应该为 LTPA 禁用这个特性。在 WebSphere Application Server V7 中,这个特性在默认情况下是不启用的, 且在 V6.1.0.23 中,对于创建的任何新配置文件,该特性在默认情况下都是不启用的。

11. WebSphere Application Server 单元能跨多个 DNS 域吗?

如果是 WebSphere Application Server V6 之前的版本,该问题的答案就是否定的。因为当您配置 WebSphere Application Server 安全性时,需要指定的其中一项是 LTPA 令牌 SSO 域。如果将其留为空白,LTPA 令牌/cookie 域被设为空白,这表示,cookie 只返回到了同一主机。如果指定一个值,cookie 域也相应地设为该值,那么 cookie 就会返回到同一 DNS 域内的所有主机。这是 HTTP 规范需要的行为。问题在于,如果您的单元(或实际上是 Web 服务器)为多个 DNS 域提供请求,因此没有办法指定多个域。与 WebSphere Application Server V6 一样,为 WebSphere Application Server 指定的 SSO 域值包含多个 DNS 域。现在,指定需要的所有域。WebSphere Application Server 创建 cookie 时,它会将 cookie 的域值(HTTP 规范只允许设置一个值)设置为来自入站请求、与其中一个已配置域匹配的值。

有效域名类似于 ibm.comtx.gov。 无效域名类似于 ibmusstate_tx.gov。有些用户遇到过这样一个 Internet Explorer (IE) 问题,即当在 SSO 域字段中定义的域小于 5 个字符时,IE 5 和 IE 6 似乎不接受 LTPA 令牌,除了类似 “cn.ca” 这样的域。 Microsoft 对此有适当的解决方案。

12. 为什么不推荐使用 SWAM?

Simple WebSphere Authentication Mechanism (SWAM) 专为简单、非分布式的单一应用程序服务器运行时环境设计。进行单一应用程序服务器限制的原因是 SWAM 不支持可迁移凭证。也就是说,如果一个应用程序服务器进程中的一个 servlet 或企业 bean 调用另一个应用程序服务器进程中的企业 bean 上的远程方法,不会将调用方身份传输到第二个服务器进程。所传输的是一个未经验证的凭证,根据 EJB 方法上配置的安全许可,这可能会导致授权失败。

在 WebSphere Application Server 基础版中,SWAM 可用作一个身份验证机制。WebSphere Application Server Network Deployment V5.0 不支持 SWAM。不过在基础版中也不推荐使用它,因为它依赖于 HTTP Session 对象来保持用户状态,这会产生问题,因为 HTTP Session 层不是安全基础设施的一部分。

13. 我什么时候应该使用自定义登录模块(而非 TAI)来断定身份信息?

注意:如果一个用户已经由 WebSphere Application Server 以外的一些身份验证系统进行了验证,就可以告知 WebSphere Application Server 用户的身份信息,而不需要重新验证。这就是所谓的身份断言。欲了解与 TAI 相关的身份断言的更多信息,请参阅 Advanced authentication in WebSphere Application Server

表 1. 登录模块 vs. TAI
特性登录模块TAI
IBM 专有否,但是不管怎样都需要 WebSphere Application Server 特定代码
易于使用较难较简单
多相身份验证
降低 Web 登录难题
可用作 Web 调用
可用作 RMI 调用
为传播登录而被(重)调用

其他安全性问题

14. 我如何在不引起服务器中断的前提下更改我的密码(数据库、LDAP 等)?

  1. 交替使用一对 userids,比如 useridAuseridB,并假定目前在使用 useridA 运行。
  2. 为 useridB 设置新密码。
  3. 每次使用 useridA 时都将其改为带新密码的 useridB。这有助于在此处保持良好的文档记录。
  4. 轮流循环集群中的每个服务器,这样就会始终有节点在运行。
  5. 为 useridA 设置新密码。如果在第 3 步中漏掉了一些设置,它会中断,但不会影响其他得到正确更改的项。
  6. 下次更改密码时,将 useridB 更改回 useridA。

由于两个用户名/密码组合在转换过程中均有效,所以不必担心同步问题。

15. WebSphere Application Server 专有扩展能为 J2EE™ 安全性提供什么选项?

  • LTPA 令牌是不标准的,它仅仅是一个凭证/令牌,且不影响应用程序开发团队。
  • 在用户登出时重定向到 ibm_security_logout URL 来删除 LTPA 令牌。
  • WSSubject、WSCredential 和 WSPrincipal 是标准 J2EE Subject、Credential 和 Principal 类的 IBM 扩展。由于标准类存在缺陷,所以在某些情况下会用到它们。
  • Trust Association Interceptors (TAI) 常用作与 SSO 代理(WebSEAL、ClearTrust、Siteminder 等)的 WebSphere Application Server 接口。这也只是身份验证层,不会影响应用程序便携性,只是如果您移动到另一个 J2EE 容器,必须要确保在 SSO 代理与 WebSphere Application Server 之间有一个类似的接口。如果您的开发人员在使用 SSO 特定于代理的 APIs,一定要留心。
  • Custom User Registry (CUR) 也只是一个集成层,它面向那些正在使用其中一种标准的 WebSphere Application Server 注册表类型(操作系统,LDAP)或以非标准方式使用它们的用户。
  • Java 2 Security Policy Files 包含对标准的一些细微扩展。它们也是基础设施,而不是应用程序代码的一部分,不过 was.policy 文件包含在 EAR 文件中。
  • WebSphere Application Server Administrative APIs 是 API 形式的 WebSphere Application Server 管理设施,可从应用程序调用它们。有些可以使用 JMX 标准,其他 APIs 是特定于 WebSphere Application Server 的。在业务应用程序中不太可能(且应该禁止)使用它们,不过也应记住这些,以防在编写管理应用程序时用到。
  • wsadmin scripting 从技术上讲也不是业务应用程序的一部分,但要记住,如果想移植到另一个产品,为 admin 函数所写的脚本必须重写。对于像部署这样的任务,最好使用像 Ant 这样的开放标准。要注意,随 WebSphere Application Server、IBM WebSphere Studio Application Developer 和 IBM Rational® Application Developer 一同出现的一些 Ant 命令是特定于 IBM 的。

要记住,还存在其他一些不属于安全性一部分的专有 APIs,比如用于命令的动态缓存 APIs、Java 对象缓存和 JMS 之外的 WebSphereMQ 调用。

16. WebSphere Application Server 存储 XOR 加密的密码。我想使用更强大的密码保护。我能做些什么?

在 WebSphere Application Server V6.0.2 之前的版本中,一般来说对此无能为力。如果您不喜欢 WebSphere Application Server 为 J2C 资源存储密码的方式,您可以编写自定义 J2C 登录模块来从 WebSphere Application Server 以外的源获取密码,但这对于 WebSphere Application Server 使用的其他密码不管用,比如 LDAP 绑定、WebSphere Application Server 管理,等等。

实际上您可以使用 WebSphere Application Server V6.0.2 配置自定义的密码编码器,从而实现您认为合适的任何保护。为此,您要实现插件接口(com.ibm.wsspi.security.crypto.CustomPasswordEncryption)然后在 security.xml 中指定两个自定义安全属性。您还可在 PropFilePasswordEncoder.bat/sh 中设置这些。这两个属性是:

  • com.ibm.wsspi.security.crypto.customPasswordEncryptionClass
  • com.ibm.wsspi.security.crypto.customPasswordEncryptionEnabled

欲了解更多信息,请参阅信息中心文章:Plug point for custom password encryption

17. 我如何调试 Java™ 2 安全性异常和 AccessControlExceptions?

有两个主要辅助工具,WebSphere SystemOut.log 文件和 com.ibm.websphere.java2secman.norethrow 属性。在 SystemOut.log 日志文件中记录的 AccessControlException 包含造成异常的许可冲突,该异常调用堆栈和授予每个堆栈帧的许可。这个信息通常就足以确定丢失的许可和需要许可的代码。

在 WebSphere Application Server 中启用 Java 2 安全性后,安全管理器组件会在发生许可冲突时抛出一个 java.security.AccessControl 异常。如果不处理这个异常,常常会导致运行时故障。这个异常也在 SystemOut.log 日志文件中有记录。

然而,当 JVM com.ibm.websphere.java2secman.norethrow 属性得到设置且值为真时,安全管理器不抛出 AccessControl 异常。该信息会被记入日志文件。

要为服务器设置 com.ibm.websphere.java2secman.norethrow 属性,转至 WebSphere Application Server 管理控制台并选择 Servers > Application Servers。在 Additional Properties 下单击 Process Definition > Java Virtual Machine > Custom Properties > New。在 Name 字段中,输入 com.ibm.websphere.java2secman.norethrow。在 Value 字段中,输入 true

18. 关于如何使用 WebSphere Application Server 对 Microsoft Active Directory 进行最佳配置,有任何文档可供参考吗?

是的,我们最近根据我们的 IBM Software Services for WebSphere 团队处理客户问题时得到的经验添加了一些帮助提示。请参考我们的 Using Microsoft Active Directory with IBM WebSphere Application Server 白皮书。


结束语

如果这里没有回答您最关注的安全性问题,请务必查看下面的 参考资料,特别是 developerWorks 上新的 WebSphere Application Server 安全性 资源页面,这里会不断聚焦有关 WebSphere Application Server 安全性最值得关注的一些资料。

参考资料

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=497591
ArticleTitle=Q & A: WebSphere Application Server 常见安全性问题
publish-date=06282010