软件安全性原则:第四部分
在本部分中,Gary 和 John 展示了 10 条原则的一部分,这些原则可以帮助您除去您代码的大部分安全性问题。在上一篇文章中,他们主要讨论了最小特权原则和分隔的原则,这二者都可以帮助您设计高质量的访问模型。在本文中,他们将向您展示对于安全性来说简单性要比大多数人想象的重要得多。他们还将讨论隐私性问题;给出太多信息会让您摸不着头脑。
原则 6:简单性
在许多领域,您可能听到 KISS 咒语 —“简单些,蠢货!”与其它场合一样,这同样适用于安全性。复杂性增加了问题的风险;这似乎在任何系统中都不可避免。
很明显,您的设计和实现应该尽可能地简单。复杂的设计不容易理解,因此更有可能产生将被忽略的拖延问题。复杂的代码往往是难以分析和维护的。它还往往有更多错误。我们认为任何人都不会对此大惊小怪。
类似地,只要您所考虑的组件是质量良好的,就应该考虑尽可能重用组件。特定组件被成功使用的次数越多,您就更应该避免重写它。对于密码库,这种考虑尤其适用。当存在几个广泛使用的库时,您为什么想重新实现 AES 或 SHA-1 呢?那些库可能比您在房间里装配起来的东西更为健壮。经验构筑了保证,特别当那些经验是成功的经验时。当然,即使在广泛使用的组件中,也总是有出现问题的可能性。然而,假设在已知数量中涉及的风险较少是合理的。
附加功能
添加花哨的功能往往会违反简单性原则,这也是显而易见的。确实如此 — 如果那些花哨的功能是安全性特性会怎么样呢?当我们讨论深度防御时,我们说需要冗余。这里,我们似乎在争论相反的问题。我们以前说过,“不要把所有鸡蛋放在一个篮子里”。现在我们说,“小心不要有多个篮子”。这两种意见都是有道理的,即使它们明显地背道而驰。
您需要做的是寻求一种适合您特殊项目的平衡。当添加冗余特性时,通常您正要尝试改进感觉的系统安全性。一旦添加了足够的冗余以满足您确定的任何安全性界限,您不应该再添加额外的冗余了。实际情况下,第二层防御通常是个好主意,但应仔细考虑第三层。
尽管简单性原则显而易见,但它也有其微妙之处。首先,您必须努力构建尽可能简单的系统,同时仍然要满足安全性需求。不带加密的在线贸易系统确实一定比具有加密的等价系统简单。但没办法,带有加密的系统更安全。
瓶颈
改进软件简单性的另一种方法是通过系统中的许多瓶颈来疏导所有关键安全性操作。瓶颈是至系统的一个狭窄接口,您通过它强制所有流量通过该接口,因此您可以方便地进行控制。您应该避免在系统中分布安全性代码,因为这会使维护更加困难。另外,如果强制您的所有用户通过几条小通道,则监控用户行为会简便得多。这与只有几个入口的体育馆是同一个道理;如果入口有很多,检票就困难多了。为了达到相同的效果,您需要多得多的员工。
关于瓶颈,要记住一件重要的事:它们周围不应该有秘密通道。例如,如果体育馆有一道不安全的铁丝网,可以肯定没有票的人就会进入。假设机智的攻击者可能洞察的“隐藏的”管理特性或“原始”接口可能很容易起反作用。在许多示例中,知识渊博的闯入者可以访问隐藏的管理后门,例如 Dansie 购物车中的后门或者 Microsoft FrontPage 中的后门都是在同一个月被发现的(2000 年 4 月)。FrontPage 后门变得有点出名,由于隐藏的加密密钥是“Netscape 工程师是蠢货!”
可用性
简单性的另一个经常被忽视但又极其重要的一方面是可用性。需要使用系统的任何人都应该能够方便地获取您必须提供的最佳安全性,并且不能引入不安全因素。可用性适用于使用您产品的人和必须根据可用性来维护您代码库或程序的人。
设计人员和程序员似乎总是认为他们生来就知道什么是易于使用的东西。然而,可用性测试通常证明他们错了。对于带有平均功能的应用程序来说,边际可用性可能还行,因为您的产品可能酷到足以使易用性不是实际考虑的问题(您很幸运)。然而,对于安全性来说,可用性变得更重要了,因为如果安全性的用户界面不可思议地无法易于使用,则许多用户将容易受到攻击。虽然如此,但大部分人仍将忽略它。
相当奇怪的是,可用性是一门完整的科学。我们明确认为所有软件设计人员都应该阅读两本关于这一领域的书,Don Norman 编写的 The Design of Everyday Things 和 Jakob Nielson 编写的 Usability Engineering(请参阅参考资料)。由于篇幅限制,本文无法涵盖这方面的足够内容。但是,我们将提供一些相关技巧,因为它们适用于安全性:
1)用户不会阅读文档。如果用户需要做任何特别的事情才能获取您所提供的全部安全性好处,那么用户未必接受那些好处。因此,您应该在缺省情况下提供安全性。用户应该不需要了解关于安全性的任何事情以及不需要做一些特别的事情就能安全地使用您的产品。当然,安全性是一个相对的术语;您必须作出一些关于用户安全性需求的决定。
考虑缺省情况下关闭了加密的企业应用程序服务器。通常,您可以使用管理工具上某处的某些菜单选项来打开它。即使系统管理员不再考虑安全性,那个人也可能认为“缺省情况下他们必定打开了加密。”我们已经看见了许多服务器
搜索更多相关主题的帖子:
软件 原则