LAMP架構(訪問控制之限制php解析、限制user_agent、php相關配置)

訪問控制之限制php解析

一些提供用戶上傳的文件下有可能被不正常放入可運行的文件,因此咱們要作的就是提早設置禁止解析這些目錄下的可執行php或其餘文件,避免損失。php

  • 編輯虛擬機配置文件
vim  /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
  • 關鍵性代碼以下
<Directory /data/wwwroot/111.com/upload>
    php_admin_flag engine off   //指的是將/data/wwwroot/111.com/upload目錄下的php禁止解析
</Directory>
  • 限制代碼加強版
<Directory /data/wwwroot/111.com/upload>
    php_admin_flag engine off   //指的是將/data/wwwroot/111.com/upload目錄下的php禁止解析
	<FilesMatch (.*)\.php(.*)>
		Order allow,deny
		Deny from all
	</FilesMatch>
</Directory>

  • 平滑重啓
/usr/local/apache2.4/bin/apachectl  graceful
  • 建立目錄
[root@yolks2 ~]# mkdir /data/wwwroot/111.com/upload/
[root@yolks2 ~]# cd !$
cd /data/wwwroot/111.com/upload/
[root@yolks2 upload]# ls
[root@yolks2 upload]# vim test_uplaod.php
[root@yolks2 upload]# ls
test_uplaod.php
  • 測試結果:無權限403
curl -x127.0.0.1:80 'http://111.com/upload/123.php' -I
[root@yolks2 upload]# curl -x127.0.0.1:80 'http://111.com/upload/test_uplaod.php' -I 
HTTP/1.1 403 Forbidden
Date: Mon, 06 Aug 2018 14:32:03 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1

限制user_agent

能夠簡單理解爲瀏覽器標識;好比網站受到cc***。***的人經過軟件或者肉機,想***某個網站的時候,把全部的肉機發動起來,讓它們同時訪問一個站點。可是cc***每每有一個特徵,就是user_agent一致的,訪問地址一致。訪問速度快,每秒N次;
解決方法:限制user_agent減輕服務器壓力html

編輯虛擬機配置文件shell

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

核心配置文件代碼以下:apache

<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]  //條件1,此處加OR表示條件1或者條件2都使用最後的規則
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC] //條件2,NC 表示忽略大小寫
        RewriteRule  .*  -  [F] //規則,F爲forbidden
</IfModule>

從新加載文件vim

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

curl測試:403錯誤瀏覽器

curl -x127.0.0.1:80 'http://111.com/index.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 07 Aug 2018 14:29:45 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1

查看日誌:顯示被限制服務器

[root@yolks2 ~]# tail -f /usr/local/apache2.4/logs/111.com-access_20180807.log 
127.0.0.1 - - [07/Aug/2018:22:29:45 +0800] "HEAD http://111.com/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"

爲了證實是user_agent限制的,模擬user_agent指定user_agent爲「yolks yolks」,能夠直接被訪問php7

[root@yolks2 ~]# curl -A "yolks yolks" -x127.0.0.1:80 'http://111.com/index.php' -I
HTTP/1.1 200 OK
Date: Tue, 07 Aug 2018 14:33:28 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8

再次查看日誌已經正常顯示:curl

