LAMP架構(八)

一 限定某個目錄禁止解析php

對於使用PHP語言編寫的網站,有一些目錄是有需求上傳文件的,好比服務器能夠上傳圖片,而且沒有作防盜鏈,因此就會被人家當成了一個圖片存儲服務器,而且盜用帶寬流量。若是網站代碼有漏洞,讓黑客上傳了一個用PHP代碼寫的木馬,因爲網站能夠執行PHP程序,最終會讓黑客拿到服務器權限,爲了不這種狀況發生,咱們須要把能上傳文件的目錄直接禁止解析PHP代碼(不用擔憂會影響網站訪問,若這種目錄也須要解析PHP,那說明程序員不合格)php

一、編輯配置文件程序員

    在配置文件中加入如下內容shell

    <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off   //關閉php解析功能
        <filesmatch (.*)\.php(.*)>     //filesmatch這四行限定了禁止訪問.php後綴名的文件
            Order allow,deny
            deny from all
        </filesmatch>
    </Directory>
數據庫

二、從新加載配置文件apache

    # /usr/local/apache2.4/bin/apachectl -t瀏覽器

    # /usr/local/apache2.4/bin/apachectl graceful安全

三、測試驗證服務器

    # curl -x127.0.0.1:80 'http://111.com/upload/123.php' -Icurl

結果代表http://111.com/upload/123.php被禁止訪問,狀態碼403socket

    下面將filesmatch四行註釋後

    咱們再來測試

    # curl -x127.0.0.1:80 'http://111.com/upload/123.php'

能夠看出返回的結果是源代碼,也不能解析

二 限制user_agent

    需求背景:有時候,網站會受到一種攻擊,叫作cc攻擊,cc攻擊的原理是攻擊者經過軟件、肉雞等手段組織成千上萬臺服務器來同時訪問同一個網站,因爲網站帶寬不支持、數據庫承受不了等緣由致使網站崩潰,這種訪問看起來是正常的,但他們有一個規律的特色,就是user_agent是一致的,且頻率很快,可能1秒鐘訪問幾回,同時訪問的地址也是一致的;面對這種狀況,咱們能夠作一個限制,限制這個user_agent的訪問爲403

肉雞: 黑客=A  被黑客控制的機器=B  黑客經過B最終黑了的機器=C  B就是肉雞(不是「肉機」)  爲何要經過B來黑C(肉雞)呢?由於這樣C就覺得是B黑的他,(由於C只能知道B的IP地址)那麼黑客就能夠逍遙法外了

一、編輯配置文件

    在配置文件中加入如下代碼:

<IfModule mod_rewrite.c>  //此處用到了rewrite模塊

    RewriteEngine on

    RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]  //此處的OR表示這一行的條件跟下一行的條件是或的關係,若是不加OR,則默認兩者爲與的關係

    RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]  //NC表示忽略大小寫

    RewriteRule .* - [F]  //F表示forbbiden的意思

</IfModule>

二、從新加載配置文件

三、測試驗證

    # curl -x127.0.0.1:80 'http://111.com/upload/123.php'  結果提示403禁止訪問

上面兩次的訪問日誌以下

咱們自定義一個user_agent進一步測試

    # curl -A "lijie" -x127.0.0.1:80 'http://111.com/index.php' -I

或# curl -A "lijie" -x127.0.0.1:80 'http://111.com/index.php'   //其中-A 「lijie」表示指定user_agent爲lijie

咱們再來查看訪問日誌

三 php相關配置

一、如何查看php配置文件的位置

    # /usr/local/php/bin/php -i |grep -i "loaded configuration file"  //使用這個命令可能存在部分狀況下查詢結果不許確

    爲此,咱們能夠在網站目錄下寫一個查看phpinfo()的頁面,而後再瀏覽器輸入這個頁面的地址來查看php配置文件的路徑,查看結果以下:

    上圖咱們能夠看到php的配置文件在路徑/usr/local/php/etc下,但並無加載,所以咱們須要作一些操做:

    1)從模板配置文件拷貝一份到生產環境配置文件路徑下

            #  cp /usr/local/src/php-5.6.30/php.ini-production /usr/local/php/etc/php.ini
    2)從新加載apache配置文件

            # /usr/local/apache2.4/bin/apachectl graceful

    3)刷新111.com/index.php頁面

    上述兩種方式查找到php配置文件所在的路徑爲/usr/local/php/etc/php.ini

