网友留言说互联网上没有安全,我觉得吧,在限定前提的情况下,还是可以做到安全的。

这篇文章先后写了4次,因为涵盖内容太广且外部环境差异较大,所以始终没写好。这次缩减范围,单写web服务器,这样也许篇幅会少一些。

本人很嚣张,不会像别人那样谦虚的说抛砖引玉。本文本就不是抛砖引玉,本文抛出的既是金玉良言,也不指望勾引出什么砖头,呵呵。

后续如果有时间,可能再写数据库服务器以及其他的,总体思路都是一致的。

 

本文涉及的内容可应用于Linux+Apache或Windows+IIS,若读者自己有心,很容易可以拓展到任何服务器形式。本文不讨论ddos、cc这类暴力型攻击行为,只研究技术型入侵的防护。

探讨或者实践信息安全,应以“不可信”为前提,也就是说不能假设服务器的外部环境是可靠的,这是绝大多数信息安全从业人员都忽视的一个必须前提。而信息安全的所有细分领域,不论是密码学、网络安全、操作系统安全、物理安全等等等等,都是为了一个目标服务:数据完整性。完整性需要数据不被非法获取、非法篡改等。

 

先说一下外部环境,这是个很尴尬的话题,因为大多数时候,我们都无法确保外部环境的绝对可信。成本最低的人也就买个空间,好些的搞个VPS/云服务器,上了一点规模的就来个独服,真到了整机柜或者成百上千台服务器的时候,其实也还是一样:外部环境是不可控的。所以这里只能简略的说一下。对于独服或者机柜这样的用户而言,应该要求机房给做一个物理隔离或者vlan,这样可以确保ssh/远程桌面或者其他的传输数据不被嗅探,也就大概率的越过了直接丢密码的惨况。至于你自己计算机的安全情况,这个千差万别的,自己搞定吧,但至少别用360什么的垃圾软件,他本身就是个大后门。

从底层说起吧,首先说网络层的包/端口过滤。系统自身带的防火墙就是效率最高的,千万别听网络上的人云亦云瞎B吹,任何第三方软件或者以“用户态”运行的进程都绝不可能超过自带防火墙的效率。对于windows,建议使用白名单策略,也就是“仅允许”;对于linux/unix,建议使用黑名单策略,也就是“仅拒绝”。通过这一步,可以将对外通讯限定在可控范围内。外部环境和网络层做不好,可能会面对的窘境:当你刚刚安装好系统,登录进去,你发现已经有后门进程在忙活,或者已经中毒了,很尴尬,也很无奈,我今年就遇到过两次,有一次还是vultr的,因为我是用镜像直接还原的,所以可以证实vultr的vlan或者物理隔离是不行的,至少是有缺陷的,重新还原一次并且立马先把网卡禁了,才避开这个病毒。另一次我不确定是不是服务商的安装盘有问题,反正他交给我的时候就已经有后门了,我懒得折腾,直接iptables做一个丢包处理了。

然后说说操作系统。我个人从2005年开始是从不更新系统的,从2006年开始从不在服务器上装杀毒,因为这两个都会导致系统效率显著降低,但只针对于windows而言;对linux来讲,必须更新,因为linux及附加软件的漏洞特多,不更新就等同于做死。还要有足够好的操作习惯,像官网下载的php、mysql这类软件自然不用去测试什么,但其他的必须在客户端先扫毒,确定没问题了再搞到服务器上面去。同时尽可能别在服务器上面做一些不必须的事情,我曾见到有人直接在服务器上面装visual studio写代码,看的我目瞪口呆……

 

上面都是外部环境,下面正文了。

 

作为web服务器,提供web是必须的,一般来说还会提供ftp,所以顺带说了。

web+ftp的组合,决定了这个服务器有一个可写环境,同时还有一个脚本执行环境,那么在比较糟糕的情况下,黑客是可以获取一个shell运行环境的,如果web服务器的权限控制没到位,就很方便的越权得到最高权限了。对于管理员而言,如果连系统控制权都保不住,可以下岗了。

