浅谈web服务器安全

刚入linux这行的时候,我心思都在服务器性能方面。在从事了两份工作后发现,一些小站就十几二十台服务器,管理方便,技术选择性多,性能是少量资金投入就可以解决的问题。安全方面知识我知之甚少,现在来看这些小站普遍的问题是安全意识薄弱,遭受过不同程度上的攻击。现在的公司就是如此,网站被挂马,服务器上的所有站都被篡改,在我接手后还没有有效的应对措施,自己也在不断摸索,目前有了一些小进展,并且发现了一些开源工具,来说说我的思路。

目前总结了以下5点我所遇到的安全问题:

  1. 操作系统安全
  2. 程序隐含漏洞
  3. 虚拟主机隔离
  4. 文件被窜改
  5. 对外ftp安全

操作系统安全。如果网站存在未知漏洞,攻击事件发生,很难评估服务器被破坏的程度。面临的可能就是迁移,然后重做系统,再迁移,过程是多么的痛苦。要找到一个方法,在服务器被攻击后,保证系统还是安全的。

都是人,难免犯错,程序可能天生就有漏洞,例如 SQLI、XSS,连csdn dropbox 的用户信息都泄漏了,你怎么能保证自己的站没有呢。

虚拟主机隔离。这条的目的是比较明确的,就是为了防止在一个站点被攻下后,其他站点的文件也可能被修改,导致姊妹站点被无辜感染。

文件被窜改。进一步分析,网站被挂马肯定要修改网站文件,当察觉到网站被黑时,可能已经有N多用户糟了黑手。而且无法确定漏洞位置,只能一点点审阅代码,分析web 日志。因此需要在文件被篡改后第一时间发现,并恢复文件,然后根据日志查找漏洞,评估被攻击程度,再做进一步处理。

对外ftp安全。一台服务器上有N多个站是很常见的,在我们公司还存在这样一个特殊情况,服务器是代为客户维护的,服务器上大多是由我们来做的项目,可是也有其它公司做的项目,项目上线时,必然要经过我们,没钱拿还干活谁也不乐意,只能给他们开放ftp让他们自己进行上线,但这些人把服务器当成了他们的私人空间用,导致服务器出现各种不稳定情况。需要通过一些手段提供出有力证据,指出他们的不良行为,洗掉自己脸上的黑。

分析了具体问题,接下来就是逐个解决了。

1.chroot

玩过LFS的一定知道 chroot了, Linux目录结构是以 根 / 开始的,chroot 就是将文件系统上的一个特定目录作为当前系统的 / 目录。之后所做的任务操作都不会突破这个虚拟的 / 目录。web层面遭到攻击后取得的权限是apache 运行用户的权限,驱动 web 服务的是apache 和 php,那么把 apache 和php 封禁在这样一个chroot jail 中,真实系统是很难再遭到破坏。这样即使黑客成功的获得了root权限,放上了后门,我们的处理步骤只是换一个目录作为虚拟的 / 目录,删除旧目录,系统层面的处理工作基础就完毕了。

debian下构建一个chroot环境是很方便的,直接使用debootstrap命令。系统文件下载完后,chroot 进该目录直接安装配置apache 和 php 环境,最后 真实系统上 mount bind sys、proc 目录到该chroot环境下,chroot 环境中的apache就可以正常启动了。

2.mod security or naxsi (for nginx)

程序的漏洞大多时候只能等到被利用了才能被发觉,甚至都不能被发现。modsecurity则是一个强大的apache安全模块,具有很大的“杀伤力”,所以要根据明显的攻击特证从core rule set 中选出一些较严谨的策略,放到正式环境下以DetectionOnly 模式测试,经过一段时间的测试,如果日志里没有记录正常的应用被拦截,那说明这些规则是适用的。笔者选了“Mysql Injectioin 、XSS、General Injectioin”方面的规则,其中General Injectioin 包括php代码注入,系统目录访问。正是使用了modsecurity ,配合第4部分的功能成功及时找到后门并删除了后门。mysql injection 主要防范的规则是 mysql 中的关健字如果规则的出现了3个或3个以上就认为是sql注入,一般情况下不会这么巧的。XSS 方面主要是过滤 javascript 中主要的一些事件如onclick ,还有<script> 之类的字符,这些也不应该出现在用户的输入内容中。当然有开发部门配合,合理规范参数传递的方式,这样 modseucrity 的策略才能足够的精准。另外就是对于后台,可能需要比较宽泛的规则,比如后台允许使用<script> 之类的html,这样可以使用apache Location 匹配后台url并在其中关闭modsecurity。因为modsecurity还在进化,所以建议使用2.6 以上版本,老版中很多功能不支持。

naxsi 目前没有试用,所以就不多说了。

3.apache itk

linux自身提供了很强的权限系统,最简单的方法就是使用这个系统实现不同站点之间的权限划分,但apache所有进程往往都是运行在同一用户下,这也就是问题的根源,于是有了apache itk,在debian 里包名叫做apache2-mpm-itk 。和prefork 和 worker 一样是一个mpm(多路处理器),实际上itk 是基于prefork的,为每个虚拟主机prefork出来的子进程可以以不同的用户身份运行。apache UMASK变量设置为027,对应ftp的Umask 也设置为027,这样程序生成或后上传的文件也只能被本站点所属用户修改,只能被同组人查看,实现了隔离的较果。

4.md5sum

hash是文件的唯一特征码,一旦文件被修改hash值就会不一样。我通过几个脚本实现了hash值的生成和检查,发现变更邮件通知。这样做有个麻烦就是,开发人员每天都会更新代码,所以就有一部分时间是去检查文件是不是被正常修改的,然后重新生成文件hash。当然随后对这部分流程进行了自动化,开发人员都是通过ftp上传文件,脚本在发现文件hash值变更后检查 ftp 日志,如果在检查变更的周期时间内,ftp 日志中有该文件的上传记录则自动更正该文件的hash值不发送邮件报警。目前这些功能是用bash实现的,在一些特殊情况下会有bug。之后的想法是,分析ftp log并入库,然后通过python 从数据库中取数据分析。

另外最近有个项目叫做 falcon 通过inotify-tool 监控网站 目录文件变更事件,文件有变更则执行扫描,如果被认定为是后门程序则自动删除。目前版本为0.1,没有试用,期待功能的完善。

5.ftp日志分析

能过脚本分析ftp日志, 并按照 who when what 的形式插入数据库,也就是谁什么时候登陆的进行了哪些文件操作。公司开发人员的ftp帐号限制了登陆ip,只能通过公司ip登陆。开放给其他公司开发人员的帐号没有限制,对这些帐号,每周做一次汇总,检查有没有不规范的文件上传,如果有邮件通知,并警告相关责任人。

 

这样基本达到了服务器安全目的,日后还会不断的改进,通过web页面展现出所有功能,并把开发人员上线代码部分放进来,实现安全审核。

发表评论

电子邮件地址不会被公开。 必填项已用*标注


Verify Code   If you cannot see the CheckCode image,please refresh the page again!