【IT168 服务器学院】现在我们安装mod-security,debian下同样很简单,并且自动把模块加到httpd.conf里
[root@debian /]apt-get install libapache-mod-security
默认这个模块是没激活的,编辑一下httpd.conf文件并去掉下面这行的注释
LoadModule security_module /usr/lib/apache/1.3/mod_security.so
接着在httpd.conf的末尾加上
# 打开或者关闭过滤引擎
SecFilterEngine On
# 设置缺省的动作
SecFilterDefaultAction "deny,log,status:404"
# 把设置传递给字目录
SecFilterInheritance Off
# 检测URL编码是否正确
SecFilterCheckURLEncoding On
# 检测内容长度以避免堆溢出攻击
SecFilterForceByteRange 32 126
# 日志文件的位置和名字
SecAuditLog logs/audit_log
# debug设置
SecFilterDebugLog logs/modsec_debug_log
SecFilterDebugLevel 0
# 检测POST数据
SecFilterScanPOST On
# 当匹配sh的时候,重新定向到一个特殊的页面,让攻击者知难而退
SecFilter sh redirect:http://secu.zzu.edu.cn/hack/fu.htm
# Only check the body of the POST request
#过滤一些敏感的东西,我们使用*是为了攻击者使用/etc/./passwd来绕开检测
SecFilter /etc/*passwd
SecFilter /bin/*sh
# 防止double dot攻击,也就是类似http://www.test.com/openfile.php?path=/../../..,虽然这个漏洞看似弱智,但是很多网站都有的,比如CERNET某大学某图片站:)
SecFilter "../"
# 防止跨站脚本(CSS)攻击
SecFilter "<( | )*script"
SecFilter "<(.| )+>"
# 防止SQL插入(SQL Injection)攻击
SecFilter "delete(空格| )+from"
SecFilter "insert(空格| )+into"
SecFilter "select(空格| )+from"
SecFilter "union(空格| )+from"
# 下面是限制了upload.php文件只能用来上传jpeg.bmp和gif的图片
SecFilterInheritance Off
SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"
用好了mod-security,可以使你的网站的安全性大大的提高的,在他带的manual里你可以找到更多的设置的,在光盘中附带了更加详细的规则
(mod-security.rule.txt)
order allow,deny
allow from 211.43.125.63(你的IP)
deny from all
Options All
下面重头戏到了,chroot,非常重要的一步,但可能还是比较简单的一步,先把几个python写的配置文件复制到/etc/makejail下
[root@debian /etc/makejail]cp /usr/share/doc/makejail/examples/apache.py ./
然后编辑apache.py文件添加修改相应的信息
users=["chrapax"]
groups=["chrapax"]
packages=["apache","apache-common","php4","php4-gd","mysql-common","libapache-mod-security"]
然后执行makejail命令
[root@debian /etc/makejail]makejail apache.py
完成之后,我们得先做个软连接并把chrapax从passwd和group文件分离出来
[root@debian /etc/makejail]ln -s /var/chroot/apache /apache
[root@debian /etc/makejail]grep chrapax /etc/passwd > /apache/etc/passwd
[root@debian /etc/makejail]grep chrapax /etc/group > /apache/etc/group
[root@debian /etc/makejail]cp /etc/mime.types /apache/etc/
然后在/etc/init.d里建一个叫chrapax的文件并让他可执行,内容详见光盘中的chrapax
[root@debian /etc/makejail]cat > /etc/init.d/chrapax
[root@debian /etc/makejail]chmod +x /etc/init.d/chrapax
接着使用rcconf命令让他在系统启动的时候启动(如图rcconf.bmp)
[root@debian /etc/makejail]rcconf
启动chroot的apache
[root@debian /etc/makejail]/etc/init.d/chrapax start
先测试一下php和mysql连接是否有问题
[root@debian /etc/makejail]cat > /apache/var/www/mysql.php
$conn = mysql_connect("localhost", "fatb", "urpassword")
or die;
print "php can work with mysql now";
mysql_close($conn);
phpinfo();
结果浏览器返回
Warning: Can''t connect to local MySQL server through socket ''/var/run/mysqld/mysqld.sock'' (2) in /var/www/mysql.php on line 2
但是我们可以看到在/var/run/mysqld/下的确有mysqld.sock文件,其实就是因为我们已经chroot apache了,他只能访问apache root jail里的东西,也就是/var/chroot/apache下面的东西,而mysqld.sock明显在jail外面,所以连接不上当然是很正常的了,解决这个问题的方法也很简单,做个硬连接就是了
[root@debian /apache/var/run/mysqld]ln /var/run/mysqld/mysqld.sock mysqld.sock
再访问一下mysql.php看看,果然OK了吧(如图ok.bmp)
做硬连接很麻烦,而且在访问mysqld的时候导致apache用资源好厉害,解决的办法就是在mysqld的配置文件里加上bind-address 127.0.0.1这样就通过tcp连接而不是通过socket连接了
经过我们这样一弄,整个LAMP服务器就安全的多了,就算万一php程序编写的不安全或者apache,php出了什么漏洞,想入侵进来并且跳出root jail还是非常困难的
参考:
security apache step by step
security php step by step
security mysql step by step
(不知道为什么在家里上网搜索不到这三个文章了,在www.securityfosuc.com的,有兴趣的可以去看看)
mod-security manual
san的php安全配置
http://www.xfocus.net/articles/200111/304.html
版本信息
v1@2003.11 初始版
v2@2004.1 解决chroot后php程序连接mysql的时候apache耗用大量资源的问题
修正ustc.edu.cn为电子科大而不是中科大:)
v3@2004.9 增加allow_url_fopen = Off
增加mod-security对sql injection的过滤