配置防盗链、访问控制Directory和FilesMatch
5月31日任务
课程内容:
11.25 配置防盗链
11.26 访问控制Directory
11.27 访问控制FilesMatch
扩展
几种限制ip的方法 http://ask.apelearn.com/question/6519
apache 自定义header http://ask.apelearn.com/question/830
apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556
11.25 配置防盗链
通过限制referer来实现防盗链的功能,在虚拟主机vhosts.conf配置文件增加如下内容。
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref //设置白名单
SetEnvIfNoCase Referer "http://aaa.com" local_ref //设置白名单
#SetEnvIfNoCase Referer "^$" local_ref //空Referer
<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>
</Directory>
保存配置文件后需要重新加载
[root@jimmylinux-002 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@jimmylinux-002 ~]# /usr/local/apache2.4/bin/apachectl graceful
在浏览器刷新111.com/qq.jpg 会出现以下报错,因为这是一个空Referer。
如果想不是空Referer能够正常访问,首先在猿课论坛发一个帖子。
通过帖子打开链接,这个时候同样也会是Forbidden,因为Referer是ask.apelearn.com,如果想正常访问,那么把ask.apelearn.com加入到白名单即可。
SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref
记得保存配置文件后需要重新加载
[root@jimmylinux-002 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@jimmylinux-002 ~]# /usr/local/apache2.4/bin/apachectl graceful
然后点击猿课论坛帖子链接http://111.com/qq.jpg 就可以正常访问了
如果想直接访问,需要把配置文件中空Referer这行前面的#删除掉,这样就可以直接访问。
SetEnvIfNoCase Referer "^$" local_ref
保存退出重新加载配置文件,直接输入http://111.com/qq.jpg 就可以正常访问了。
一样也可以使用curl命令来测试
[root@jimmylinux-002 ~]# curl -x127.0.0.1:80 111.com/qq.jpg -I
HTTP/1.1 200 OK
Date: Thu, 31 May 2018 15:03:05 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Last-Modified: Tue, 17 Apr 2018 15:16:35 GMT
ETag: "6089-56a0cd2f55ac0"
Accept-Ranges: bytes
Content-Length: 24713
Content-Type: image/jpeg
[root@jimmylinux-002 ~]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/qq.jpg -I //通过-e “http://www.qq.com”指定Referer
HTTP/1.1 403 Forbidden
Date: Thu, 31 May 2018 15:04:06 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@jimmylinux-002 ~]# curl -e "http://111.com/123.txt" -x127.0.0.1:80 111.com/qq.jpg -I //111.com是本身存在的域名,使用不会报错。
HTTP/1.1 200 OK
Date: Thu, 31 May 2018 15:04:38 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Last-Modified: Tue, 17 Apr 2018 15:16:35 GMT
ETag: "6089-56a0cd2f55ac0"
Accept-Ranges: bytes
Content-Length: 24713
Content-Type: image/jpeg
可以通过查看日志验证刚才的访问记录
[root@jimmylinux-002 ~]# tail /usr/local/apache2.4/logs/111.com-access_20180531.log
192.168.52.1 - - [31/May/2018:17:31:18 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://111.com/qq.jpg" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
127.0.0.1 - - [31/May/2018:23:14:51 +0800] "HEAD HTTP://111.com/qq.jpg1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
11.26 访问控制Directory
访问控制的背景,之前有提到用户认证的方式进行访问,那么我希望能够控制的更严格些,比如当访问内部管理,仅仅针对内部人员,外部人员一律不开放,可以做一些白名单限制,只有在白名单里面的才可以访问,其他的访问都被拒绝。
可以修改虚拟主机配置文件vhosts.conf,为了不和防盗链的配置冲突,把添加的内容放到防盗链配置的上面。
<Directory /data/wwwroot/111.com/admin/>
Order deny,allow //这里的order是指顺利,例如order deny,allow 表示先执行deny,再执行allow。
Deny from all
Allow from 127.0.0.1
</Directory>
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://ask.apelearn.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>
在进行测试之前我们先创建指定的admin目录和目录下面的index.php文件,然后加载配置。
[root@jimmylinux-002 111.com]# mkdir admin
[root@jimmylinux-002 111.com]# ls
admin admin.php index.php qq.jpg
[root@jimmylinux-002 111.com]# cd admin/
[root@jimmylinux-002 admin]# ls
[root@jimmylinux-002 admin]# vi index.php
[root@jimmylinux-002 admin]# ls
index.php
[root@jimmylinux-002 admin]# cat index.php
123456123456
[root@jimmylinux-002 admin]# /usr/local/apache2.4/bin/apachectl graceful
使用curl命令进行访问测试,出现状态码403说明访问被限制了。
[root@jimmylinux-002 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Thu, 31 May 2018 15:53:25 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Content-Type: text/html; charset=UTF-8
[root@jimmylinux-002 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php
123456123456
[root@jimmylinux-002 111.com]# curl -x192.168.52.129:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Thu, 31 May 2018 15:55:35 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@jimmylinux-002 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php
123456123456
[root@jimmylinux-002 111.com]# tail /usr/local/apache2.4/logs/111.com-access_20180531.log
192.168.52.1 - - [31/May/2018:17:31:18 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "http://111.com/qq.jpg" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
127.0.0.1 - - [31/May/2018:23:14:51 +0800] "HEAD HTTP://111.com/qq.jpg1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [31/May/2018:23:53:25 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [31/May/2018:23:53:46 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 13 "-" "curl/7.29.0"
192.168.52.129 - - [31/May/2018:23:55:35 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [31/May/2018:23:56:00 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 13 "-" "curl/7.29.0"
11.27 访问控制FilesMatch
访问控制不仅仅可以针对目录形式,也可以去匹配文件名或者链接的形式进行限制。
例如:http://111.com/admin.php?&1=1&2=2 这样的方式
在vhosts.conf配置文件中添加 <FilesMatch "admin.php(.*)">和</FilesMatch>条件,具体内容如下。
<Directory /data/wwwroot/111.com>
<FilesMatch admin.php(.*)>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
报错配置文件并重新加载,然后使用curl命令测试。
[root@jimmylinux-002 111.com]# curl -x192.168.52.129:80 http://111.com/admin/fjasjds -I
HTTP/1.1 404 Not Found
Date: Thu, 31 May 2018 16:37:26 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1
[root@jimmylinux-002 111.com]# curl -x192.168.52.129:80 'http://111.com/admin.php?ajasjds' -I
HTTP/1.1 403 Forbidden
Date: Thu, 31 May 2018 16:38:46 GMT
Server: Apache/2.4.33 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1