[root@yolks2 ~]# tail -f /usr/local/apache2.4/logs/111.com-access_20180807.log 
127.0.0.1 - - [07/Aug/2018:22:29:45 +0800] "HEAD http://111.com/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [07/Aug/2018:22:33:28 +0800] "HEAD http://111.com/index.php HTTP/1.1" 200 - "-" "yolks yolks"
  • curl幾個選項
    • -e 指定referer (必須 http:// 開頭)
    • -A 指定user_agent
    • -x 指定ip,至關於省略了hosts
    • -I 查看狀態碼

cc攻擊

cc攻擊解釋socket

PHP相關配置

查看php配置文件位置

方法1:用命令 /usr/local/php/bin/php -i | grep -i "loaded configuration file"

方法2:用phpinfo來查看

編輯index.php,內容爲phpinfo

[root@yolks2 111.com]# cat index.php 
<?php
echo "this is test 111.com";
phpinfo();
?>

瀏覽器可訪問111.com/index.php,爲phpinfo

若是沒有加載的話能夠去源碼包中複製

[root@yolks2 111.com]# cd /usr/local/src/php-7.1.6/
[root@yolks2 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini

從新加載配置後,能夠看到php.ini被加載

配置php.ini

1.限定disable_fuctions(危險函數)

vim/usr/local/php7/etc/php.ini編輯文件搜索/disable_fun

危險函數:

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會將系統的一些目錄暴露給他人,很危險。

配置完成後,查看111.com/index.php,已經被禁掉

2.定義date.timezone(時區)

時區定爲Asia/Shanghai 或者 Asia/Chongqing

3.日誌相關

display_errors顯示錯誤信息,若是on,打開的話,那麼會把錯誤信息顯示在瀏覽器上,極可能會暴露目錄,例如:

那麼,設置爲off以後,再訪問,則會顯示白頁,雖然防止別人可是本身也不容易看到報錯信息;

所以,再將display_errors改成off以後,須要編輯錯誤日誌log_errors

**log_errors **

1)log_errors:錯誤日誌打開

  1. 錯誤日誌記錄到一個目錄去

3)還要定義一個error_log的級別,很是嚴謹的話,那麼只會記錄一些嚴重的錯誤,一些不太嚴重的錯誤則不記錄,忽被略掉,咱們能夠放鬆一些,級別低一點

生產環境中通常使用 E_ALL & ~E_NOTICE

再次訪問,查看日誌:

[root@yolks2 php-7.1.6]# curl -A "yolks" -x127.0.0.1:80 111.com/index.php
this is test 111.com[root@yolks2 php-7.1.6]# cat /tmp/php_errors.log 
[07-Aug-2018 15:46:00 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 3

咱們再模擬一個錯誤,再/data/wwwroot/111.com/目錄下建立2.php,內容以下

文件2.php內容以下:

cat /data/wwwroot/111.com/2.php
<?php
shsjshjshj

測試發現日誌報錯提示500 .

[root@yolks2 php-7.1.6]# curl -A "yolks" -x127.0.0.1:80 111.com/2.php
[root@yolks2 php-7.1.6]# curl -A "yolks" -x127.0.0.1:80 111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 07 Aug 2018 15:49:50 GMT
Server: Apache/2.4.34 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Connection: close
Content-Type: text/html; charset=UTF-8

[root@yolks2 php-7.1.6]# cat /tmp/php_errors.log 
[07-Aug-2018 15:46:00 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 3
[07-Aug-2018 15:49:47 UTC] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 3
[07-Aug-2018 15:49:50 UTC] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 3

4.open_basedir

好比一個服務器上跑了不少站點,其中一個站點寫的漏洞比較多,被人黑了,被人拿到了權限,那麼可定會被進一步***,進到另外一個站點。可是若是增長了open_basedir,那麼就有可能黑不了
A網站在A目錄,B網站在B目錄,即便被黑,那也是黑一個目錄,不會連帶其餘目錄被黑

修改 /usr/local/php7/etc/php.ini ( : 爲分隔符,分割須要限制的多個目錄,默認的臨時文件在tmp下,因此要帶上tmp目錄)

php.ini是針對站全部點作限制,但若是有多個網站運行,多個網站運行在同一個文件夾下,那麼等因而沒有分開限制。

只有針對站點去作open_basedir才行,php.ini作不到,只有在apache的虛擬主機中定義才行

php_admin_value能夠定義php.ini中的參數,如error_log,error_reporting,能夠針對不一樣虛擬主機限制不一樣的open_basedir

針對不一樣虛擬主機限制不一樣的open_basedir

用php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/「限定目錄,而針對多個不一樣的虛擬主機限制不一樣的open_basedir,能夠用上方第一個虛擬主機來限制

之因此加上/tmp/目錄,是由於網站會有臨時文件寫入到/tmp/目錄下來

拓展

apache開啓壓縮

apache2.2到2.4配置文件變動

apache options參數

apache禁止trace或track防止xss

apache 配置https 支持ssl

相關文章
相關標籤/搜索