为了阻止这种情况呢,我们延续上面篇幅的思路:基于不可信环境。因为ftp的密码是明文传输的(也可以加密,但很少有人这么干),所以我们可以假设对方已经获取了ftp密码,于是也就得到了shell环境,那么在这个情况下,双方交火的地方在web站点。在对方获取shell以后呢,最大权限就是apache给这个站点的suexec身份(这是个插件,需要每个站点单独设置),这个身份一般来说也做不了什么有害的事情甚至根本就干不了什么,所以没多大关系。对于windows而言呢,其实也类似,甚至更方便,但是有一些细节。windows在2003系统开始,站点的运行身份是网站自身+程序池两个,一般的主机管理系统都搞定了站点身份,但一般都没搞定程序池身份,因为这个身份的设置需要对系统目录很熟悉,并且需要对.net有深入了解(哪怕你用的不是.net程序)。如果是我们自己用的服务器,最佳做法是每个站点独立程序池,其运行身份与站点一致,同时需要给这个账户访问几个特殊目录的权限,因系统不同有所差异,细节不多说了,可以自行测试。

好了,站点的说完了,来说web服务器自身。假设站点的权限被突破或者根本就没有防护(linux上很容易犯这个错,windows默认既是低权限),那么战线就后撤至web服务器自身了。linux的很多程序都有setuid,但更多程序是没有的;windows则可以很方便的设置这个。默认情况下呢,iis的站点是依托于程序池身份的,所以实际上每个程序池是独立身份+独立进程;而apache是所有进程同一身份,所以假设站点被做掉了,那么在windows上来说,对方获取的依然是有限权限,而linux+apache的话则已经构成事实上的越权了。于是可能很多买空间的都遇到这个情况:web程序明显没有任何问题,但还是给人篡改了网站内容,也许问题并不在你的站点,但你变为池鱼了。因本文讨论的是web服务器安全,所以这种买空间的用户并不在本文讨论范围,不扯了。

在没有正确处理的情况下,一旦web服务器被突破,则操作系统控制权会直接丢失,也就没有后话了,所以这里是我们的底限。因为iis的运行原理所致,所以只要不将程序池设为“system”或者管理员组的身份,则不论怎样都不会丢掉控制权,即便网站出了问题,至少我们还能从容面对。对于apache而言,必须设置uid和gid,而且必须限制这个用户的权限。在debian和ubuntu上,apt安装的apache默认既是低权限,其他系统不熟;在所有linux系统上,编译安装的apache必须要手工创建账户并且明确指定uid和gid,否则默认既是root。

 

深究一下站点内的处理细节。

大多数网站都可以上传附件,这算是个常规功能了。对于这样的网站,最简单的做法是在web服务器和文件系统将所有“非附件目录”设置为只读+可执行+不可写;将附件目录设置为可读写+不可执行。通过这样做呢,假设下面的几种情况:

1,web程序有问题,被人利用了并且得到shell。这种情况其实对方什么都做不了,甚至连网站内容都改不了,顶多往附件目录传几个“web木马”,但是这个“web木马”还没法执行,最终他自己滚蛋了。

2,ftp账号被人拿到了。和上面情况一样,其实还是做不了什么。

 

总之,对于站点来说,可写的地方不可执行,可执行的地方不可写,确保这个前提就足够搞定绝大多数“黑客”了。

 

本文仅仅探讨web服务器的安全问题,回头看来,仍有太多内容没有提及,像跨目录窃取数据等这类行为,因为已经被本文的做法彻底堵死了,所以很多东西倒是不必再提。重要的是思路,能领会本文思路,则像我一样连更新系统都不必的,根本没那个必要。即便系统或者某个程序有漏洞,但漏洞的使用也是需要前提的,本文的思路可以消灭前提,所以不必操心漏洞问题,一切皆在掌控之中。

 

作者 听涛

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注