1.8 不要通过隐匿来提高系统的安全性
网络安全体系结构
在翻阅介绍安全原则的出版物和报道时,你常常会听到有人认为“通过隐匿实现的安全并不安全”。由于这个说法非常有名,因此该说法常常遭到误解,并被当作各种安全问题的借口或理由。让我们考虑一个新的场景来更好理解这个公理。
纸币是我们许多日常交易的基础,伪造纸币是大家关心的问题。国家本可以通过对生产纸纤维和墨水成份等材料的工艺进行保密来防止伪造钞票,但是并没有国家这么做。实际上,政府采取了其他措施来增加了伪造货币的难度。这些方法包括水印、萤光油墨、能在紫外灯光下发光的聚合安全线和难以复制的缩微文字。在这个例子中,防止伪造的方式就不是依靠隐匿来实现的。不过,对于过两天就能在美国财政部网站上看到印制100美元的详细流程这一点,我也不抱什么希望。
对于聪明的攻击者来说,想要在公共网络中找到一样工具(例如www.insecure.org上的nmap)来对防火墙采样(fingerprinte)并以此摸清防火墙品牌并不难。因此,正确的安全心态不是保密这一信息,而是让防火墙正确地执行它的访问控制功能。进一步说,如果发现了针对防火墙产品的攻击时,必须迅速打上补丁。不要寄希望于也许没人知道防火墙品牌,或针对某种技术的特殊攻击方式不会奏效—这只是通过隐匿实现的安全。不过,倒也不用四处宣传你的防火墙品牌,不用完全放弃针对防火墙品牌型号的保密工作。
前面的例子着重介绍了是否要对你所部署的安全技术和安全产品品牌进行保密。下一个例子旨在讨论对你在网络中全面使用的某项安全技术进行保密所带来的价值。
在过去几年中,有相当多的方法旨在找到在网络中是否部署了NIDS。这样做的目的是如果发现了NIDS,攻击者可能会找到避免被扫描引擎探测到的方法。这种方法通常包括迫使NIDS状态表错误表示目标系统所处的实际状态,例如通过调整IP生存期(Time-to-Live)字段或故意对数据包进行分片来试图迷惑NIDS。知道你部署了NIDS的人有可能把这个消息透露出去,那部署NIDS就没有什么意义了,因此对于NIDS的具体配置及其位置,你还是应该保密。这时,你的所作所为并不是“通过隐匿来实现安全”,因为这种做法是基本的常识。
注意 下面地址有一篇关于欺骗NIDS的优秀论文: http://secinf.net/info/ids/idspaper/idspaper.html。
网络地址转换(Network Address Translation,NAT)有时会被人错误地拔高为一种安全特性。实际上,它真正实现的功能是隐藏第3层的地址。当你在Internet网关上使用NAT时,仍然需要在这里配置访问控制。真正的状态化防火墙可以提供第3层和第4层上的访问控制,也能提供一些更复杂的功能,例如序列号验证、分片滥用检查和IP选项误用识别。虽然这些功能与NAT无关但还是应该使用,因为黑客有可能伪装转换后的地址。在进行多对一的转换时,也要考虑到类似的问题。详细内容参见第6章,了解为何不能信任NAT的安全功能。
警告 由于用户运行的应用程序会试图通过你放行的端口(例如TCP端口80)封装隧道,因此NAT(在一定程度上,也包括防火墙)会降低你整个网络的安全性,它会使流量分类更加困难。当然,大部分情形下防火墙的优点还是大于缺点,但在设计访问控制策略时要了解这些问题。
这些示例的目的旨在说明确保你的设计尽可能不被他人所知的重要性。以加密为例:在安全领域中,加密是一种得到了广泛应用的方式,它的做法是将算法公开给所有的人,同时确保自己的密钥足够强健,而不是寄希望于攻击者不了解加密采用的算法。
但这并不代表你可以公开一切。这里强调的是,隐匿的方式不值得依赖。如果对一些特性或设计元素进行保密不会造成管理负担,保密也不无裨益。但如果隐匿会加重管理负担,通常不值得为这点额外的利好而实施隐匿。
例如,对设备上的登录标识进行保密几乎不会造成管理困难,因此不妨这样去做。对你的系统设计和设备选型保密也是个不赖的选择。不过,让所有内部简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)服务器在TCP端口2525上运行而不是在TCP端口25运行,这样做就不值得提倡了。因为这种做法必须修改所有主机应用程序,才能让它们使用新的端口,这只会让你不断接到客户的求助电话,或者让你一次又一次拨通安全厂商的求助电话。