11.25 配置防盗链
为了防止别人盗用你的网站上的资源,这些资源通常是指图片、视频、歌曲、文档等,配置防盗链是非常有必要的。
配置防盗链是对referer做的一些操作。配置防盗链方法:
1、编辑虚拟配置文件,添加以下内容。
其中:
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://aaa.com" local_ref
#SetEnvIfNoCase Referer "^$" local_ref
#访问的referer白名单。^$表示空referer,先把它注释掉不用。
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
#filemarch定义需要保护的文件,
#Order Allow,Deny 定义了访问控制顺序,这里表示先allow。
#Allow from env=local_ref 对上面白名单中的referer先允许,其它的deny掉。
2、测试。
在浏览其中直接访问111.com/baidu.png,会直接Forbidden。
我们用百度来作为 111.com/baidu.png 的referer。在百度中直接搜索 111.com/baidu.png 它会给你一个直接访问该站点的超链接。
点击访问仍然是Forbidden,这时我们可以把百度加入到referer白名单中,让她可以作为 111.com/baidu.png 的erferer白名单这样一来就可以正常跳转到 111.com/baidu.png了。
用curl测试。
curl命令 -e 选项可以为访问添加模拟referer。
用www.qq.com作为referer,出现403错误。改为111.com则显示正常。
11.26 访问控制Directory
对于一些比较重要的网站内容,除了可以使用用户认证限制访问之外,还可以通过限制IP来限制访问。
在访问配置中添加内容:
其中:
<Directory /data/wwwroot/111.com/admin/> 指定访问的目录。
Order deny,allow 指定执行deny和allow的顺序,deny在前面就先执行下面的deny语句。
Deny from all deny所有来源IP。
Allow from 127.0.0.1 在允许指定的源IP。
创建/data/wwwroot/111.com/admin/ 访问目录,添加文件1.php
用源IP为:127.0.0.1 和 192.268.37.200 分别访问,结果为:127地址允许,192的被拒绝。
同样用浏览器访问,也会被拒绝。若要不被拒绝可以把浏览器访问的源IP添加allow,这里应该是服务器的网关192.168.37.1。
查看访问日志可以看到,第一次访问被拒绝,第二次正常访问。
11.27 访问控制FilesMatch
访问控制除了目录,还可以对文件进行访问控制,用filesmatch语句。
测试访问,可以看到除了127.0.0.1外会被forbidden。
11.28 限定某个目录禁止解析php
对于一些php语言编写的网站,有些目录是需求上传图片的,但该目录有时会被黑客植入php代码写的木马,由于网站可以执行php程序,会被黑客获取到服务器权限。为了避免这种事情发生,我们可以限定某个目录禁止解析php。
1、配置方法为:
其中:
<FilesMatch (.*)\.php(.*)>
Order allow,deny
Deny from all
</FilesMatch>
表示禁止获取查看网站上的php代码。
2、测试访问upload目录中的php代码。
11.29 限制user_agent
user_agent,可以理解为浏览器标识。
1、主要配置:
其中:
<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配置第一个或第二个,两者是或者的关系。
NC:忽略大小写差别。
F:表示直接Forbidden掉。
2、测试访问,因为屏蔽了curl,所以用curl访问会forbidden,从日志文件中可以看到访问受限。
3、我们还可以用curl命令的 -A 选项来模拟user_agent,来访问httpd。
命令:curl -A "liang liang" -x127.0.0.1:80 111.com/index.php
11.30-11.31 PHP相关配置
php配置文件,我们可以用 /usr/local/php/bin/php -i|grep -i "loaded configuration file" 找到配置文件目录。
从php源码包中拷贝配置文件到 /usr/local/php/bin/php/etc 目录下。
cp /usr/local/src/php-7.1.6/php.ini-development /usr/local/php/etc/php.ini
1、禁用函数配置。
disable_functions
对于一些比较危险的函数,我们可以禁用掉,一般在生产环境中phpinfo函数是被禁用的。
禁用掉phpinfo函数后,在浏览器中使用phpinfo的程序是无法执行的。
2、设置date.timezone。
在配置文件中找到date.timezone,设置成Asia/Shanghai,时区不设置会有些告警信息。
3、日志相关的配置。
我们禁用掉phpinfo后提示信息打印到浏览器上,这样会暴露些目录信息,对diaplay_error=Off 配置可以不显示提示信息。
用curl访问没有任何输出,
这时需要配置一个错误日志。
开启错误日志。
定义错误日志路径。
定义error_log级别,如果级别较高的话,它会记录不太严谨的信息,在生产环境中我们不需要 E_ALL 级别,可以定义 E_ALL & ~E_NOTICE 就可以了。
错误日志文件 /tmp/php_errors.log 的属主属组一定是httpd服务的执行user,如果发现没有记录错误日志,可能是日志文件的属主属组没有写文件的权限。所以,在开启错误日志文件后我们首先把它的权限设置成 777 这样httpd的运行用户就可以有写的权限了。
[root@liang-00 ~]# curl -A "liang liang" -x127.0.0.1:80 111.com/index.php [root@liang-00 ~]# ls /tmp/php_errors.log /tmp/php_errors.log [root@liang-00 ~]# cat /tmp/php_errors.log [07-Dec-2018 03:44:36 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2 [root@liang-00 ~]# ll /tmp/php_errors.log -rw-r--r-- 1 daemon daemon 145 Dec 7 03:44 /tmp/php_errors.log [root@liang-00 ~]#
当禁用掉phpinfo函数时,错误日志会是 Warning: 级别的错误告警。如果是语法错误,那就是error级别的了。
[root@liang-00 ~]# curl -A "liang liang" -x127.0.0.1:80 111.com/2.php
[root@liang-00 ~]# cat /tmp/php_errors.log
[07-Dec-2018 03:44:36 Asia/Shanghai] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[07-Dec-2018 03:54:41 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 3
[root@liang-00 ~]#
4、安全相关的配置open_basedir。
open_basedir主要来定义站点隔离。一台服务器上运行了很多的站点,可能会出现某个站点出现安全问题,这样会影响到其它站点。
在php.ini配置文件中有相关的参数。
但是,一般我们不在PHP.ini中限制站点访问目录,而是在vhosts 中设置。
php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/"
在vhosts中可以定义php.ini相关的参数,open_basedir就是其中一个。
/tmp目录是默认存放访问该站时的临时缓存文件,要加入限制目录中。
11.32 PHP扩展模块安装
php安装完成后,有些模块是没有安装的,在这种情况下可以用扩展模块的形式添加模块。
编译redis模块,redis是一个nosql,一般是在lamp作为缓存用。
步骤:
1、下载编译resdis。
/usr/local/php/bin/phpize 操作生成configure文件。
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
make install 会把redis.so文件放在指定的目录下。
2、在php中加载redis模块。
查看扩展模块存放默认目录,可以在php.ini中自定义该路径。
/usr/local/php/bin/php -i |grep extension_dir
[root@liang-00 phpredis-develop]# /usr/local/php7/bin/php -i |grep 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 [root@liang-00 phpredis-develop]#
extension_dir可以自定义。所有的扩展模块都会放在此目录中。
在php.ini中添加redis模块。
在php的源码包ext目录中存在模块,就可以直接编译。