APP下载

从网站安全测评谈起

2015-03-18

网络安全和信息化 2015年7期
关键词:脚本代码运维

接到总公司关于开展互联网接入及互联网应用系统安全专项整治工作的通知,要求学校对一直运行的互联网Web网站进行安全评测。

基于对自身安全技术的不信任以及网站开发由非专业人士完成,学校信息管理部门并未进行互联网应用的全面开发,唯一的一台外网服务器只是简单地用php脚本和MySQL开源数据库搭建起了一个计算机职称报名系统。报名时打开主机电源,报名工作完成以后关闭主机电源。我们调侃说:从某种意义上讲,不开机、不接入、不使用应该是最安全的。

测评是由具有资质的专业Web网站安全测评公司进行的,无需上门,只电话告诉了对方域名,对方就可以在远程通过专业的安全测试软件进行测试,并自动生成测试报告。其技术核心其实就是对网站系统的渗透测试,类似于黑客攻击。测试结果很快就出来了,尽管有思想准备,当拿到测试报告的时候,还是惊出了一身冷汗。一个覆盖报名功能的简单的php脚本系统,共500个脚本文件,20%的脚本存在不同程度的安全问题,Web风险等级被定义为9.9(非常危险)。安全问题的前三位分别是:

跨站脚本攻击漏洞(XSS):36个。

存在无CSRF保护的信息提交(Infor Leak):24个。

命 令 注 入(SQL Inject):18个。

本次安全测评所呈现出的问题不仅存在于我们学校,其实,大多数中小企业,由于开发网站的技术力量不足,投入资金有限,加之项目经理只重视功能需求的实现,而忽略了网站安全的建设,导致网站成为一个没有安全配置的产品。网站的安全问题在中小企业是普遍存在的,所以,外网Web站点的安全也成为一个企业网络运维成功的关键所在。

尽管我们开发的系统已经存在了很多年,使用过程中也从未出现过任何问题,但不能因此而不重视并忽略安全问题的存在。那么,作为一个中小企业的运维人员,对于一个从架构到硬件到软件全权负责的技术人员,在进行Web网站运维时应该注意哪些问题?以下是笔者对于Web网站安全管理的一些粗浅建议:

1.架构安全

架构的作用就是让Web服务器处在一个安全的网络环境中。在这个环境中,应该有针对外来访问封包的检测设备;有基于本机外出封包的过滤和诊断设备;有基于网站的攻击行为审核、记录和防护设备,有隐匿服务器身份,使其处在对外边界深层的设备。

例如,我们可以使用防火墙针对服务端口进行防护,也可以针对封包协议进行策略定制,可以使用nat技术实现服务器地址的转换,可以使用上网行为透明接入并记录进出的网络访问。

如果网络够大,还需要考虑负载均衡和服务器资源池、网页缓存等基于网站运行性能的一些细节问题,保证网站服务器运行的稳定可靠。

2.硬件安全

网站服务器是运行网站的载体。除了保障硬件稳定运转外,还要提供方便操作和管理的手段,例如,远程唤醒服务器、VNC连接控制等。需要注意一点的是,打开的服务越多,系统的安全漏洞就会越多,由此而造成的其他安全影响也不容小视。

操作系统是服务器硬件的运作灵魂,所以针对操作系统的升级要及时,针对漏洞的补丁要实现在线升级,要把操作系统的防火墙打开,安装并运行安全防护软件和杀毒软件,保证系统处在一个专业安全产品的可监控状态之下。纵观发生的安全事件和案例,最有效的进攻往往是从最底层发起的,要么是具备操作物理硬件的人员,要么是通过操作系统底层漏洞或者网络协议的安全漏洞,而这种渗透又是极其致命的,可以做到悄无声息和全覆盖,危害极大。

3.编码安全

Web网站对服务器端的安全最终还是要从编码上来解决。一个是服务器后端,一个是前端脚本。后端涉及两大部分,第一是软件供应商提供的Web容器或数据库产品,第二是用户开发的可解释脚本。前端脚本部分也涉及两大部分,第一是对前端输入字符串的过滤;第二是代码逻辑。Web网站的安全主要依赖于后台程序代码部分对用户输入的检测和对代码逻辑的正确设计,从这个角度来说,Web网站的核心安全其实就是编码人员的编码水平和安全意识。

第一,Web容器。目前常见的Web容器有微软的iis和Apache软件基金会的开源apache,脚本则涉及众多,诸如php、asp、jsp等。由于开发过程中软件自身会存在一些bug,比如 Apache 2.2.14及早期版本的mod_isapi模块中就曾经存在一个严重的漏洞,该漏洞允许远程攻击者获得一个数据库的完整控制权。所以在不保持软件最新的前提下,搭建并运行在服务器端的这些软件会存在安全漏洞。运维人员必须要引起重视,要保证这种软件bug的更新是及时和有效的。不过大多数的网站运维人员出于一些个人目的,比如为了保证不间断运行Web应用、保持网站24小时的开放和访问、担心升级会导致代码的不兼容、懒于升级等,很少有对在线Web容器进行持续升级和更新的,这是个很坏的习惯,也是当前的运维现实。由于服务软件有些是不开源的,所以,用户对于由这方面引发的安全问题只能通过获取最新升级包或者更新漏洞补丁的方式进行。

第二,程序框架。合理的程序框架设计也可以增强网站的安全性,比如将数据库服务器和Web服务器分开放在两台机器上;对外公开访问的网站上只保留静态页面文件,所有页面由另外一台内部服务器动态产生并推送到对外的服务器上等。

