网络安全问题如今成了很热门的话题。可是说到安全,人们又都了解些什么呢?应该说,并不总是一无所知的,各安全产品厂家的宣传,形形色色的讲座,已经给人们灌输了不少知识。比如说,都知道防火墙可以用于保护公司内部网络,对数据进行加密可以保护私人信息免受无关人员窃取,数字签名技术能确定收到的信件是不是有人伪造等等。可是总的看来,大都还只是些并不全面的了解。
应注意系统的“弱点”
有些系统出于不同目的的考虑,过于强调安全的某一个具体方面。“不是说56位DES算法已经被人攻破了吗?我可以提供强的128位加密算法”、“128位密钥很安全”、“2048位RSA算法比1024位RSA算法安全”等等。不错,这些说法都是正确的。可是它可能会给人一个错觉,认为加密或是某一方面就是安全的一切,这些问题解决了安全问题也就迎刃而解了,果真如此吗?
事情并不是如此简单,加密也好,其它措施也好,都仅仅只是保证系统安全的一种手段,Internet的目的、网上各种应用系统的目的都是要给人使用,是要把人们日常一直在进行的那些工作的舞台搬到电子空间里面来。从这个意义上讲,就是安全也仅仅只是为了人的需要而必须采取的一种手段而已。攻击者的目标决不只是系统采取的安全机制,而是系统要达到的目的本身。
莎士比亚有句名言“阳光之下,本无新事”,那么,让我们考察一下相类似的系统,应该能对我们有所启迪。
一般说来,密钥长度每提高一位,就可以让攻击者多花费一倍的破解时间,所以从理论上说,如果没有更新的计算技术出现,总是可以找到在给定时间内不能被破解的密钥的。但更长的密钥是否总是意味着更安全呢?你在门上装上了一个4位密码锁(从技术上讲,可以说该锁的密钥空间为10000),或许强盗会试每一个可能的密钥看行不行(强力攻击),平均说来,大约5000次之内他可以把锁打开。现在假设你装上的是10位的密码锁(密钥空间10亿),你说强盗还会去试5亿次来开一把锁吗?
对小偷来说,如果你有一扇小门敞开着,或者有一扇窗户一捅就破,那他决不会使用撬门撬锁等手段直接对付你重重武装起来的大门的。而对于技术间谍,他们可以通过各种各样旁门左道的方式,如企业正式文档的存放、草稿的处置、对工作记录的态度,甚至垃圾堆、碎纸机中的材料、吸烟室内的谈资等等,来得到他们想要的目标――信息,而不需太高级的手法的。这些例子说明了,看一个系统是否安全,我们不应该只看它采用了多么先进的设施,更应该注意的是它最大的弱点在什么地方,系统的安全性取决于它最薄弱的部位的安全性。这正是一桶水原理:一个桶能装的水量不取决于桶有多高,而取决于组成该桶的最短的那块木头有多长。
本世纪70年代之前,密码技术的使用范围主要在军事方面,当时最大的威胁在于敌方进行的高级密码分析。当密码技术的使用大量转移到商务系统中之后,这个威胁模型还相同吗?是不是说在商务系统中最大的威胁是那些能够偷听到网络中来来往往的数据,而且还具有良好的数学功底的密码分析家呢?
R. Anderson在《密码系统为什么会失败》一文中,通过考察数百例零售系统中ATM卡系统被攻破的案例,对此的回答是“不!”。对这类系统最大的威胁不是来自训练有素的技术人员,绝大多数都是只需要很普通的技术就能做到的威胁。
再考察近几年在Internet上发生的攻击,可以看出这样的威胁模型仍然相同。
如上所述,更长的密钥并不总是更安全,一个强的加密算法只有当得到正确实施时才是强有力的。隐藏在世界各地的攻击者可以利用一切对你的系统不利的威胁,他们通常可以越过算法本身,不需要去试每一个可能的密钥,甚至不需要去寻找算法本身的漏洞,他们能够利用设计中的错误、实现中的错误、安装上的错误等等,有时他们会发明一些小技巧,但大多数情况下他们只需利用设计者们犯的一次次重复发生的错误。
系统安全威胁来自哪里?
进一步的分析,可以粗略地将对系统安全的威胁归结为六大类:缺乏教育、变节的员工、系统软件的缺陷、对硬件的攻击、错误的信任模型、拒绝服务,这几类之间可能会有交叉。下面分别讨论这些问题及相应的策略。
1.缺乏教育
对安全系统的使用者,可以有两种不同的安全模型。
(1) 火车司机型:这种系统中,使用者只需要控制系统的启停就可以了,安全系统能够辨别出危险信号,能够自动找寻道路,使用者在其它时间可以放心大胆地干别的事情。
(2) 航空飞行员型:在这种模型中,即使系统已经拥有很先进的自动导航设备了,而且大多数情况下实际上系统都已经在自动运行了,仍然要求使用者必须是训练有素的。
在这两种模型中,第一种听起来更加“用户友好”。被图形用户界面惯坏了的人们都希望安全系统在经过简单的指导安装之后,以后的运行就不再需要自己介入了。这种想法确实省心省力,可也太一厢情愿了。现实的网络世界远远没有铁路系统那么有序,缺少像铁轨那样严格控制并引导列车前进的机制,可能出现的异常情况太多(包括下面要谈到的那些问题),没有办法一劳永逸。
有些人会认为:“不是还有防火墙吗?交给它好了!”这同样错了,防火墙并不是万灵药,它虽然堵住了很多不安全的缺口,但同样小心翼翼地向外界打开了一扇访问内部信息的小门。虽说受到了限制,这条路仍然是通的,如果有人利用这条路径进行数据驱动型的攻击,防火墙是无能为力的。已有很多文献给出了成功地突破防火墙的例子。所以有的安全专家甚至有些不合逻辑地指出:“使用防火墙,可能会适得其反。”
许多系统被攻破是因为它们严重依赖于用户创建的口令,但由于不便于记忆,人们通常不会选择保密性很强的口令,当这个口令被用作加密系统的密钥时,比起随机生成的密钥,它们更容易(当然也是更快)被破解。为了便于记忆,有些系统的口令不仅仅是一个单词,还可以是一句话,称为“通行短语”。但由于语言本身信息的高度冗余性,40个字符的通行短语并不比64位(8字节)的随机密钥来得更安全。
此外,出于工作上的考虑,有些用户可能会把自己的口令给同事;由于拿不准是不是自己把信用卡放在其它地方了而不去挂失;不仔细检查收到邮件的电子证书;不去改变软件缺省安装的不安全状态(尤其对Windows NT用户)等都有不小的安全隐患。
所以说不管是用户还是系统管理员,都应该接受所用系统在安全方面应受到的教育,学会如何选择好的口令、如何管理好口令表、如何保持警惕、如何处理系统发生问题的紧急情况、如何安全升级系统等等。
2.变节的员工
这一点应该说是属于企业的内部事务。通常负责密钥管理和保密系统维护的人越多,系统出问题的可能性也就越大。对此,最好的解决办法是建立完整的安全政策,严格控制用户权限以及对关键信息的访问。对于银行之类的系统,必要时,某些关键数据可以采用某种秘密共享机制使得必须有若干个人同时在场时才能起用。还要加强审计功能,保证每一件事务都有据可察。
安全系统应该能提供解决这一问题的机制,不允许任何人在系统中留有“后门”。
3.系统软件的缺陷
W. R. Cheswick和S. M. Bellovin在合著的《防火墙与Internet安全》中,当论证防火墙的必要性时,从Murphy定律出发,先指出了“所有程序都是有错的”,再推出“更大的程序包含着更多的错误”和“一个同安全相关的程序有安全方面的错误。”由此可以得出结论:“安全从简单开始。”
可是我们考察一下很常见的网络应用系统,可以看出其中包含了Web浏览器、Java虚拟机、Web服务器、事务服务器、数据库系统、CORBA机制等等。当然,也包括防火墙。确实是太复杂了,可以说,任何一个部分都可以出错,而任何一部分的错误都可能导致安全漏洞,导致数据失窃、文件被毁或事务被欺骗提交等。最坏的结果是,“黑客”或破坏者知道这些漏洞而当事人却被蒙在鼓里。
进一步细分,这一类问题可能出在以下几个方面:
(1) 系统设计中的问题
安全系统牵涉到各种不同的密码学原理,如加密算法、数字签名算法、单向Hash算法、消息认证码、安全协议等。攻破其中的任何一项,也就攻破了整个系统。即使系统使用了强的加密算法和安全协议,仍然可能设计出安全性很弱的系统出来。
此外,就如五行中的相生相克一样,两个强安全协议、密钥的联用也可能会出现安全隐患,得到一个不安全的系统。这些问题都应该是设计中应该考虑到的。但由于设计者会受到各种条件的限制,不可能对所有东西都了如指掌,即使是大公司的产品也会出现设计问题。
(2) 系统实现的问题
这里面的问题可能出在对设计的理解上,实现的系统并不是设计时所想像的系统。也可能出在实现细节上,由于实现时考虑不周,一些系统不保证当加密之后清除明文;加密过程中,系统崩溃可能导致密钥被转存到硬盘上;系统没有考虑请求时间,入侵者可能将截取到的数据包重发进行攻击。
系统实现中最大的问题出在程序的错误上,由于时间所限,加之测试工具限制,现有的许多系统都是在未经充分的测试就投入运行的,肯定会隐藏不少错误。
(3) 故障恢复中的问题
设计一个安全的系统要求做到当一个系统某一部分被攻破时,其影响范围应该得到限制,不至于捅出更大的乱子。泄漏一个文件的密钥不会使入侵者能看到硬盘上所有的加密文件,黑客对智能卡进行逆向工程只能得知他所拿到手的卡的秘密而不会有助于获得系统中其它卡的信息。在此,好的系统设计必须考虑到当入侵发生后的对策,设计时应该相信这么一点:或早或晚,我设计的系统总有一天会被人攻破的!只有这样,当攻击真的发生时,才不会手足无措。
对已经广泛投入使用的系统各部分可能出的错误或已经被确诊的错误,有许多渠道可以得知,如地下黑客站点、CERT报告、安全新闻组等等,这些渠道通常还会给出解决问题的方