笔者所在企业的网站,最近频繁的被木马、病毒等青睐,为此笔者下定决心,要打好这场WEB服务器的安全攻坚战。下面把一些作战方法共享出来,虽然不敢说百战百胜,但是,至少能够给大家一些参考作用。
笔者所在企业的网站,最近频繁的被木马、病毒等青睐,为此笔者下定决心,要打好这场WEB服务器的安全攻坚战。下面把一些作战方法共享出来,虽然不敢说百战百胜,但是,至少能够给大家一些参考作用。
一、 转换角色,把自己当作可能的攻击者
大部分时候,我们若只是站在WEB管理员的角度上考虑问题,可能就发现不了WEB服务器的漏洞。相反,我们此时若能够换个角度,把自己当作可能的攻击者,从他们的角色出发,想想他们可能会利用那些手段、哪些WEB服务器的漏洞进行攻击,或许,我们就可以发现WEB服务器可能存在的安全漏洞,从而早先一步,修补安全漏洞,防止被木马或者病毒攻击。
从公司外面访问自己的WEB服务器,进行完正的检测,然后模拟攻击自己的网站,看看,会有什么样的结果。这对于WEB的安全性来说,可能是一种很好的方法。如我们可以假当攻击者,利用扫描工具,对WEB服务器进行扫描,看看有否存在可以被攻击的服务。有些东西我们平时可能不会引起我们重视,但是,利用黑客常用的工具进行扫描,就会发现一些可能会被他们利用的服务或者漏洞。如在服务器安装的时候,操作系统会默认的安装并启动一些不需要的服务;或者在服务器配置的时候,需要启动一些服务,但是事后没有及时的关闭,从而给了不法攻击者一个攻击的机会。最常见的如SNMP服务,又称简单网络管理协议。这个服务在系统安装完毕后,默认情况下是开启的。但是,这个服务可以为攻击者提供服务器系统的详细信息,如WEB服务器是采用了什么操作系统,在服务器上开启了什么服务与对应的端口等等宝贵的信息。攻击者只有了解这些最基本的信息之后,才能够开展攻击。
我们安全管理人员,在平时的时候可能不会发现这个问题,但是,若能够利用黑客的扫描工具一扫描,就能够发现问题的所在。故笔者认为在必要的时候,需要换个角度,从攻击的角色出发,考虑他们会采用什么样的攻击方法。如此的话,我们才可以避免“当局者迷”的错误,保障WEB服务器的安全。
二、 合理的权限管理
有时候,在一台服务器上,不仅运行了WEB服务器,而且还会运行其他的诸如FTP服务器之类的网络服务。在同一台服务器上应用多种网络服务的话,很可能造成服务之间的相互感染。也就是说,攻击者只要攻击一种服务,就可以利用相关的技术,攻陷另一种应用。因为攻击者之需要攻破其中一种服务,就可以利用这个服务平台,从企业内部攻击其他服务。而一般来说,从企业内容进行攻击,要比企业外部进行攻击方便的多。
那或许有人会说,那不同服务采用不同服务器就可以了。其实,这对于企业来说,可能是种浪费。因为从性能上讲,现在的服务器上同时部署WEB服务与FTP服务的话,是完全可行的,性能不会受到影响。为此,企业从成本考虑,会采取一个服务器。而现在给我们安全管理员出了一个难题,就是在两种、甚至两种以上的服务同时部署在一台服务器上,如何保障他们的安全,防止他们彼此相互之间感染呢?
笔者现在就遇到这个问题。笔者现在的WEB服务器上运行着三种服务。一个是传统等WEB服务;二是FTP服务;三是OA(办公自动化)服务,因为该服务是WEB模式的,互联网上也可以直接访问OA服务器,所以也就把他部署在这台服务器上。由于这台服务器的配置还是比较高的,所以,运行这三个服务来说,没有多少的困难,性能不会有所影响。现在的问题是,如号来保障他们的安全,FTP服务器、OA服务器与WEB服务器之间安全上不会相互影响呢?
我现在采用的是Windows2003服务器,为了实现这个安全需求,把服务器中所有的硬盘都转换为NTFS分区。一般来说,NTFS分区比FAT分区安全性要高的多。利用NTFS分区自带的功能,合理为他们分配相关的权限。如为这个三个服务器配置不同的管理员帐户,而不同的帐户又只能对特定的分区与目录进行访问。如此的话,即使某个管理员帐户泄露,则他们也只能够访问某个服务的存储空间,而不能访问其他服务的。如把WEB服务装载分区D,而把FTP服务放在分区E。若FTP的帐户泄露,被攻击利用;但是,因为FTP帐户没有对分区D具有读写的权利,所以,其不会对WEB服务器上的内容进行任何的读写操作。这就可以保障,其即时攻陷FTP服务器后,也不会对WEB服务器产生不良的影响。
虽然说微软的操作系统价格昂贵,而安全漏洞又比较多,但是,其NTFS分区上的成就表现还是不差的。在NTFS分区上,可以实现很大程度的安全管理,保障相关服务于数据的安全性。所以最后还是采用了微软的2003操作系统作为服务器系统,而没有采用Linux系统。
三:脚本安全管理
根据以往经验,其实很多WEB服务器因为被攻击而瘫痪,都是由于不良的脚本所造成的。特别是,攻击者非常喜欢利用CGI程序或者PHP脚本,利用他们的脚本或者程序漏洞,进行攻击。
如我们的网站就遇到个几次攻击,他们利用CGI程序的漏洞,让外部攻击者向WEB服务器传递了一些不可靠的参数。一般来说,WEB应用需要传递一些必要的参数,才能够正常访问。而这个参数又可以分为两类,一个是可值得信任的参数,另外一类是不值得信任的参数。如企业可能是自己管理WEB服务器,而不是托管。他们就把服务器放置在企业的防火墙内部,以提高WEB服务器的安全性。所以一般来说,来自于企业防火墙内部的参数都是可靠的,值得信任的;而来自于企业外部的参数,都是不值得信任的。但是,也不是说不值得信任的参数或者说,来自于防火墙外部的参数WEB服务器都不采用。而是说,在WEB服务器设计的时候,需要注意,采用这些不值得信任的参数的时候,需要进行检查,看其是否合法;而不能向来自于企业内部的参数那样,不管三七二十一,都照收不误。这明显会对WEB服务器的安全带来威胁。如有时会,攻击者利用TELNET连接到80端口,就可以向CGL脚本传递不安全的参数。
所以,在CGI程序编写或者PHP脚本编辑的时候,我们要注意,一定不能让其随便接受陌生人的参数,不要随便跟陌生人打交道。在接受参数之前,一定要先检验提供参数的人或者参数本身的合法性。在程序或者脚本编写的时候,可以预先加入一些判断条件。当服务期认为若提供的参数不合法的时候,及时通知管理员。这也可以帮助我们,尽早的发现可能存在的攻击者,并采取相应的措施。
对于脚本的安全性来说,要注意以下问题:
1、在脚本或者程序编写的时候,不应该把任何不信任的参数直接保存为会话变量。因为根据WEB应用的设计原理,会话变量只保存信任变量。也就是说,会话变量中的值,WEB服务都认为其是值得信任的,会不加思索的采用。一般的设计思路是,先设置一个临时变量进行存储,然后编写一个检验其合法性的过程或者函数,来验证其合法性。只有通过验证的时候,这个值才能够被传给会话变量。根据笔者的经验,要是没有亲身经历过惨痛教训的WEB管理员,可能对此不屑一顾。但是,那些有过这方面教训的人,则会非常看重这个合法性的检验过程。毕竟是吃一堑长一智,所以新手还是需要多听听过来人的建议,不会吃亏的。
2、在没有充分必要的时候,不要采用脚本,尽量使得网页的简单化。其实,企业的网站跟个人网站有个很大的不同,企业的网站只要朴素就好,不需要过多的渲染。一方面,过度渲染的网站会降低用户网站访问的速度;另一方面,这也会降低网络的安全性能。故,在没有充分必要的情况下,不要共脚本或者程序在渲染网站的华而不实的功能。
3、对脚本或者程序的执行情况要进行持续的跟踪。在万不得已网站采用了程序或者脚本的时候,则需要定时不定时的对这些脚本或者程序的运行情况进行稽核,看看其有没有被非法利用的嫌疑。