二、編輯修改配置文件

    1)disable_functions

        禁用安全函數,相關的有:

        eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close;phpinfo

    編輯以禁用跟安全有關的函數,修改前:

        修改後:

其中phpinfo也須要禁用

從新加載配置文件後,刷新以前的頁面,出現以下提示:

    上圖說明phpinfo被成功禁用

    2)date.timezone

        時區,配置文件中須要定義這個時區,有時候不定義時區會出現告警信息

    修改前:

修改後:

也能夠將時區的值設置爲Asia/Shanghai

    3)php日誌相關配置

    display_errors: 表示是否呈現錯誤信息,將其值由off修改成on後,訪問111.com就會提示錯誤信息

 

    但這樣有一個缺點是暴露了項目的目錄,所以通常默認設置爲off關閉錯誤信息顯示功能,而一旦將display_errors設置爲off的話,就還須要定義幾個錯誤日誌:

    log_errors:定義錯誤日誌是否開啓

    error_log:定義錯誤日誌的位置

    修改前:

    修改後:

error_reporting:定義錯誤日誌的級別

修改前:

其中:

E_ALL (Show all errors, warnings and notices including coding standards.)最不嚴謹

生產環境中通常使用E_ALL & ~E_NOTICE  (Show all errors, except for notices),表示顯示全部錯誤,除了警告

修改後:

保存配置並從新加載後,咱們嘗試訪問111.com/index.php,而後查看錯誤日誌的目錄,能夠看到已經生產錯誤日誌文件php_errors.log

再來查看這個文件的所屬主和所屬組,對比下面兩圖發現,httpd和php_errors.log的所屬主和所屬組是同樣的,實際上這個錯誤日誌文件是以httpd這個進程的身份去生成的

若是一直沒有生成錯誤日誌的文件,須要去查看一下錯誤日誌的目錄是否寫了權限,若是有權限,咱們能夠先手動建立好這個錯誤日誌的文件,並修改權限爲777

 

下面咱們模擬錯誤並查看錯誤日誌,寫一個帶有錯誤的文件2.php並訪問

再來查看錯誤日誌,出現下面提示:

另外還有幾個安全相關的選項:

open_basedir :打開這個選項後,能夠將服務器的各個網站單獨隔離出來,以防其中某個網站被黑後,其餘網站或服務器的其餘目錄被黑客獲取到權限從而遭受攻擊

修改前:

修改後:

若是咱們先將open_basedir的值放一個錯誤的目錄,再來訪問111.com下的目錄時會報500錯誤代碼,下圖中的2.php內容已經修改正確

查看錯誤日誌有以下提示:

如今咱們來將open_basedir的值修改正確,訪問就正常了

上面的實驗中是將open_basedir限定在/data/wwwroot/目錄下的,可是咱們如今網站代碼都是在這個目錄下,達不到隔離網站的目的,所以咱們須要針對網站的單獨的一個站點來作open_basedir ,可是在php.ini是針對全部的站點的,此時咱們只能在虛擬主機配置文件httpd_vhost.conf中來限定了.

php_admin_value這個參數能夠定義php.ini裏面的一些參數,好比error_log 、error_reporting,咱們能夠在虛擬主機配置文件中對單個虛擬主機使用這個參數來定義上面的open_basedir

    php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"  

    php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

上圖命令中不限制/tmp/目錄的緣由是若是上傳圖片的話,是會先放在/tmp/這個臨時文件夾下的,若是把/tmp/給限制爲不能訪問,就不能上傳圖片了。

 

推薦連接

apache開啓壓縮 http://ask.apelearn.com/question/5528

apache2.2到2.4配置文件變動 http://ask.apelearn.com/question/7292

apache options參數 http://ask.apelearn.com/question/1051

apache禁止trace或track防止xss http://ask.apelearn.com/question/1045

apache 配置https 支持ssl http://ask.apelearn.com/question/1029

相關文章
相關標籤/搜索