第三,脚本语言。每种脚本语言都会在服务器端设置一些基于本地安全访问的函数供脚本代码调用,以增强脚本访问本地资源的能力。平时,只有后台服务和脚本代码才能接触和调用这些函数,如果代码涉及不够周密,用户也可以通过用户输入或者http协议传输某些特殊字节,间接调用这些函数,从而造成服务器被非法操作。比如在php中存在以下五个特殊函数:system、exec、passthru、shell_exec、运算符,这些函数或运算符可以执行本地命令,作为网站管理人员,应该具有监控网站代码脚本的工具或者手段,随时检测脚本源代码的状态,并对php命令注入事后防范提供第一时间的警告和响应处理。

第四,命令注入。所谓命令注入,是最常见的基于Web站点的黑客攻击行为。这种攻击方式利用了Web应用程序对用户端提交的输入数据过滤不严格的缺陷,黑客通过输入构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行服务器的外部程序或者系统命令来实施攻击,以非法获取数据或者网络资源为目的。

根据对注入命令的触发是在前端还是在后端,又可以细分为:sql注入、XPath注入、CGI命令执行、XXS和会话劫持。

在脚本代码的安全设定上,牢记这样一个道理:方便了自己的同时,也就方便了他人。所以要想在很多情况下避免安全问题的出现,就需要养成一个良好的编码习惯。例如,检查php代码是否存在输入上的漏检、对输入上的脚本转义符号等进行适当的截断处理、是否在后台脚本的代码中存在方便自己执行管理的eval语句、是否在脚本代码中开放了对外部应用程序的访问、是否开放了对数据库执行和查询的脚本接口等。

第五,XSS跨站脚本。准确来讲,这是命令注入的一种特例,单独拿出来,是因为这种攻击由来已久,且经常被使用而没有引起运维人员足够的重视。用户在访问网站的时候,经常要向网站提供自己的个性化信息,比如网站用户的cookies或者其他个人数据,跨站脚本主要被攻击者利用,通过发送恶意链接或使用社会工程学等方法来读取到这些信息,当攻击者获得这些数据后,就可以伪装成该用户来登录网站,从而获得该用户的权限。

xss脚本内容需要作为一个http参数进行传递,所以,在这些参数进入代码执行前需要作审核和过滤。常用的方法就是设立一个函数,专门对字符串进行验证和重编码,验证所有输入数据的类型、长度、语法和业务类别,重编码则是将特殊字符转换为html编码,使其在到达后台脚本时就失去脚本效应。

第六,CSRF跨站请求伪造。与XSS非常相似,但XSS是利用用户对当前网站的信任来发起攻击,而CSRF是利用网站对用户的信任来发起攻击。CSRF攻击成功的可能在于网站脚本注重简便快捷的功能需求,而忽略了安全设置。这种情况在当下的中小型企业中普遍存在,一次验证成功后,网站对用户是始终信任的。这要求我们在关键的业务上必须不怕麻烦,要设置多种交叉验证方式,才能避免CSRF的攻击。当然,从技术上讲,同时开启服务器端的session功能和客户端的cookies功能,将针对用户的唯一的令牌存储在其中,然后对用户的每次请求,都进行令牌检查,确保一致,也能有效杜绝CSRF攻击。

第七,错误信息。程序代码在运行过程中,会出现很多意想不到的错误,用户代码必须对这些错误进行接管。无论是程序逻辑之内的还是之外的,都要完全接管,否则,就会在客户端出现一些与安全紧要相关的错误提示,恶意用户通过这些提示,可以获取链接地址、服务器运行状态、容器类别与版本号、脚本路径、脚本文件名等敏感信息。

第八,数据传输。http协议是一个早期的Web浏览访问协议,无论是在POST方式上,还是在GET方式上都使用明文传输数据,这样,当涉及到网站用户验证时,信息在流经网络时很容易被第三方劫持。为了防止第三方监听通讯,建议使用https协议,即使用封装了ssl的http协议进行数据交换,增加信息在网络流动过程中的安全性。

第九,编码习惯。商业编码追求效率,所以,编码工人被统一培训,在命名方式、注释方式上拥有相同的习惯。如果运维人员接受过这样的培训,这种习惯会被带到网站的安全领域,比如,在进行网站数据备份的时候,会使用一些约定俗成的名字 :bak、rar、* 副本 *、db.php等,当目录被非法遍历时,入侵者可以很容易地猜测到加载了敏感信息的数据库文件,从而导致敏感信息失窃。这种习惯要改,方法就是要么将数据库与脚本分离,要么起一个不会被轻易猜到的名字。

综上所述,要想做好Web网站的安全运维,要求运维人员熟悉基于Web脚本的各种欺骗和攻击手法,养成一个随时为软件打补丁的好习惯,培养一个安全意识,永远不要相信客户端传来的任何信息,对这些信息都应该首先进行编码和过滤处理,检查可能存在的隐患,及时截断,编码还要接管脚本可能出现的所有异常和错误,谨慎地向用户返回可控的信息。

Web网站运维人员的职责就是在自己力所能及的范围内,尽量做好对Web网站的安全防护,但是不排除有些攻击是运维人员所不能控制的,比如一个0-day漏洞就足以秒杀我们为安全所做的所有工作。所以,建立必要的监督预警机制、备份机制、事后恢复机制也很有必要。

总而言之,基于Web网站的安全防范和诸多安全事务的管理一样,要做到事前有布置,事中有控制,事后有处理。只有这样,才能减少发生安全问题的几率和损失,做一名称职的网络安全运维人员。

猜你喜欢

脚本代码运维
酒驾
安奇奇与小cool 龙(第二回)
运维技术研发决策中ITSS运维成熟度模型应用初探
创世代码
创世代码
创世代码
创世代码
数据库系统shell脚本应用
风电运维困局
杂乱无章的光伏运维 百亿市场如何成长