Web Service 的安全性注意事项

配置 Web Service 安全性时,应尽一切努力以确认结果不容易受到各种攻击机制的攻击。 有些安全性问题可能会在您保护 Web Service 时出现。

在 WebSphere® Application Server中,当您在 SOAP 消息中启用完整性,机密性和关联令牌时,不保证安全性。 此安全性问题列表不完整。 您必须为环境实现自己的安全性分析。

  • 确保消息新鲜性
    消息新鲜性涉及保护资源不受捕获和重新发送消息的重放攻击。 数字签名本身无法防止重放攻击,这是因为可以捕获和重新发送已签署的消息。 当通过开放式网络交换消息时,建议您允许消息接收方检测消息重放攻击。 您可以将 Web Services 安全规范中描述的下列元素用于此目的:
    时间戳记
    可以使用时间戳记元素来跟踪消息并检测先前消息的重放。 WS-Security 2004 规范建议您高速缓存时间戳记一段给定时间。 作为准则,您可以将五分钟用作最小的时间段以检测重放。 拒绝包含到期时间戳记的消息。
    现时标志
    A nonce is a child element of the <UsernameToken> element in the UsernameToken profile. 因为每个现时标志元素都具有唯一的值,所以接收方可以较容易地检测到重放攻击。
    避免麻烦: 为了从使用 "时间戳记" 需求的重放攻击中获得最大的安全性,必须对 "时间戳记" 和 "现时标志" 元素进行签名。 否则,可以方便地更改这些元素,导致无法防止重放攻击。

    有关 Timestamp 的更多信息,请参阅“时间戳记”

    WebSphere Application Server 强制实施 IncludeTimestamp 策略断言。 但是,许多服务提供者需要请求中的 <wsu:Timestamp> 元素,但不会在响应中发送。 响应中也可能根本没有 Security 头,更不用说时间戳记了。 当策略中具有 IncludeTimestamp,但是响应中未返回时间戳记时,在客户机上将发生以下错误:
    CWWSS5730E: A required timestamp is not found.
    要解决此问题,请配置服务提供程序以发送时间戳记或配置客户机以使其不需要时间戳记(通过在 WS-Security 策略绑定中将 com.ibm.wsspi.wssecurity.consumer.timestampRequired 定制属性设置为 false)。
  • 正确使用 XML 数字签名和 XML 加密以避免潜在的安全性漏洞

    Web Service 安全性 2004 规范定义如何在 SOAP 头中使用 XML 数字签名和 XML 加密。 因此,用户必须了解其他安全性机制的上下文中的 XML 数字签名和 XML 加密以及对实体可能的威胁。 对于 XML 数字签名,您必须了解所有由使用一般的数字签名和特别的 XML 数字签名而产生的安全含义。 当您将信任构建到基于数字签名的应用程序中时,必须结合其他技术,如基于公共密钥基础结构 (PKI) 的证书信任验证。 对于 XML 加密,在公共数据项上的数字签名和加密的组合可能引入某些密码脆弱性。 例如,当您加密数字签名的数据时,可以将数字签名保留在明文中,而使消息易受明文猜测攻击。 作为通用实践,当加密数据时,会加密数据上的任何摘要或签名。 有关更多信息,请参阅 http://www.w3.org/TR/xmlenc-core/#sec-Sign-with-Encrypt

  • 保护安全性令牌的完整性

    存在令牌替换攻击的可能性。 在此情况下,使用通常从安全性令牌派生的密钥来验证数字签名,而且此数字签名包括在消息中。 如果替换令牌,那么收件人可以接受基于替换的密钥的消息(这不是您期望的)。 此问题的一个可能的解决方案是与已签署的数据一起签署安全性令牌(或唯一标识派生签名密钥的数据)。 在某些情况下,签署由可信权限发出的令牌。 在此情况下,不可以存在完整性问题。 但是,由于应用程序语义和环境可以超时更改,所以最佳 实践就是防止此攻击。 您必须评估基于已部署环境的风险评估。

  • 验证证书以协调证书路径验证和证书撤销列表

    建议您验证是否完全信任用于数字签名的令牌标识的真实性或有效性。 尤其是对于 X.509 令牌,此问题会涉及验证证书路径和使用证书撤销列表 (CRL)。 In the Web Services Security implementation in WebSphere Application Server Version 6 and later, the certificate is verified by the <TokenConsumer> element. WebSphere Application Server 提供了 X.509 证书的缺省实现,该证书使用 Java™ CertPath 库来验证证书。 在实现中,不存在明确的 CRL 概念。 而仅在文件中准备正确的根证书和中间证书。 对于复杂的解决方案,您可以开发自己的 TokenConsumer 实现,此实现使用在线 CRL 数据库或在线证书状态协议 (OCSP) 来执行证书和 CRL 验证。

  • 保护具有密码的用户名令牌

    建议不要在没有保护的情况下将用户名令牌中的密码发送到下游服务器。 可以使用诸如 SSL(例如 HTTPS)之类的传输级安全性或者使用 Web Service 安全性中的 XML 加密来保护密码。 首选的保护方法取决于环境。 但是,在某些特殊环境(您确定不易受到攻击的环境)中可能将密码作为明文发送到下游服务器。

保护 Web Service 不仅涉及启用 XML 数字签名和 XML 加密。 为了正确保护 Web Service,必须具有有关 PKI 的知识。 您需要的安全性量取决于已部署环境和使用模式。 但是,有一些适用于保护 Web Service 的基本规则和最佳实践。 建议您阅读有关 PKI 的一些书籍以及有关 Web Services 互操作性组织 (WS-I) 基本安全概要文件 (BSP) 的信息。