LAMP架构(访问控制之限制php解析、限制user_agent、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减轻服务器压力

编辑虚拟机配置文件

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

核心配置文件代码如下:

<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>

重新加载文件

/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”,可以直接被访问

[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

再次查看日志已经正常显示:

[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攻击解释

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

转载于:https://my.oschina.net/yolks/blog/1924185

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值