开放式网络系统中的多层面安全问题
--------------------------------------------------------------------------------
面对日益增多的网络安全事件,原来貌似坚不可摧的网络系统损失巨大,连斯坦福大学的服务器也被黑客拿下。这无疑意味着,网络的安全和防护将是长期的持久战。网络就是计算机,同时网络也就是安全。在任何时刻不能离线的今天,无论是网络管理人员还是开发人员,甚至是终端用户,都有必要对网络系统的安全应用模型做一次深层次的学习,做好防护措施,以便在真正受到攻击时能正确迅速地采取对策,并尽快恢复系统。
总体来说,网络的安全性可以从以下层面来说:
一、操作系统
操作系统是计算机系统灵魂,维护着系统的底层,对内存、进程等子系统进行管理和调度。如果操作系统本身出现了漏洞,其影响将会是致命的。操作系统的内核,对于网络安全是至关重要的。目前,内核的维护主要分两种模式:
对于私有操作系统,如windows/Solaris/AIX而言,由于个人用户不能直接接触其源代码,其代码由公司内部开发人员维护,其安全性由同样的团队保证,内核的修正与其他应用程序一样,以patch/SP包的方式发布。
对于Linux这样的开放式系统,是一种开放的结构。应该说,开放的模式是双刃剑。从机制上讲,全世界的开发人员都能获得源代码,从而找出其中的纰漏,似乎安全性应该更好;但是同时,如果网络管理人员不能及时更新内核,也会暴露在众多的黑客攻击手段下。
从目前来看,两者都是优劣并存,没有任何一种完全凌驾于另一种之上的绝对优势。从市场占有率来看,目前还是私有操作系统占有更大的市场份额。但笔者认为,从长期来看,两者必将并存,且开放的操作系统会成为更有发展前途的主流。如笔者一样,一贯关注www.kernel.org的朋友可能会注意到,自从Linus加盟OSDL之后,内核的开发速度明显加快,一个月,甚至几天之内,内核就会做安全方面的bug fix和upgrade。不管谁来主导Linux开放的潮流,是Redhat也好,是Novell(SuSe)也好,没有人,也没有组织能单独控制全世界程序员为Linux写代码。这是一种开放的模式,即大家都控制,大家都不控制。操作系统的优劣,很大程度上取决于投入的人力水准,需要高层次的人力投入。
所以,如果你维护着因特网上的一台服务器,无论它运行什么操作系统,你每天都需要上相应的网站看,是否有补丁,是否有了bug fix,是否需要升级。千万不要报侥幸心理,否则一个script boy就可能拿下你的网站。套用一句名言:你的服务器永远可能在第二天被黑客接管。
二、应用程序
即使是一个使用计算机的终端用户,也不可避免地每天和无数的应用程序打交道,更不用说开发人员。比如说,我每天都和这样一些软件打交道:samba,ftp,telnet,ssh,mysql,php,apache,Mozilla等,其中Mozilla附带的邮件和新闻组软件是我机器上每时每刻都运行的。大家注意到,这些软件,大都是开源软件,而且都在不停升级,稳定版和测试版交替出现。大家上samba.org看看,上apache.org看看,最新的ChangeLog中是不是都写着:bug fix, security bug fix的字样。在升级和添加新特性的同时,开发人员工作的最重要任务就是bug fixing。
应该说,开放式系统上很流行的应用软件,大多数都是用c/c++编写的。而c/c++语言对开发人员的要求非常之高,开始学习这些语言的初学者,经常使得系统core dump。时间长了,经过了血的洗礼,core dump逐渐变少,但是程序出现潜在溢出的可能性并没有减少。开发人员的提高,和自身的学习方式非常相关。经过了6个月或者1年,一个勤学好问、肯于并善于思考的程序员会成为一个熟练的软件工程师。而另外一个人可能还只会编简单的helloworld。语言和编程这个工作本身,就决定了软件是不可能bug free的。
如果是daemon程序,很多需要以root的权限运行。一旦某个daemon的漏洞在没有来得及修补之前就被发现,如果有专业人员写出了通用的攻击程序,黑客就能很轻松地拿下系统的root权限。id=0在现有的系统中是上帝,如果是善意的黑客,他会提醒你,如果是恶意的,我只能祈祷你已经进行了备份工作。
那么如何解决应用程序的安全性问题,最大可能地降低风险呢?首先,要做好备份工作。备份分完全备份和增量备份,不同的网络管理员会倾向不同的方式。本文建议两者相结合,比如说,每天增量备份一次,每周完全备份一次。第二,仔细查看所用服务的说明手册,如果能不用root权限,就尽量不使用,对黑客来说,普通权限的意义主要是为了用来获得root权限的。第三,关注相关网站的bug fix和升级,及时升级或添加补丁。
三、专用软件
上面谈到的是一些通用型的应用程序,这里的专用软件是指你自己编写的程序。一般而言,自己或者公司同事编的程序在质量上不如开源社区的高。这并非说大家的水平不高,而是开源社区有一个淘汰的自然法则,大家现在所熟知的社区都是大浪淘沙剩下的。开源社区有两个基本特点,第一,人员相对稳定,水平较高;第二,应用针对性强,用户群大。这样首先在编码的技巧和手法上,把住了第一道关口。其次,有众多的测试人员,不管是开源社区中的测试人员,还是最终用户,都会在发现各种各样问题的时候,主动向社区提交。
我这里简单谈一下编码时注意的一些尝试性问题。其一,尽量避免要求用root权限运行,能用普通权限,一定要用普通权限。其二,关注编码质量,任何时候都不要让程序访问不可控制的内存。其三,充分测试,目前在任何团队中,最不起眼的都是QA工程师。事实上,好的QA工程师应该是水平比较高的,他们不仅能发现错误,甚至就能直接指出要修改哪些地方,或是直接提供补丁。
四、脚本语言
Web应用是服务器上最基础、最强大的应用。在Linux/Unix系统上,最常用的WEB服务器是Apache,它常与php/jsp/perl等脚本语言协同工作。perl是比较古老一些的,在以前的CGI时代,几乎所有的Web脚本都是perl写的。目前最流行的perl论坛当数http://www.cgier.com/的雷傲论坛了。我们注意到,在leoboard的发展过程中,论坛是不停修改,有时经常是每天在修改。php是Linux上最受欢迎的脚本语言,它正在朝面向对象的方向发展。jsp站在java的肩膀上,利用servelet,充分展示java的功能。
但是使用它们时,除了要熟悉语法技巧外,还必须关注安全性问题。它们具有语法灵活,支持正则表达式,能够和本地系统和命令方便对接等特性。这同时也使得黑客容易上手。简单举两个例子:1. 记得看过这样一篇文章:我们是如何攻入apache.org的。里面详细叙述了利用该网站管理员的疏忽,拿下root权限的过程。当然,该网站早就修复了这些问题;2. 我曾经编过一个linux上的c语言程序,可以用来发送短信,供某网站用php来调用。由于该网站对安全性理解不足,结果被人抓住漏洞,利用该php页面一天发信10多万条。
五、管理第一
对于操作系统和应用程序的编制者,当然应该是技术挂帅,否则就无法产生高质量的程序。但是对于大多数使用这些系统的人员来说,最关键的是管理,技术只能屈居第二。
管理首先体现在整个系统的管理方案。这里简单叙述几个方面:1. 密码管理。每个用户的密码要相对复杂,比如要同时包含字母和数字等;密码不能是生日;密码必须定期改变;root权限只能给有限的人(最好只有一个人)掌握。2. 网络管理员的职责:有人说过,网管的主要工作就是每天去看看有没有新的补丁。这对windows网管适用,对Linux/unix系统的管理人员也同时适用。3. 管理人员的素质提高:对操作系统,对系统中应该保持的状况要胸有成竹,出了意外,马上就能觉察并修补。4. 定期请安全公司的专业人员给予指导:请注意,不要怕外人来了解你的系统拓扑结构,他们是以此为业的,水平高、经验丰富。
上面探讨了很多,那么是否就穷尽了安全的讨论了呢?并非如此,随着新技术的不断问世,新的攻击手段层出不穷。事实上,可以说是网络的攻击促进了防护技术的进步。网络的安全不是抽象的概念,它是多层面的!
(来源:CCW)
|