服务防火墙模式2010-03-01 infoq Arnon Rotem-Gal-Oz在本文的样例中——模式取自于Arnon Rotem-Gal-Oz正在写作中的新书《》,Arnon解释了如何利用服务防火墙(Service Firewall)拦截进出消息,并使用专用软硬件对它们进行审查。我曾在安全消息(Secured Message)和安全基础设施模式(Secured Infrastructure patterns)中提到:“消息穿行于无人区中”。当消息穿越这样的区域时,你可以使用安全消息或安全基础设施对其实施保护。但是,如果发送者本身就心存不良,我们该如何应对呢?当攻击者给我们发送一条恶意消息(如将病毒作为SOAP附件)时,设法确保收到的这条邪恶消息原封未动以及无人看它,并没有实质帮助。问题为了说明恶意发送者可能发起的攻击类型,让我们看看其中的一个例子。下图1是一个XML拒绝服务(XDoS)攻击。在这种类型攻击中,恶意发送者给消息附上大量的数字签名。对该类型攻击没有提防的那些分析器(Parser)会检查每个签名,导致服务处理速度降低到正常水平之下。

图1:图解XDoS攻击。恶意发送者准备一条看起来有效,但实际携带了大量数字签名的XML消息。无戒心的分析器将尽力验证所有这些签名,这将占用大量CPU时钟周期,导致服务不可用。图4.4示范了利用入口消息(incoming messages)的攻击,它只是我们需要应对的其中一种威胁;出口消息(outgoing messages),则是另一不得不处理的相关威胁或问题。此时,我们需要确保私人或机密信息没有泄露于服务之外。在这种情形下,我们需要找出一种方法确保接受者只能获得契约允许流出服务的信息。你如何保护服务以防御恶意入口消息和阻止出口消息泄露信息?一种对付恶意发送者的方法是使用安全基础设施模式(参见本章前文),同时要求证书给客户端授权。这意味着没有证书的客户端无权与系统联系。这种方式有一个问题,只有当服务消费者数量可控且服务不向公众开放(如暴露在互联网上)时才工作很好。另一个缺陷是证书无法应付内部攻击,因为他们已被授权访问系统。另一招就是将屏蔽恶意内容的安全逻辑作为业务逻辑的一部分。这样会带来几个问题。因为,对于每个服务来说,都面临很多公共威胁,这样你将使代码重复。此外,由于业务逻辑被安全逻辑感染,这使得代码书写以及维护难度加大。更好的选择是将安全抽出到另一个组件中。现在,让我们来仔细的看看这种方法。解决方案不管怎样,SOA消息毕竟是应用级组件。对SOA来说,消息概念既不新颖,也不独特。对于低级别的OSI栈(网络层)消息,我们(计算机业界)已经拥有了很多经验,尤其是TCP打包器(packer)和UDP数据报文(datagram)。TCP与UDP和SOA消息几乎没有相似点,有趣的是,就本模式的目的来说,是减轻它们共同面对的威胁。既然威胁类似,我们就可以将已创建的、用于TCP的相同解决方案用于SOA消息。实现服务防火墙,对出入消息进行拦截,并用专用软硬件审查它们。

图2 服务防火墙模式。服务防火墙位于外部世界和真实服务(或边沿)之间。服务防火墙扫描、验证和审计出入消息。一旦消息被认为有问题,它要么被过滤,要么被净化。