delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

13 May 2009

实现安全的三种途径

回国的时候和 康神 及端木吃饭的时候聊起过这个话题,这里整理出来。

实现安全有三种主要的手法:基于隐蔽的安全(或者,基于假象的安全)、基于默认配置的安全和基于设计的安全。

基于假象的安全很容易理解,也很容易实现。举一个简单的例子,在一片西瓜地前面戳一块牌子,说这块西瓜地里有一个西瓜里面注射了剧毒。

可以想象,由于信息的不对称(不知道是哪个西瓜有毒,或者根本就没有西瓜有毒),试图偷西瓜的人就会有所忌惮—-如果偷走的西瓜含有剧毒,那么这个西瓜是没办法吃的。然而,这样做有至少三个很致命的弱点:首先,为了实现最大化的利益,很可能瓜地的主人并不真的注射剧毒(或者反过来说,把偷瓜的人毒死并不是他的目的,他的目的是尽可能地保护瓜不被偷);其次,即使瓜地的主人真的只给一个西瓜注射了剧毒,那么如果有人偷了那个西瓜并且死掉,那么知道这件事的人就可以冲过来直接把所有的西瓜偷走;最后,一个以牙还牙的小偷,很可能会在牌子上留下这么一段话:现在有两个了……

简单地说,基于假象或隐蔽的安全,建立在"别人不知道其机制"的基础上。这样的做法有时能够在一定程度上延缓攻击,但并不能使攻击的成功率降低。将弱点隐蔽这种方法成本比较低,例如,把门钥匙放在门框上、将知名服务端口如ssh(tcp/22)转到不知名端口如tcp/12580上、port knocking技术,以及国内银行常用的Active X插件等等。然而,假象终归是假象,这些方法都不能真正改善系统的安全性。这类做法,充其量只能作为没有其他更好的办法时候的一种临时 workaround,而不能带来长久的安全。

第二种做法,也就是基于默认配置的安全,是一类非常常见的策略。这种做法通常与其他安全机制合并使用。简单地说,采用这种策略的系统,在其出厂的时候是没有暴露在外的弱点的,例如它可能只开启了非常少量,甚至完全不开启任何服务,随后,管理员可以根据需要进行配置来开放一些需要的服务。

基于默认配置的安全可以说是"授权最小化"原则的一个延伸。在一个安全系统中,通过特权拆分等方式实现授权最小化之余,还可以使用默认配置安全的方法来减少用户配置安全系统的风险。采用这种策略的产品往往会要求用户告诉系统这个系统将如何使用,而不是让用户告诉这个系统将不会如何使用,典型的例子有 Windows Server 2003、OpenBSD 等等。

基于设计的安全,是成本相对比较高,但效果也最好的一种做法。这种做法的要点是分析系统中的每一个可能的弱点,并采取适当的方法来消除弱点,或至少限制成功攻击可能带来的损失。例如在ssh中采用的使用特权拆分的做法,将处理输入的进程的特权抛弃,并使用DFA限制非特权进程向特权进程递交请求的类型,以公钥验证替代基于密码的验证措施,而不是强制使用20位以上的密码,以及采用更好的密码技术,都属于这一类方法。

基于设计的安全能够从根本上提高系统的安全性。然而,这一类的改进往往需要更多的安全知识和开发成本。在设计系统的过程中就将安全融入进去,往往要比在现有的系统中引入安全要容易得多,因为一些设计很可能会需要改变用户的使用习惯(例如,使用密码验证的用户可能必须携带包含自己私钥的证书或其他信任状才能登录),而用户的使用习惯往往又是保证整个系统安全的真正关键所在,因为一个好的系统必须优先保证它可以控制的部分的安全性,无论它是否被正确使用,而用户显然是不受这些系统控制的。

在实际的系统中,后两种方法往往会结合使用。基于假象的安全应该尽量避免使用,因为这种做法只会麻痹用户,让他们认为系统是安全的而放松警惕,而在好的安全系统中,用户恰恰是安全最薄弱的环节。