【IT168 专稿】开源开发工具组合LAMP已经逐渐被众多开发者所使用,尽管它有自己的很多优点,其安全问题却不容轻视。本文将介绍其存在的安全问题,并给出一些安全建议。
Apache HTTP服务器本身具有很高的安全性,至少当它运行在Linux或任何合适的Unix类型操作系统上的时候是如此的。不过,普通的传统静态只读Web站点时代已经过去了;现在我们见到的更多的网站是LAMP支持下的动态Web网站,所谓LAMP,即指Linux操作系统、Apache/Lighttpd Web服务器、MySQL/PostgreSQL/SQLite数据库和Python/PHP/Ruby语言。
就我而言,我还是喜欢普通的静态网页时代,尽管从浏览器兼容性和站点质量上,使用它们的时候存在很多不确定因素,但是至少它们不会因为运行臃肿、低效和充满错误的脚本而拖慢甚至锁定我的整个系统。
OK,有些跑题了,因为这篇文章的主题是如何针对LAMP开发采取合适的安全措施。由于诸如像集成开发环境XAMMP和Ubuntu等Linux版本的存在,以及PHP脚本语言的流行,现在人们在一个周末的时间内,就可以很轻松的安装好一个LAMP组合开发工具,并在其上搭建起一个动态Web站点。但是,这种简单性不一定就是一件好事。我不喜欢在别人的地盘上炫耀,但是所有想在Web编程上精通的朋友,需要花费时间和精力来深入了解他们的LAMP组合开发工具。
任何暴露在互联网上的服务器需要对安全问题特别注意,对于动态Web服务器来说,由于其复杂性这一点显得更加突出。间接破坏的风险是非常高的。今天很多有组织的计算机犯罪一般利用计算机系统的漏洞,恶意软件正是欺骗、欺诈和盗窃等破坏行为的入口之一。它们一般不会攻入你的系统来伤害它们,而是悄悄的盗窃数据并把它们发送到全球范围内的僵尸网络中。
一、PHP安全问题严重
PHP超文本标记语言是导致LAMP不安全的主犯。相对很多主流编程语言,它还比较年轻,它诞生于1997年,依然在向前发展中。PHP所存在的问题主要是三方面:与生俱来的设计缺陷、缺乏经验的程序员和从不打补丁或升级PHP的缺乏维护网站。
当你了解了PHP底层的东西后,你会发现它不是一个非常严谨的语言,其中充满了混乱和矛盾。命名约定、语法和大小写敏感全不一致。它的内置功能中有许多是多余的,实现着非常相似但不完全相同的任务,而且它在文档化方面又做的相当差,因此很多人不确定哪一个功能是实现什么操作。如果不了解其令人痛苦的详细信息,很容易导致程序员在编程中犯错。
PHP看似非常容易学习。从一方面来讲它的确如此;你可以在几个小时以内就学会如何搭建起一个动态网站。但是要真正理解它的不安全因素潜伏的地方以及如何处理它们,可能要花费你数年的时间。其中最常见的安全漏洞之一就是未经验证的输入问题——所有的用户输入应该是不被信任的,但是PHP在这方面没有多少工具来帮助实现这个操作,因此你不得不编写自己的验证程序。
当你通过使用Apache的mod_php来将PHP作为一个模块运行的时候,PHP会继承Apache进程的所有信任。因此,所有可以被Apache读写的事情同样也可以被PHP读写,这意味着一个成功的PHP漏洞会直接被引入到Apache和所有相关的程序中。在一个只有少数用户的简单站点上使用mod_php是没有问题的,但是在一个具有多个用户的共享系统中,它就是带来破坏的导火索,因为所有的脚本运行在相同的Apache用户下。一个可行的选择是在suEXEC或CGIWrap下运行PHP。这些情况同样适用于诸如Perl、Python和Ruby等脚本语言。
现在还有众多网站依然运行在PHP3和PHP4之上,而且有更多的从来没有应用一个补丁修复或安全更新。PHP5在2004年发布,而PHP3则要回溯到1998年。是的,这是一种非常愚蠢和危险的事情,但是,更新到新PHP版本几乎意味着要进行大量的代码重写工作。更有趣的是Apache、PHP和MySQL的版本兼容问题,你必须选择同时选择正确的可以互相兼容的版本,否则它们没法一起配合使用。有一些方法可以实现轻松的全新安装,诸如XAMMP和Ubuntu的LAMP安装包。但是有趣的是,当你尝试更新你的系统的时候,它们不能保持同步。
在我个人观点看来,你最好使用Perl、Python或Ruby语言,虽然在前端编程所花费的时间似乎要多一些,但是却会省去了很多安全和维护之忧。二、加固MySQL安全
MySQL是当前最为流行的开源数据库之一,我们可以通过一些基本步骤来加固MySQL数据库的安全性。
1、MySQL数据库只允许被同主机上的PHP使用;
2、禁止对数据库的匿名访问;
3、MySQL数据库应该在被改变了默认根目录下的环境运行,在一个虚根(chroot)环境下的特殊组和用户下运行MySQL;
4、创建一个强壮的系统管理员密码,不会被别人轻易猜到,并定期修改密码;
5、删除你不需要的所有服务,诸如示例数据库和表,以及任何测试的数据库和表。
以上只是简单的几条安全建议,著名的安全公司Security Focus具有一个非常优秀的MySQL数据库安全指南(http://www.securityfocus.com/infocus/1726)。该篇文章是一个系列文章中的一部分,同样还包括加强Apache和PHP安全性的链接。另外,MySQL参考手册(http://dev.mysql.com/doc/index.html)中也有关于安全的很好的章节。另外,安全公司Security Focus强烈推荐使用chroot安全环境。三、加固Apache服务器
客观来说,Apache Web服务器已经是一个非常安全的产品,但是即使一个好的工具也只有会合理的用它,才能发挥它的最大作用。以下是一些可以参考的建议。
1、隐藏Apache的版本号和其他敏感信息;
2、确保Apache以其自身的用户账号和组运行;
3、关闭目录浏览;
4、禁止Apache遵循符号链接;
5、关闭任何不必要的模块;
6、所有敏感的会话,诸如用户登录或任何用户输入等,都需要通过OpenSSL来进行保护。
关于加固Apache安全性的最好文章之一是:http://httpd.apache.org/docs/2.0/misc/security_tips.html。四、通过SELinux或AppArmor来加固整体安全
SELinux全称是Security Enhanced Linux,由美国国家安全部领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击。
在Fedora Linux中有一个非常好的预置SELinux策略,其中包括一个Apache策略,还有一个图形化的管理工具system-config-selinux。我不是说它使用起来非常简单,但是通过使用它比你完全手动设置要容易的多。
在Novell的企业版SUSE Linux中包含一个叫AppArmor的工具,也很值得关注。使用它,你可以为通用操作系统和应用软件预定义的策略,包括Apache Web服务器、Postfix邮件服务器、Sendmail邮件服务器、OpenSSH、squid、ntpd、nscd等,据说它比使用SELinux更加简单,关于两者谁更好一直存在争论。
总结
尽管你运行的是一个具有很好安全性的Linux或Unix操作系统,你也不能对安全问题大意。无论在哪儿总会有潜在的威胁,尤其是现在有组织的计算机犯罪已经发现了互联网的力量。基本安全常识应该坚持应用,另外你还需要相应的技巧和经验。搭建一个简单的测试实验室是非常容易且无需多少投资的,而且有很多触手可及的文档或帮助来辅助你实现这一点。Linux安全的未来在于像SELinux和AppArmor之类的工具,而不是我们已经熟悉的针对已经发现的威胁再作响应的方法(亡羊补牢式的防护),像SELinux和AppArmor之类的工具可以帮助你防护未知的安全威胁。