6月1日
對於使用PHP語言編寫的網站,有一些目錄是有需求上傳文件的,比如服務器可以上傳圖片,並且沒有做防盜鏈,所以就會被人家當成了一個圖片存儲服務器,並且盜用帶寬流量。如果網站代碼有漏洞,讓***上傳了一個用PHP代碼寫的***,由於網站可以執行PHP程序,最終會讓***拿到服務器權限,為了避免這種情況發生,我們需要把能上傳文件的目錄直接禁止解析PHP代碼(不用擔心會影響網站訪問,若這種目錄也需要解析PHP,那說明程序員不合格)
1. 修改虛擬主機配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加核心配置如下:
<Directory /data/wwwroot/abc.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
最終保存配置:
說明:
php_admin_flag engine off //這一段就可以禁止解析PHP代碼 <FilesMatch (.*)\.php(.*)> //這一段就是讓php的文件訪問受到限制,防止php
2.再檢查語法加載配置和創建upload目錄、php文件
/usr/local/apache2.4/bin/apachectl -t //小技巧(快捷鍵 ctrl+R 再輸入 -t )
/usr/local/apache2.4/bin/apachectl graceful
mkdir /data/wwwroot/abc.com/upload
vim /data/wwwroot/abc.com/upload/123.php
3. 使用curl測試
curl -x127.0.0.1:80 abc.com/upload/123.php -I
返回403,直接限制訪問
3.1 只讓 php_admin_flag engine off 生效
能訪問但是不能正常解析php
11.29 限制user_agent
user_agent可以理解為瀏覽器標識,針對user_agent來限制一些訪問,比如可以限制一些不太友好的搜索引擎“爬蟲”,你之所以能在百度搜到一些論壇,就是因為百度會派一些“蜘蛛爬蟲”過來抓取網站數據。“蜘蛛爬蟲”抓取數據類似於用戶用瀏覽器訪問網站,當“蜘蛛爬蟲”太多或者訪問太頻繁,就會浪費服務器資源。另外,也可以限制惡意請求,這種惡意請求我們通常稱作cc***,他的原理很簡單,就是用很多用戶的電腦同時訪問同一個站點,當訪問量或者頻率達到一定層次,會耗盡服務器資源,從而使之不能正常提供服務。這種cc***其實有很明顯的規律,其中這些惡意請求的user_agent相同或者相似,那我們就可以通過限制user_agent發揮防***的作用。
1. 修改虛擬主機配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加核心配置如下:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
最終保存配置:
說明:
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] //OR是或者的意思, user_agent匹配curl或者匹配baidu.com RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] //NC是忽略大小寫 RewriteRule .* - [F] //F是Forbidden
2.再檢查語法和加載配置
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
3.使用curl測試如下:
curl -x127.0.0.1:80 abc.com/upload/123.php -I //返回403直接禁止訪問
4.指定user_agent,如果不指定user_agent,那麽curl作為user_agent會被限制訪問,從上面測試可以看出
curl -A "cfk cfk" -x127.0.0.1:80 abc.com/upload/123.php -I
5.查看一下日誌
tail /usr/local/apache2.4/logs/abc.com-access_20180602.log
curl 說明:
使用參數 -A 指定了它的user_agent後就可以訪問。
使用參數 -e 指定referer
使用參數 -x 相對省略本地綁定hosts
使用參數 -I 查看狀態碼
11.30-11.31 php相關配置
PHP相關配置:
雖然PHP是以httpd一個模塊的形式存在,但是PHP本身也有自己的配置文件。
1. 查看PHP配置文件位置
cd /data/wwwroot/abc.com/
vim index.php 輸入以下內容:
<?php
phpinfo();
?>
1.1 網頁訪問:http://47.97.163.117/index.php
php.ini為PHP的配置文件,可以看出其在/usr/local/php7/etc/php.ini。
1.2 php配置文件己經加載Loaded Configuration File 如果沒有加載做以下配置:
復制源碼包裏開發配置文件
cd /usr/local/src/php-7.1.6
cp php.ini-development /usr/local/php7/etc/php.ini
/usr/local/apache2.4/bin/apachectl graceful
2.PHP的disable_functions限制
PHP有諸多的內置的函數,有一些函數(比如exec)會直接調取linux的系統命令,如果開放將會非常危險,因此,基於安全考慮應該把一些存在安全風險的函數禁掉。
2.1編輯php.inin配置文件,搜索disable_functions,添加配置
vim /usr/local/php7/etc/php.ini
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
/usr/local/apache2.4/bin/apachectl graceful
2.2測試加上了phpinfo函數,所以訪問index.php時結果無內容顯示:
(測試後重新進php.ini配置文件將 phpinfo去掉,訪問正常)
3.PHP配置文件定義date.timezone,如果不定義會導致有告警信息
vim /usr/local/php7/etc/php.ini // 搜索date.timezone 輸入以下配置
date.timezone = Asia/Shangahi
/usr/local/apache2.4/bin/apachectl graceful
4.. 配置 error_log
PHP的日誌對於程序員來講非常重要,它是排查問題的重要手段。
如果加上了phpinfo函數後,瀏覽器上訪問http://abccom/index.php 就會有信息輸出,這樣也暴露的地址目錄,相對來說也不安全,我們需要把報錯信息也隱藏掉,操作如下:
vim /usr/local/php7/etc/php.ini // 搜索display_errors 輸入以下配置
display_errors=off
/usr/local/apache2.4/bin/apachectl graceful
訪問網址就不會報錯了
總結:配置了display_errors = Off後,瀏覽器訪問沒有任何輸出信息,一片空白,使用curl輸出也是一樣,這樣我們就無法判斷是否有問題,所以需要配置錯誤日誌。
4.1 修改配置日誌:
vim /usr/local/php7/etc/php.ini
定義如下: //搜索log_errors 改為 log_errors =On //搜索error_log 改為 /tmp/php_errors.log //搜索error_reporting 改為 error_reporting = E_ALL //搜索display_errors 改為 display_errors = Off
log_errors要確認開啟:
開啟日誌後還要定義對應的保存路徑:error_log,我們設置在/tmp下
定義完路徑後,我們還要對它進行一個級別設置:error_reporting,E_ALL是最不嚴謹的級別:
測試一下,發現已經生成了對應的日誌了:
5. 配置open_basedir
一個服務器上跑很多網站,小公司為節省成本采用的做法,這樣操作是會有一些弊端:多個網站跑在同一個服務器上,如果其中一個網站被黑,很有可能會連累到其他站點,為了避免這種尷尬的事情發生,我們應當作一些預防手段。
PHP有一個概念叫作open_basedir,它的作用是將網站限定在指定目錄裏,就算該站點被黑了,***只能在該目錄下面有所作為,而不能左右其他目錄。如果你的服務器上只有一個站點,那可以直接在php.ini中設置open_basedir參數。但如果服務器上跑的站點比較多,那在php.ini中設置就不合適了,因為在php.ini中只能定義一次,也就是說所有站點都一起定義限定的目錄,那這樣似乎起不到隔離多個站點的目的。
5.1我們先來創建一個2.php,輸入內容保存後再來做實驗:
vim /data/wwwroot/abc.com/2.php
<?php
echo "2.php";
?>
vim /usr/local/php7/etc/php.ini //定義open_basedir
open_basedir =/data/wwwroot/abc.com:/tmp
5.2 測試狀態是正常的就配置生效
curl -A "cfk" -x127.0.0.1:80 abc.com/2.php -I
5.3 如果我們定義open_basedir = /data/wwwroot/abcd.com:/tmp 時,我們再來實驗一下:
vim /usr/local/php7/etc/php.ini //定義open_basedir
open_basedir =/data/wwwroot/abcd.com:/tmp
/usr/local/apache2.4/bin/apachectl graceful
curl -A "c" -x127.0.0.1:80 abc.com/2.php -I
再來實驗一下,結果是500錯誤:
6月1日