更新11.25 配置防盜鏈 11.26 訪問控制Directory11.27 訪問控制FilesMatch11.28限定某個目錄禁止解析PHP11.29 限制user_agent/11.30-31 P
11.25 配置防盜鏈 11.26 訪問控制Directory
11.25 配置防盜鏈
CURL +X 是來源IP
11.26 訪問控制Directory
11.27 訪問控制FilesMatch
• 通過限制referer來實現防盜鏈的功能
• 配置檔案增加如下內容
<Directory /data/wwwroot/www.123.com>
SetEnvIfNoCase Referer "http://www.123.com" local_ref
SetEnvIfNoCase Referer "http://123.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>
• curl -e "http://www.aminglinux.com/123.html" 自定義referer
11.25 配置防盜鏈
防盜鏈的功能可以通過限制referer來實現,不是本機伺服器所認識的referer,不允許第三方伺服器通過連結引用跳轉至本機伺服器進行訪問。
修改虛擬主機配置檔案
<Directory /data/wwwroot/def.com> //定義訪問目錄
SetEnvIfNoCase Referer "http://def.com" local_ref //設定referer白名單
SetEnvIfNoCase Referer "http://www.def.com" local_ref //設定referer白名單
SetEnvIfNoCase Referer "^$" local_ref //設定referer白名單(空regerer)
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny //訪問控制規則
Allow from env=local_ref
</filesmatch>
</Directory>
空referer:直接在瀏覽器輸入目的域名,則referer為空。
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_re
第一條是 哪裡跳過來 第二條是直接訪問 第一個是白名單,第二個等自己直接打上去這個地址
結果測試
經過部落格網站進行訪問時,部落格網站域名沒有加入網站白名單,防盜鏈生效,訪問被拒絕
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 09:19:19 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32Content-Type: text/html; charset=iso-8859-1
curl -e可以自定義referer,進行模擬測試。
11.26 訪問控制Directory
訪問控制可以限制一些白名單IP,只有白名單上的IP才可以進行正常訪問,否則全部拒絕
修改虛擬主機配置檔案
<Directory /data/wwwroot/def.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
Order用於定義順序,上述檔案中的順序為先deny(禁止)後allow(允許),並且和防火牆規則匹配機制不同的是,下方具體規則的先後順序和真正執行的順序無關,且會按照從先至後依次全部匹配,按照上述檔案的策略順序,最終只有源IP為127.0.0.1才可以正常訪問。
結果測試
[[email protected] admin]# curl -x 127.0.0.1:80 def.com/admin/test.php -I
HTTP/1.1 200 OK
Date: Sun, 03 Jun 2018 11:30:16 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32X-Powered-By: PHP/5.6.32Cache-Control: max-age=0Expires: Sun, 03 Jun 2018 11:30:16 GMTContent-Type: text/html; charset=UTF-8
[[email protected] admin]# curl -x 192.168.88.5:80 def.com/admin/test.php -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 11:30:27 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32Content-Type: text/html; charset=iso-8859-1
雖然-x選項後面的IP地址為目的IP,但是127.0.0.1為主機迴環IP,訪問時也需要用127.0.0.1作為源IP進行訪問,因此滿足條件,可以正常訪問。同理訪問外部網絡卡地址也需要用外部網絡卡IP進行訪問,不滿足訪問控制條件,因此無法訪問。
11.26 訪問控制Directory
• 核心配置檔案內容
<Directory /data/wwwroot/www.123.com/admin/> 必須裡面的目錄
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
Order deny,allow ## 定義順序 是先 拒絕還是先 允許
Deny from all ##先被拒絕
Allow from 127.0.0.1 ##再被允許
上述檔案中的順序為先deny(禁止)後allow(允許)
黑名單 黑名單就是全部都同意然後挑幾個拒絕,白名單就是全拒絕然後挑幾個同意
正確配置檔案
<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 172.16.90.41
Allow from 172.16.20.16
</Directory>
• curl測試狀態碼為403則被限制訪問了
可以新增多個IP
11.27 訪問控制FilesMatch
有時只需要限制某些訪問連結,且訪問連結中含有一些特殊符號(?、&等),對整個目錄進行限制較不合理,可以使用FilesMatch進行限制。
修改虛擬主機配置檔案
<Directory /data/wwwroot/def.com>
<FilesMatch "admin.php(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
使用.*代指PHP檔案後所有特殊符號 針對檔案
正確設定
<Directory /data/wwwroot/111.com/admin/>
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
測試結果
[[email protected] admin]# curl -x 192.168.88.5:80 def.com/admin.php? -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 11:58:16 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32Content-Type: text/html; charset=iso-8859-1
[[email protected] admin]# curl -x 127.0.0.1:80 def.com/admin.php? -I
HTTP/1.1 200 OK
Date: Sun, 03 Jun 2018 11:58:34 GMTServer: Apache/2.4.33 (Unix) PHP/5.6.32X-Powered-By: PHP/5.6.32Cache-Control: max-age=0Expires: Sun, 03 Jun 2018 11:58:34 GMTContent-Type: text/html; charset=UTF-8
正確配置
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/abc.com"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
# <Directory /data/wwwroot/111.com>
# AllowOverride AuthConfig
# AuthName "111.com user auth"
# AuthType Basic
# AuthUserFile /data/.htpasswd
# require valid-user
#</Directory>
# 核心配置檔案內容
<Directory /data/wwwroot/111.com/admin/>
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 172.16.20.16
</FilesMatch>
</Directory>
<Directory /data/wwwroot/www.111.com>
SetEnvIfNoCase Referer "http://www.111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
</Directory>
SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
擴充套件
11.28 限定某個目錄禁止解析PHP
•核心配置檔案內容
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
• curl測試時直接返回了php原始碼,並未解析
正確
<Directory /data/wwwroot/111.com/upload/> #這裡一定要和伺服器服務一樣,(自己以前加了WWW出錯老半天沒找出原因)
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)>
Order deny,allow #匹配PHP全部禁用
Deny from all # 不加Deny就會訪問你的原始碼
</FilesMatch>
</Directory>
mkdir upload 然後裡面放一個PHP檔案
11.29 限制user_agent 使用者代理
•user_agent可以理解為瀏覽器標識
• 核心配置檔案內容
<IfModule mod_rewrite.c> #改寫
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] #NC忽略大小寫
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC] #2個條件直接連線符
RewriteRule .* - [F]
</IfModule>
• curl -A "123123" 指定user_agent
[NC,OR] #2個條件直接連線符 匹配上面 或者下面這個不加OR是並且它或者它
{HTTP_USER_AGENT} 這個是定義條件
{HTTP_USER_AGENT}
RewriteRule .*\.jpg -[F] // 如果請求的是一個.jpg圖片就拒絕
以後遇見這種配置前面就寫.* 中間關鍵詞再.*
11.30 PHP相關配置上
• 檢視php配置檔案位置
• /usr/local/php/bin/php -i|grep -i "loaded configuration file"
• date.timezone #定義時區 不然會出現告警資訊
• 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
• error_log, log_errors, display_errors, error_reporting
• open_basedir
• php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
檢視PHP路徑位置 可以/data/wwwroot/111.com 建立一個php檔案
<?php
phpinfo();
?>
•/usr/local/php/bin/php -i|grep -i "loaded configuration file" 這個方式不靠譜
vim /usr/local/php/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
• date.timezone
date.timezone = Asia/Shanghai
display_errors = Off #不希望把錯誤資訊顯示到遊覽器裡
error_log = /tmp/php_errors.log 錯誤日誌開啟 放到tmp下面
touch /tmp/php_errors.log
chmod 777 /tmp/php_errors.log
has been disabled for security reasons 出於安全原因被禁用
有錯誤日誌就是對的
open_basedir #一個網站只有一目錄,被黑了也只有一個目錄
vim /usr/local/php/etc/php.ini #open_basedir 這個功能只要開啟就可以,不要在裡面設定,去虛擬主機裡面設定vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
• php_admin_value open_basedir "/data/wwwroottmp/" 新增這行根據目錄填寫 TMP是一定要的
11.30 PHP擴充套件模組
• /usr/local/php/bin/php -m //檢視模組
• 下面安裝一個redis的模組
• cd /usr/local/src/
• mv develop phpredis-develop.zip
• yum install -y unzip yum install -y autoconf(可能少這個包)
• unzip phpredis-develop.zip
• cd phpredis-develop
• /usr/local/php/bin/phpize //生成configure檔案
• /usr/local/php7/bin/phpize //生成7configure檔案
• ./configure --with-php-config=/usr/local/php/bin/php-config
• ./configure --with-php-config=/usr/local/php7/bin/php-config //7
• make && make install
生成的檔案
• /usr/local/php/bin/php -i |grep extension_dir //檢視擴充套件模組存放目錄,我們可以在php.ini中去自定義該路徑
• vim /usr/local/php/etc/php.ini //增加一行配置(可以放到檔案最後一行)
extension = redis.so
/usr/local/php/bin/php -m |grep redis //檢視有沒有這個檔案
redis