手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>操作系统>Linux>列表

打造Linux下超级安全的LAMP服务器

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

这行的注释去掉,因为我们需要PHP支持
把AddType application/x-httpd-php .php
最后把多余的Alias,Directory,Location都去掉,保存退出
OK,apache算是配置完毕,我比较喜欢干净的配置文件,下面的命令可以去掉httpd.conf里#打头的行
[root@debian /]mv httpd.conf httpd.conf.bak
[root@debian /]grep -v '#' httpd.conf.bak > httpd.conf
到此为止,apache配置文件编辑完毕

接着我们开始加固php,我们打开php.ini
[root@debian /]vi /etc/php4/apache/php.ini
首先打开安全模式,打开他的好处就是PHP文件只能访问所有者和PHP文件所有着一样的文件,即使在chroot环境下也无法访问jail中属主不一样的文件,类似于php shell这样的后门就没用武之地了哦,phpshell是很流行的php后门,他可以执行系统命令,就象他的名字一样,和shell很接近(如图phpshell.jpg)
safe_mode = On

如果php程序没有指明需要register_globals的话,最好把register_globals设置为Off,这样可以避免很多安全问题的
举个例子吧,我们有一个这样的PHP文件片段叫做test.php

// 前面的代码
if ($authorised) {
// 执行一些受保护的动作
}
// 其余的代码
}
?>
如果register_globle是打开的话,入侵者可以通过提交这样一个请求来绕过验证
http://www.test.com/test.php?authorised=1
当然,如果你非得使用register_globle的话,我们在后面同样可以使用mod-security来限制一下的

open_basedir =/var/www/
上面的设置就限制了fopen(), file()等函数可以操作的目录范围,避免了入侵者非法读取文件,一定要在/var/www后面加"/",否则/var/wwww下的文件也能被访问

禁止使用phpinfo和get_cfg_var函数,这样可以避免泄露服务信息
disable_functions = phpinfo,get_cfg_var
如果我们使用了被禁止使用的phpinfo函数的话,我们可以看到这样的错误

Warning: phpinfo() has been disabled for security reasons in /var/www/info.php on line 1


设置php程序错误日志,这样我们可以很清楚的知道程序问题所在
error_reporting = E_ALL
log_errors = On
error_log = /var/log/php_err.log


默认display_error是打开的,我们在jail没弄好之前还是打开他,或许出错信息可以给我们一点提示的,但是在完工之后记得关闭这个选项啊,因为他显示出的一些出错信息有可能会暴露你的物理路径的。
在这个过程中,最需要注意的就是不能使用root做为php程序的属主,否则php程序就可以随意访问他的属主,也就是root所有的文件了,这样就完全失去了safe_mode的意义了

禁止打开远程地址,记得最近出的php include的那个漏洞吗?就是在一个php程序中include了变量,那么入侵者就可以利用这个控制服务器在本地执行远程的一个php程序,例如phpshell,所以我们关闭这个
allow_url_fopen = Off


OK,保存退出
到此为止,针对php的安全优化基本上完毕,下面我们开始给mysql"做手脚"吧

Debian下用apt装的mysql默认已经禁止从网络连接mysql了的,我们可以从他的配置文件my.cnf里看出来,但是得注意一下,RedHat的RPM,FreeBSD的ports安装,skip-networking是注释掉了的,也就是监听3306端口了,要是mysql出了什么问题,别人就可以有机会利用了
[root@debian /]grep net /etc/mysql/my.cnf
# The skip-networkin option will no longer be set via debconf menu.
# You have to manually change it if you want networking i.e. the server
skip-networking
在这个方面Debian做的不错,但是Debian和Freebsd下系统装的mysqld是动态链接的,而RedHat的RPM安装的就是静态的,我们可以通过下面的命令来查看
[root@debian ~]file `which mysqld`
/usr/sbin/mysqld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), stripped
我们可以看到"dynamically linked"字样,这样在chroot mysql的时候就比较麻烦了,因为要复制很多的共享库,不过在debian下我们有makejail:)等会我们就可以看到他的威力了

接着我们修改mysql数据库里的东西,不过不管怎么样,我们首先得给mysql设置一个密码并修改管理员用户名(默认是root),但一定得记得,无论怎么样修改密码,都会有记录的,如果通过mysqladmin修改,shell的历史记录会有的,如果登陆了mysql之后再修改,在~/.mysql_history会记录的,所以我们一定得处理这两个历史记录文件,我们把他们删了,再从/dev/null做个软连接过来就可以解决问题了
[root@debian /]cd ~
[root@debian ~]ll
total 13K
-rw------- 1 root root 1.8K Sep 28 21:05 .bash_history
-rw------- 1 root root 14 Sep 29 09:29 .mysql_history
我们可以看到这两个文件里面都记录了东西的,下面我们处理他们
[root@debian ~]rm .bash_history
[root@debian ~]rm .mysql_history
[root@debian ~]ln -s /dev/null .bash_history
[root@debian ~]ln -s /dev/null .mysql_history
我们再看看
[root@debian ~][root@debian ~]ll
total 10K
lrwxrwxrwx 1 root root 9 Sep 29 09:29 .bash_history -> /dev/null
lrwxrwxrwx 1 root root 9 Sep 29 09:29 .mysql_history -> /dev/null
现在可以放心的设置密码了
[root@debian ~]mysqladmin -u root password mypasswd
这样我们以后root就得通过"mypasswd"这个密码来访问mysql数据库了

然后我们删除多余的数据库并去掉匿名帐号
[root@debian ~]mysql -u root -p
Enter password:XXXXXX

mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="localhost" and user="root");
mysql> flush privileges;

然后修改默认的管理员帐号root为你喜欢的,我这里改成fatb

mysql> update user set user="fatb" where user="root";
mysql> flush privileges;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!