辉克's Blog

创造机会的人是勇者;等待机会的人是愚者

Nginx多站点防止跨目录浏览

Nginx跨站攻击很让人头疼,在多个网站运行的主机上如果攻破其中一个上传了类似webshell之类的木马程序后可以轻松浏览到相邻别的网站程序目录,由于nginx是后端FCGI程序处理php,统一设置open_basedir后会导致访问出现问题,只能通过每站分别处理的方式来设置。当然还有通过修改PHP程序等方式实现,贴上一个我目前正在使用的方法。
这种方式最好把网站集中到一个目录下,另外网站目录名字最好规范统一方便辨认。否则启动和维护起来非常麻烦容易混淆。
第一步修改php-fpm配置文件,为每个站点单独建立一个配置文件,
cd /usr/loca/php/etc/
cp php-fpm.conf php-fpm-www.zhaoyi.info.conf
修改其中
Pid file
<value name="pid_file">/usr/local/webserver/php/logs/php-fpm-www.zhaoyi.info.pid</value>
Error log file
<value name="error_log">/usr/local/webserver/php/logs/php-fpm-ww.zhaoyi.info.log</value>
以及
<value name="listen_address">/tmp/php-cgi-站点目录名.sock</value> 若使用TCP端口传输方式每个都使用单独的端口
<value name="max_children">4</value> 此处可根据主机情况来,配置点的就不需要开多了

第二步修改php-fpm启动脚本
cd /usr/local/php/sbin
# vim /usr/local/sbin/php-fpm
vhost=$2 ###
php_fpm_BIN=/usr/local/bin/php-cgi
php_fpm_CONF=/usr/local/etc/php-fpm-$vhost.conf ##
php_fpm_PID=/usr/local/logs/php-fpm-$vhost.pid ###
#php_opts=”–fpm-config $php_fpm_CONF”
php_opts="-d open_basedir=/www/$vhost/ –fpm-config $php_fpm_CONF" #此处为网站目录
启动方式为php-fpm start www.zhaoyi.info 多个虚拟主机以此类推
第三步修改网站conf配置文件中
fastcgi_pass unix:/tmp/php-cgi-www.zhaoyi.info.sock; 要与php-fpm配置中的对应,tcp方式的启单独端口
OK,测试一下
/usr/local/php/sbin/php-fpm stop
/usr/local/php/sbin/php-fpm start www.zhaoyi.info
ps -ef | grep php中可以看到open_basedir=/www/www.zhaoyi.info就成功了
reload一下nginx的配置文件基本就可以实现各个主机隔离了。我用phpspy2010测试已经访问不到别的目录了
nginx配置文件最好也采用每个网站单独一个的方式统一放在vhosts下
为了方便启动php-fpm可以写个脚本一起启动
#!/bin/bash
auto=$1
/bin/bash /usr/local/webserver/php/sbin/php-fpm $auto www.zhaoyi.info &&
/bin/bash /usr/local/webserver/php/sbin/php-fpm $auto www.xx.com &&
/bin/bash /usr/local/webserver/php/sbin/php-fpm $auto www.xxxx.com
保存为start.sh
开启sh start.sh start
关闭sh start.sh stop
在放入/etc/rc.local中开机启动

,

发表回复