lnmp虚拟机安全配置研究

转自:http://www.leavesongs.com/PENETRATION/nginx-safe-dir.html

众所周知,虚拟主机的安全不好做,特别是防止跨站成为了重点。apache+php服务器防止跨站的方式比较简单,网上的所有成熟虚拟主机解决方案都是基于apache的,如directadmin、cpanel。

但如今已然不是apache的时代了,在linux+nginx+mysql+php下怎么防止不同虚拟主机进行跨站?

首先我们要清楚明白Nginx是怎么运行的,再考虑怎么具体操作吧。乌云知识库里有一篇很好的文章(http://drops.wooyun.org/tips/1323),介绍了nginx的安全配置,大家可以看看。

nginx实际上只是一个反向代理服务器,它接收到请求以后会看当前请求是否是.php文件,如果是则转交给php-fpm来处理,获得结果后再发给用户。所以有两个权限需要考虑:第一是nginx的权限,第二是php-fpm的权限。如下图,nginx和php-fpm都要读取这个文件,所以权限分配是要考虑的重要一项。

防御跨站要防御的有三点,第一是防止其他用户列网站目录,防止自己的一些敏感文件名被看到及访问;第二是防止其他用户读取自己的文件,防止配置信息泄露;第三就是防止其他用户写shell在自己目录。

php显然也考虑到了这个问题,其配置文件中的open_basedir,是一个目录列表,只允许php访问其中给出的目录。通过设置这个open_basedir我们就可以防御php读写web目录以外的文件,比如/etc/passwd之类的。

但现在的问题是,open_basedir是写在php.ini中的一个配置文件,而所有虚拟主机使用的php是同一个php,我们可以防止php访问web目录以外的文件,但是没法防止“虚拟主机1”访问“虚拟主机2”的文件,因为二者都在web目录内。甚至还有一个更大的问题是,很多版本php的open_basedir并不靠谱,能被很容易地绕过。

这是现在遇到的问题。解决方法就是:让每个虚拟主机用不同用户单独启动php-fpm

为了实现上面方法,我们需要对安装好的lnmp做些修改。(我使用的就是国内用的比较广的"lnmp一键安装包")。

比如我们服务器上有两个虚拟主机game01.com和game02.com,其目录分别是/home/wwwroot/game01/和/home/wwwroot/game02/。

这里说一下,新版的lnmp一键安装包有自带的防跨站功能,是因为php 5.3.3以后,可以在php.ini末尾加上类似如下语句:

1 [HOST=www.vpser.net]
2 open_basedir=/home/wwwroot/www.vpser.net/:/tmp/
3 [PATH=/home/wwwroot/www.vpser.net]
4 open_basedir=/home/wwwroot/www.vpser.net/:/tmp/

就可以给不同HOST赋予不同open_basedir。但是我们这里不用这个方法,第一其限制php版本在5.3.3以上,第二open_basedir也是有局限与漏洞的,不能完全依靠这个玩意。所以,虚拟主机创建好以后,来到/usr/local/php/etc/php.ini把这些内容注释掉。(注释符;)

首先,让不同虚拟机用不同php-fpm运行:

一、为每个站点创建php-fpm.pid文件

1 cd /usr/local/php5/var/run
2 touch php-fpm-game01.pid
3 touch php-fpm-game02.pid

二、为每个站点创建php-fpm.conf文件

1 cd /usr/local/php5/etc/
2 cp php-fpm.conf php-fpm-game01.conf
3 cp php-fpm.conf php-fpm-game02.conf

三、为每个站点建立php-cgi.sock文件

1 touch /tmp/php-cgi-game01.sock #建立php-cgi.sock文件
2 chown www.www /tmp/php-cgi-game01.sock #设置文件所有者为www(必须与nginx的用户一致)
3 touch /tmp/php-cgi-game02.sock
4 chown www.www /tmp/php-cgi-game02.sock

四、修改相关文件

01 vi /usr/local/php5/etc/php-fpm-game01.conf
02 pid = run/php-fpm-game01.pid
03 listen =/tmp/php-cgi-game01.sock;
04  
05 vi /usr/local/php5/etc/php-fpm-game02.conf
06 pid = run/php-fpm-game02.pid
07 listen =/tmp/php-cgi-game02.sock;
08  
09 vi /etc/init.d/php-fpm
10 vhost=$2
11 php_fpm_CONF=${prefix}/etc/php-fpm-$vhost.conf
12 php_fpm_PID=${prefix}/var/run/php-fpm-$vhost.pid
13 php_opts="-d open_basedir=/home/wwwroot/$vhost/:/tmp/ --fpm-config $php_fpm_CONF"

上述最后一行,就是php-fpm执行的参数,其中我们将open_basedir设置成了/home/wwwroot/$vhost/:/tmp/,$vhost就是我们运行时传入的第二个参数$2(game01或game02)。

继续修改

1 vi /usr/local/nginx/conf/vhost/game01.com.conf # 配置文件名可能不一样,要根据实际情况改变
2 fastcgi_pass unix:/tmp/php-cgi-game01.sock;
3  
4 vi /usr/local/nginx/conf/vhost/game02.com.conf
5 fastcgi_pass unix:/tmp/php-cgi-game02.sock;

五.增加开机启动项

vi /home/start.sh

1 #!/bin/bash
2 auto=$1
3 /bin/bash /etc/rc.d/init.d/php-fpm $auto game01
4 /bin/bash /etc/rc.d/init.d/php-fpm $auto game02

chmod +x /home/start.sh

然后编辑/etc/rc.local 将start.sh加入启动项。

到此,不同虚拟主机就会以运行不同的php-fpm。我们还需要用不同的用户身份来运行。

1 groupadd game01
2 groupadd game02
3 useradd game01 -M -s /sbin/nologin -g game01
4 useradd game02 -M -s /sbin/nologin -g game02

添加了game01.game01和game02.game02两个用户。

修改/usr/local/php/etc/php-fpm-game01.conf:

1 listen.owner = game01
2 listen.group = game01
3 user=game01
4 group=game01

game02同理修改。这样我们就让php-fpm以不同用户来运行了。

再来到/home/wwwroot/:

1 cd /home/wwwroot/
2 chown game01.game01 -R game01
3 chown game02.game02 -R game02

将game01和game02文件夹分别给予用户game01和game02。

再有,我们的nginx是默认以www用户运行的,所以是不能读取game01、game02用户文件的,如果把文件权限设置成777,又不能防止game01读取game02的文件。

所以,我们应该将www用户加入game01、game02组,再把game01、game02的文件设置成750权限,这样就可以允许www来读取game01/game02的文件(因为在同组,而组权限是5,5就够了),又能防止game01读取game02的文件。

linux中允许把一个用户加入多个组,所以操作如下:

1 usermod -aG game01 www
2 usermod -aG game02 www

执行以后我们使用“groups www”就能看到www : www game01 game02,www已经在三个用户组里了。

我们还需要将/usr/local/nginx/conf/nginx.conf里的user www www;修改成user www; 不要带用户组了。

然后我们可以放心地将game01和game02设置成750:

1 chmod 750 -R game01
2 chmod 750 -R game02

这时候。我们的防御其实有两层。

01.不同php-fpm运行两个虚拟主机的php程序,他们拥有自己的open_basedir,使之不能跨目录。

02.即使open_basedir被绕过了,以game01用户身份运行的php-fpm也无法写入、读取game02的文件,因为game02的所有文件权限都是750。其他用户没有任何权限(0)。

一切设置好以后,说一下使用方法了。

先kill掉已有的php-fpm,再重启一下nginx,再/home/start.sh启动新的php-fpm即可。

/etc/init.d/php-fpm start game01 单独启动game01

/etc/init.d/php-fpm start game02 单独启动game02

/etc/init.d/php-fpm stop game01 单独启动game01

/etc/init.d/php-fpm stop game02 单独启动game02

Referer:

http://drops.wooyun.org/tips/1323

http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0819/8389.html

http://yzs.me/2198.html

时间: 2024-08-04 19:27:43

lnmp虚拟机安全配置研究的相关文章

windows10 下访问 virtualbox 虚拟机的linux15.10/16.04 系统 及 用 putty 访问虚拟机的配置

参考: http://www.doc88.com/p-915707596190.html --- 安装samba http://my.oschina.net/u/2260265/blog/405598?fromerr=eAmxiwAB 日常工作中,常常会用虚拟机,在里面安装Server,搭建服务端环境供开发调试,这种使用场景一般都需要虚拟机能够正常访问外部网络,同时宿主机必须可以访问虚拟机.在Virtualbox中,虚拟机访问外部网络一般是使用配置起来最简单的NAT模式,但纯NAT模式下,宿主机

新手关于Linux虚拟机的配置

新手关于Linux虚拟机的配置 对于学习linux的新手来说,虚拟机的配置以及与主机之间的网络连接是非常重要的.在课堂上,也许这些配置老师都已经做好了,自己安心使用即可.但是回到家,如果不配置好的话,就无法自己练习.因为自己也是新手,深有体会,所以把自己配置虚机的方法总结出来,希望对大家有所帮助. 我自己使用的主机是redhat7.0的,因为学习的需要安装的虚拟机是redhat6.5的. 虚拟机使用的镜像:rhel-server-6.5-x86_64-dvd.iso 镜像一定要保证完整性,不然会

LNMP的基本配置

LNMP的基本配置cd /usr/local/nginx_php/etc/ > php-fpm.conf                      //清空php-fpm.conf vim php-fpm.conf [global]        pid= /usr/local/nginx_php/var/run/php-fpm.pid error_log= /usr/local/nginx_php/var/log/php-fpm.log [www] listen= /tmp/php-fcgi.

8.LNMP环境的配置

# LNMP环境的配置 参照文档:https://oneinstack.com/install/ 安装文件位置:/data/soft: ```yum -y install wget screen python #for CentOS/Redhat # apt-get -y install wget screen python #for Debian/Ubuntu wget http://aliyun-oss.linuxeye.com/oneinstack-full.tar.gz #阿里云用户下载

centOS6.0虚拟机ip配置

1.首先使用虚拟机安装好centOS6.0系统 2.虚拟机网络配置:(选择桥接模式) 3. 第一步:首先关闭防火墙 1.将防火服务从启动列表移除 #chkconfig --del iptables #chkconfig --add iptables (添加) 2.查看防火墙 #service iptables status 3.关闭防火墙 #service iptables stop 第二步:网络配置固定IP (静态IP). 网卡地址: /etc/sysconfig/network-script

CentOS虚拟机网卡配置

虚拟机与主机通信方式这里我选择--------桥接方式 我认为桥接模式方便 一.虚拟机的配置 1.在虚拟机的"编辑"里选择"虚拟网络编辑器" 2.配置虚拟网络编辑器 - 主机的网络设置为共享 二.centOS的配置 这里配置静态ip 1.使用root账号登录之后使用 ifconfig 首先查看当前的IP地址信息,主要注意网卡MAC地址,要保证当前系统正在使用的网卡MAC地址与网卡配置信息里的一致,当前系统正在使用的网卡MAC地址为:00:0C:29:D6:99:32

LINUX 虚拟机 网络配置

[NAT模式] 一.不能上网解决办法详细步骤: 1.打开虚拟机-编辑-虚拟机网络设置,系统会自动配置: 2.本地连接-属性-TCP/IP设置为自动获取: 3.打开vmnat服务和vmDHCP服务: 4.修改虚拟机本地连接-属性-TCP/IP设置为: IP:192.168.X.130 (X是多少,看你虚拟机网络配置里面最下面的的那个subnet IP地址,最后一位必须大于128小于255): 掩码:255.255.255.0 网关:192.168.X.2(X与上面相同,最后一位必须是2) DNS:

【转】Nginx安全配置研究

Nginx安全配置研究 zhangsan · 2014/03/28 10:39 0x00 测试环境 操作系统:CentOS6.5 Web服务器:Nginx1.4.6 Php版本:Php5.4.26 0x01 Nginx介绍 nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端.nginx一般是把请求发fastcgi管理进程处理,fastcgi管理进程选择cgi子进程处理结果并返回被nginx. nginx涉及到两个账户

VirtualBox 安装CentOS虚拟机网卡配置

VirtualBox虚拟机网络设置(NAT+HOST-ONLY) 目标: 虚拟机可以像宿主机一样访问互联网和其他主机 宿主机和虚拟机可以相互访问 使用NAT实现目标一 使用Host-Only实现目标二 解决方案: VirtualBox 网卡配置 NAT: HOST-ONLY 虚拟机网卡配置: 为了实现上述两套配置,我们需要为虚拟机配置两个网卡,第一个网卡采用NAT方式,第二个网卡采用Host-Only方式!下面是两个网卡的配置截图:   虚拟机操作系统配置 1.前面的步骤只相当于给虚拟机插上了两