11.25 配置防盗链

·通过限制referer来实现防盗链的功能

现象:带宽异常升高,有可能是被倒链

  • 编辑配置文件(定义 referer 的白名单)

[root@arslinux-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

1.png

</Directory /data/wwwroot/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)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>

--实际测试时,我们将第三条规则注释掉,因为如果不注释掉,那么刷新图片其实就是空referer,没法看出效果

2.png

  • 定义访问控制

Order Allow,Deny

先允许,后拒绝。先允许白名单的 referer 通过,再拒绝掉其余的

Allow from env=local_ref

设置允许的规则,就是上方后缀为 local_ref 的规则

(注意:“Allow,Deny”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。上面设定的含义是先设定“先检查允许设定,没有允许的全部禁止”,而第二句允许变量 local_ref 的 referer


  • 配置说明:

<Directory /data/wwwroot/111.com>                             定义防盗链的目录

SetEnvIfNoCase Referer                                                  白名单

<filesmatch>                                                                 匹配规则

<FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">            针对这些文件做防盗链


  • 测试

[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl graceful

配置生效之后,访问 111.com/doge.gif,结果是Not Found

3.png

--将白名单中加入51cto博客

4.png

--在51cto中发一个链接贴

5.png

--点击链接,实测可以访问图片

6.png

将白名单51cto去掉后,图片就无法访问了

直接访问图片地址是空referer,而通过链接访问图片,那么referer是该链接所在论坛地址

空referer :直接输入地址访问或者刷新网页的情况


·模拟referer(curl -e   (referer必须http开头))

[root@arslinux-01 ~]# curl -e "http://www.qq.com" -x127.0.0.1:80 111.com/doge.gif -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 06:09:21 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

[root@arslinux-01 ~]# curl -e "http://111.com" -x127.0.0.1:80 111.com/doge.gif -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 06:09:33 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Last-Modified: Wed, 19 Apr 2017 14:13:29 GMT
ETag: "2a44e3-54d85a0e67440"
Accept-Ranges: bytes
Content-Length: 2770147
Content-Type: image/gif

扩展:https://www.cnblogs.com/bonelee/p/7875163.html


11.26 访问控制Directory

·用户认证可以在一定程度起到安全作用,有时想要让安全更加严格一些

为了防止访问冲突产生,把访问控制放到上方,那么上方为访问控制,下方位防盗链

  • 编辑配置文件

[root@arslinux-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

7.png

<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>


  • 定义访问控制规则

Order deny,allow 顺序,先deny,后allow

Deny from all 控制语句

Allow from 127.0.0.1 控制语句    控制对象:来源ip

先deny,后allow,那么只有127.0.0.1不受限制;先allow,后deny,那么就是deny

无论是先 deny 还是先 allow,Order 都会按顺序执行完,控制语句顺序不影响结果


  • 测试

1、在 /data/wwwroot/111.com/ 创建 admin/ 目录,并在目录下创建 index.php,任意内容

[root@arslinux-01 ~]# mkdir /data/wwwroot/111.com/admin/
[root@arslinux-01 ~]# vim /data/wwwroot/111.com/admin/index.php
testtesttesttest

2、访问测试 curl -x是访问目标ip,而配置中也是同一个ip,这是本机和本机通讯

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 06:32:02 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8

[root@arslinux-01 ~]# curl -x192.168.194.150:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 06:32:51 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

3、111.com/admin 不存在连接的也是无法访问

8.png


11.27 访问控制FilesMatch

·访问控制除了目录之外也可以去匹配文件名

  • 编辑配置文件

[root@arslinux-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

9.png

<FilesMatch  "admin.php(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
  • 测试

[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@arslinux-01 ~]# curl -x192.168.194.150:80 111.com/admin.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 06:49:31 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1     //ip没有通过,403,禁止访问

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/admin.php -I
HTTP/1.1 404 Not Found
Date: Sat, 11 May 2019 06:46:50 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1    //更换ip,404,允许访问

虽然文件不存在,但是可以访问


11.28 限定某个目录禁止解析php

目的:禁止php解析:防止被上传有害php文件,而被执行,php中可能有危险的函数,如果开放了上传权限,肯定会被上传恶意***文件,会被拿到服务器权限,root权限,非常危险。

  • 编辑配置文件

[root@arslinux-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

10.png

<Directory /data/wwwroot/www.111.com/upload>
php_admin_flag engine off
</Directory>

·蓝色框中可加可不加,加上限制访问文件.php


  • 重新加载配置

[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@arslinux-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
  • 测试

1、创建在111.com下创建upload目录,并在目录下创建 php 文件

[root@arslinux-01 ~]# mkdir /data/wwwroot/111.com/upload/
[root@arslinux-01 ~]# cp /data/wwwroot/111.com/123.php /data/wwwroot/111.com/upload/

2、访问123.php,直接403,被禁止

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/upload/123.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 07:27:21 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

--将filesmatch注释掉,只保留php_admin_flag_engine off,再测试结果

11.png

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/upload/123.php
<?php
echo "123.php";

无法解析 php,只能显示源代码


--而在浏览器中输入111.com/upload/123.php时,文件准备开始下载,说明无法解析

--再将配置文件恢复,进一步限制

12.png

静态文件存放的目录时禁止解析php的


11.29 限制user_agent

user_agent 访问控制的需求背景:网站会受到CC***,原理为***者通过手段(软件,肉机)让成千上万肉机同时去访问某个站点,站点可能挂掉

CC***非常有规律,他们的user_agent非常有规律

  • 编辑配置文件

[root@arslinux-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

13.png

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
RewriteRule  .*  -  [F]
</IfModule>


  • 配置说明

上方为条件,下方位规则

OR为或,user_agent匹配上面条件的或下方的条件,比价OR则为并且,但是不可能同时匹配curl和baidu.com

NC 表示忽略大小写   (user_agent中类似于Mozilla就有大小写)

F为forbidden

  • 测试

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/upload/123.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 10:24:20 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1

[root@arslinux-01 ~]# curl -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 403 Forbidden
Date: Sat, 11 May 2019 10:25:01 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
Content-Type: text/html; charset=iso-8859-1
  • curl -A 指定 user_agent 来测试

[root@arslinux-01 ~]# curl -A "arslinux" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 10:30:03 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8

[root@arslinux-01 ~]# curl -A "arslinux arslinux" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 10:31:09 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8

查看日志,可以看到之前被拒绝访问的和 curl -A 之后允许访问

[root@arslinux-01 ~]# tail /usr/local/apache2.4/logs/111.com-access_20190511.log

14.png


  • curl常用配置选项:

-e        指定referer (必须 http:// 开头)

-A        指定user_agent

-x        指定ip,相当于省略了hosts

-I        查看状态码


扩展:

CC***:https://baike.baidu.com/item/cc%E6%94%BB%E5%87%BB/10959545?fr=aladdin


11.30/11.31 php相关配置

  • 查看 php 配置文件位置

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

方法2:创建 phpinfo,在 phpinfo 中查看

[root@arslinux-01 ~]# vim /data/wwwroot/111.com/index.php
<?php
phpinfo();

在浏览器中访问 111.com/index.php

15.png

我们可以看到php配置目录在/usr/local/php7/etc下,但是并没有加载


--既然没有加载,那么可以去源码包中复制

[root@arslinux-01 ~]# cd /usr/local/src/php-7.1.25/
[root@arslinux-01 php-7.1.25]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@arslinux-01 php-7.1.25]# /usr/local/apache2.4/bin/apachectl graceful

--重新加载后,刷新网页,php.ini 已经加载了

16.png


  • 配置文件 php.ini

1、限定disable_fuctions(危险函数)

[root@arslinux-01 php-7.1.25]# vim /usr/local/php7/etc/php.ini

17.png

·危险函数: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会将系统的一些目录暴露给他人,很危险。


·配置完成后,查看111.com/index.php,已经被禁掉

18.png

2、定义date.timezone(时区)

19.png

时区定为 Asia/Shanghai 或者 Asia/Chongqing


3、日志相关

1.display_errors

display_errors 显示错误信息,如果on,打开的话,那么会把错误信息显示在浏览器上,很可能会暴露目录

20.png

--那么,设置为off之后,再访问,则会显示白页,那么一切都是未知,不太好找问题所在

[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 111.com/123.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 11:02:47 GMT
Server: Apache/2.4.39 (Unix) PHP/7.1.25
X-Powered-By: PHP/7.1.25
Content-Type: text/html; charset=UTF-8


--因此,再将 display_errors 改为off之后,需要编辑错误日志 log_errors,方便查看错误


2.log_errors

1)log_errors:错误日志打开

21.png

2)log_errors:错误日志记录到一个目录下,自行编辑

22.png

3)error_reporting:还要定义一个error_log的级别,非常严谨的话,那么只会记录一些严重的错误,一些不太严重的错误则不记录,忽被略掉,我么可以放松一些,级别低一点

23.png

★生产环境中,一般使用E_ALL & ~E_NOTICE


[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 111.com/index.php
<br />
<b>Warning</b>:  phpinfo() has been disabled for security reasons in <b>/data/wwwroot/111.com/index.php</b> on line <b>2</b><br />
[root@arslinux-01 php-7.1.25]# cat /tmp/php_errors.log
[11-May-2019 19:17:10 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2

php errors.log的属主和属组是deamon,而demon是httpd的属主,php errors.log是以httpd进程的身份生成的

为了防止该文件没有生成,可以先创建 php_errors.log,在给它一个 777 的权限


--再模拟一个错误

[root@arslinux-01 php-7.1.25]# vim /data/wwwroot/111.com/2.php
<?php
echo 123;
adkfhlakdf

[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php
<br />
<b>Parse error</b>:  syntax error, unexpected end of file in <b>/data/wwwroot/111.com/2.php</b> on line <b>4</b><br />
[root@arslinux-01 php-7.1.25]# tail -1 /tmp/php_errors.log
[11-May-2019 19:19:08 Asia/Shanghai] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4

查看日志可以发现,Parse error比之前Warning更严重


4、open_basedir

--比如一个服务器上跑了很多站点,其中一个站点写的漏洞比较多,被人黑了,被人拿到了权限,那么可定会被进一步***,进到另一个站点

--但是如果增加了open_basedir,那么就有可能黑不了

--A网站在A目录,B网站在B目录,即使被黑,那也是黑一个目录,不会连带其他目录被黑

--修改 /usr/local/php7/etc/php.ini  ( : 为分隔符,分割需要限制的多个目录,默认的临时文件在tmp下,所以要带上tmp目录)

[root@arslinux-01 php-7.1.25]# vim /usr/local/php7/etc/php.ini

24.png

[root@arslinux-01 php-7.1.25]# /usr/local/apache2.4/bin/apachectl graceful
[root@arslinux-01 php-7.1.25]# curl -A "a" -x127.0.0.1:80 111.com/2.php
123

php.ini是针对站所有站点做限制,但如果有多个网站运行,多个网站运行在同一个文件夹下,那么等于是没有分开限制。


只有针对站点去做 open_basedir 才行,php.in i做不到,只有在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,可以用上方第一个虚拟主机来限制

25.png

默认临时文件在 /tmp/ 下,tmp 被限制的话,就无法上传图片了


11.32 php动态扩展模块安装

·忘记安装或者需求变更,需要增加模块

  • 查看 php 模块

[root@arslinux-01 php-7.1.25]# /usr/local/php7/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
exif
fileinfo
filter
gd
hash
iconv
json
libxml
mbstring
mcrypt
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
soap
sockets
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]
  • 安装一个 redis 模块(通常在LAMP架构下当做缓存来用)

1、下载解压 redis-php 包

[root@arslinux-01 php-7.1.25]# cd /usr/local/src/
[root@arslinux-01 src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop
[root@arslinux-01 src]# mv develop phpredis-develop.zip
[root@arslinux-01 src]# unzip phpredis-develop.zip
[root@arslinux-01 phpredis-develop]# ls
acinclude.m4       config.guess  debian             ltmain.sh         README.markdown     redis_commands.c
aclocal.m4         config.m4     debian.control     Makefile.global   redis_array.c       redis_commands.h
arrays.markdown    config.sub    INSTALL.markdown   missing           redis_array.h       redis_session.c
build              configure.in  install-sh         mkdeb-apache2.sh  redis_array_impl.c  redis_session.h
cluster_library.c  config.w32    ISSUE_TEMPLATE.md  mkdeb.sh          redis_array_impl.h  rpm
cluster_library.h  COPYING       liblzf             mkinstalldirs     redis.c             run-tests.php
cluster.markdown   crc16.h       library.c          package.xml       redis_cluster.c     serialize.list
common.h           CREDITS       library.h          php_redis.h       redis_cluster.h     tests

2、生成 configure 文件

[root@arslinux-01 src]# cd phpredis-develop/
[root@arslinux-01 phpredis-develop]# yum install -y autoconf
[root@arslinux-01 phpredis-develop]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[root@arslinux-01 phpredis-develop]# ls
acinclude.m4       config.guess  CREDITS            ltmain.sh         redis_array.c       redis_session.c
aclocal.m4         config.h.in   debian             Makefile.global   redis_array.h       redis_session.h
arrays.markdown    config.m4     debian.control     missing           redis_array_impl.c  rpm
autom4te.cache     config.sub    INSTALL.markdown   mkdeb-apache2.sh  redis_array_impl.h  run-tests.php
build              configure     install-sh         mkdeb.sh          redis.c             serialize.list
cluster_library.c  configure.in  ISSUE_TEMPLATE.md  mkinstalldirs     redis_cluster.c     tests
cluster_library.h  config.w32    liblzf             package.xml       redis_cluster.h
cluster.markdown   COPYING       library.c          php_redis.h       redis_commands.c
common.h           crc16.h       library.h          README.markdown   redis_commands.h

3、安装

[root@arslinux-01 phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@arslinux-01 phpredis-develop]# make && make install

make install会把redis.so放在 /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/ 中

[root@arslinux-01 phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so

现在PHP还不支持redis,需要加载redis.so


·查看扩展模块存放目录,我们可以在php.ini中去自定义该路径

[root@arslinux-01 phpredis-develop]# /usr/local/php7/bin/php -i |grep -i extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303
sqlite3.extension_dir => no value => no value


·编辑/usr/local/php7/etc/php.ini,增加一行配置extension = redis.so(可以放到文件最后一行)

[root@arslinux-01 phpredis-develop]# vim /usr/local/php7/etc/php.ini

26.png

[root@arslinux-01 phpredis-develop]# /usr/local/php7/bin/php -m|grep redis
redis

--如果想编译一个模块时,如果php源码包中的ext文件夹下自带了该目录,那么不用下载就可以直接编译,如果没有,那么就需要去下载

--在php源码包里有很多模块,我们安装一个没有加载的zip模块

·尝试编译安装一个模块

[root@arslinux-01 phpredis-develop]# cd /usr/local/src/
[root@arslinux-01 src]# cd php-7.1.25/
[root@arslinux-01 php-7.1.25]# cd ext/zip/
[root@arslinux-01 zip]# ls
config.m4  config.w32  CREDITS  examples  lib  LICENSE_libzip  php_zip.c  php_zip.h  tests  TODO  zip_stream.c

·创建 configure

[root@arslinux-01 zip]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[root@arslinux-01 zip]# ls
acinclude.m4    config.guess  configure     examples        ltmain.sh        php_zip.c      TODO
aclocal.m4      config.h.in   configure.in  install-sh      Makefile.global  php_zip.h      zip_stream.c
autom4te.cache  config.m4     config.w32    lib             missing          run-tests.php
build           config.sub    CREDITS       LICENSE_libzip  mkinstalldirs    tests

·安装

[root@arslinux-01 zip]# ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@arslinux-01 zip]# make && make install
[root@arslinux-01 zip]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so  zip.so

·添加extension=zip.so

[root@arslinux-01 zip]# vim /usr/local/php7/etc/php.ini
extension=zip.so
[root@arslinux-01 zip]# /usr/local/php7/bin/php -m |grep zip
zip


扩展

几种限制ip的方法 http://ask.apelearn.com/question/6519

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

apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/   http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html

apache rewrite 出现死循环 http://ask.apelearn.com/question/1043

php错误日志级别参考  http://ask.apelearn.com/question/6973



课堂笔记


/usr/local/php

/usr/local/php/bin/

pecl

pecl  install  redis

pecl install  memcache

http://pecl.php.net/package-search.php