<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/tips/2866

                    0x00 背景


                    眾所周知,虛擬主機的安全不好做,特別是防止跨目錄成為了重點。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都要讀取這個文件,所以權限分配是要考慮的重要一項。

                    2014082402315954182.png

                    防御跨站要防御的有三點,第一是防止其他用戶列網站目錄,防止自己的一些敏感文件名被看到及訪問;第二是防止其他用戶讀取自己的文件,防止配置信息泄露;第三就是防止其他用戶寫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一鍵安裝包")。

                    0x01 lNMP加固


                    比如我們服務器上有兩個虛擬主機game01.com和game02.com,其目錄分別是 /home/wwwroot/game01/和/home/wwwroot/game02/。

                    這里說一下,新版的lnmp一鍵安裝包有自帶的防跨站功能,是因為php 5.3.3以后,可以在php.ini末尾加上類似如下語句:

                    [HOST=www.vpser.net] 
                    open_basedir=/home/wwwroot/www.vpser.net/:/tmp/ 
                    [PATH=/home/wwwroot/www.vpser.net] 
                    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文件

                    cd /usr/local/php5/var/run
                    touch php-fpm-game01.pid
                    touch php-fpm-game02.pid ? 
                    

                    二、為每個站點創建php-fpm.conf文件

                    cd /usr/local/php5/etc/ 
                    cp php-fpm.conf php-fpm-game01.conf 
                    cp php-fpm.conf php-fpm-game02.conf ? ??
                    

                    三、為每個站點建立php-cgi.sock文件

                    touch /tmp/php-cgi-game01.sock #建立php-cgi.sock文件 
                    chown www.www /tmp/php-cgi-game01.sock #設置文件所有者為www(必須與nginx的用戶一致) 
                    touch /tmp/php-cgi-game02.sock 
                    chown www.www /tmp/php-cgi-game02.sock ? 
                    

                    四、修改相關文件

                    vi /usr/local/php5/etc/php-fpm-game01.conf 
                    pid = run/php-fpm-game01.pid 
                    listen =/tmp/php-cgi-game01.sock; 
                    
                    vi /usr/local/php5/etc/php-fpm-game02.conf
                    pid = run/php-fpm-game02.pid
                    listen =/tmp/php-cgi-game02.sock; 
                    
                    vi /etc/init.d/php-fpm 
                    vhost=$2 
                    php_fpm_CONF=${prefix}/etc/php-fpm-$vhost.conf 
                    php_fpm_PID=${prefix}/var/run/php-fpm-$vhost.pid 
                    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)。

                    繼續修改

                    vi /usr/local/nginx/conf/vhost/game01.com.conf # 配置文件名可能不一樣,要根據實際情況改變
                    fastcgi_pass unix:/tmp/php-cgi-game01.sock;
                    vi /usr/local/nginx/conf/vhost/game02.com.conf 
                    fastcgi_pass unix:/tmp/php-cgi-game02.sock;
                    

                    五.增加開機啟動項

                    vi /home/start.sh
                    # !/bin/bash
                    auto=$1 /bin/bash /etc/rc.d/init.d/php-fpm $auto game01 /bin/bash /etc/rc.d/init.d/php-fpm $auto game02
                    chmod +x /home/start.sh
                    

                    然后編輯/etc/rc.local 將start.sh加入啟動項。 到此,不同虛擬主機就會以運行不同的php-fpm。我們還需要用不同的用戶身份來運行。

                    groupadd game01 groupadd game02 
                    useradd game01 -M -s /sbin/nologin -g game01 
                    useradd game02 -M -s /sbin/nologin -g game02 ? ? 
                    

                    添加了game01.game01和game02.game02兩個用戶。 修改/usr/local/php/etc/php-fpm-game01.conf:

                    listen.owner = game01
                    listen.group = game01 
                    user=game01 
                    group=game01 ? ? 
                    

                    game02同理修改。這樣我們就讓php-fpm以不同用戶來運行了。

                    再來到/home/wwwroot/:

                    cd /home/wwwroot/ 
                    chown game01.game01 -R game01 
                    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中允許把一個用戶加入多個組,所以操作如下:

                    usermod -aG game01 www 
                    usermod -aG game02 www
                    

                    這時候。我們的防御其實有兩層。

                    01.不同php-fpm運行兩個虛擬主機的php程序,他們擁有自己的open_basedir,使之不能跨目錄。

                    02.即使open_basedir被繞過了,以game01用戶身份運行的php-fpm也無法寫入、讀取game02的文件,因為game02的所有文件權限都是750。其他用戶沒有任何權限(0)。

                    一切設置好以后,說一下使用方法了。

                    0x02 使用方法


                    先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
                    

                    以上是我拼湊的一點方法,可能并不是最佳方法(我對nginx機制也是不熟悉,也許有更簡單的方法可以解決這個問題),所以也希望各大牛能分享自己運維的方法,指出我的不足

                    0x03 參考:


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

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

                    http://yzs.me/2198.html

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频