11.28 限定某个目录禁止解析phpphp
11.29 限制user_agent(防止cc攻击)html
11.30/11.31 php相关配置linux
扩展shell
apache开启压缩 http://ask.apelearn.com/question/5528apache
apache2.2到2.4配置文件变动 http://ask.apelearn.com/question/7292vim
apache options参数 http://ask.apelearn.com/question/1051浏览器
apache禁止trace或track防止xss http://ask.apelearn.com/question/1045安全
apache 配置https 支持ssl http://ask.apelearn.com/question/1029服务器
11.28 限定某个目录禁止解析php:php7
通常针对放图片的目录禁止解析php文件。防止被黑客拿到root权限,把php文件放到图片的目录下,就会很危险。由于php有一些危险的函数,若是开放了,确定会被上传一些木马文件,这种行为通常存在放容许上传图片的那个目录下,在这个目录里上传了php文件
知识点:上传图片的目录,99%的几率不须要解析php
核心配置文件内容
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off 若是只是单纯禁止解析.php的,只加这一行便可
<FilesMatch (.*)\.php(.*)> 此处又使用了FilesMatch,其实upload目录下的,php目录就被限制了
Order allow,deny
deny from all 此处的deny是由于,若是不加deny会直接访问源代码,不太友好
<FilesMatch>
</Directory>
curl测试时直接返回了php源代码,并未解析。-I会显示200,但已提示没法解析php
浏览器上测试会直接下载这个文件
实例:
[root@axinlinux-01 ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off
<FilesMatch (.*)\.php(.*)> 此处并加入了限制php的访问。更加安全
Order allow,deny 需注意此处,deny放在后面为最终结果
deny from all
</FilesMatch>
</Directory>
[root@axinlinux-01 upload]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@axinlinux-01 upload]# /usr/local/apache2/bin/apachectl graceful
curl -x192.168.159.128:80 http://111.com/upload/123.php
<?php
[root@axinlinux-01 111.com]# curl -x192.168.159.128:80 'http://111.com/upload/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 07 Aug 2018 14:10:00 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Last-Modified: Tue, 07 Aug 2018 14:03:35 GMT
ETag: "1a-572d8dc218805"
Accept-Ranges: bytes
Content-Length: 26
Content-Type: application/x-httpd-php
----------------------------------------------------------------------------------------------------------------------------------------------------
11.29 限制user_agent:
cc攻击:黑客利用本身手里的肉鸡同时去访问一个网站或论坛,访问量过大,被攻击服务器必然会挂掉。称为cc攻击
cc攻击的规律:就是他的user_agent是一致的,并且访问频率很快,一秒访问N次。知足这样的特征就能断定为cc攻击
可经过限制他的user_agent,实现减轻服务器的压力:
user_agent能够理解为浏览器标识
核心配置文件内容
<IfModule mod_rewrite.c> 用到了rewrite模块(以前实现了域名跳转)
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR] 这两行都是定义条件
NC表明忽略大小写(由于user_agent里会有大写),OR是这两行的链接符,是这两行的知足条件为或者关系。不加OR就是而且关系。也就是上下两行同时知足(user_agenr中不可能同时知足)
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F] F表明Forbidden的意思。就是直接Forbidden(用法比较特殊)
</IfModule>
curl -A "123123" 指定user_agent
实例:
[root@axinlinux-01 upload]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
[root@axinlinux-01 upload]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@axinlinux-01 upload]# /usr/local/apache2/bin/apachectl graceful
[root@axinlinux-01 upload]# curl -x192.168.159.128:80 http://111.com/123.php -I
HTTP/1.1 403 Forbidden
Date: Tue, 07 Aug 2018 14:54:04 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1
[root@axinlinux-01 upload]# curl -A "axin axin" -x192.168.159.128:80 http://111.com/123.php -I -A指定user_agent
HTTP/1.1 200 OK
Date: Tue, 07 Aug 2018 14:55:04 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
----------------------------------------------------------------------------------------------------------------------------------------------------
11.30/11.31 php相关配置:
~1.
关于查找准确的php配置文件:
查看php配置文件位置
好比要找111.com的PHP位置。在111.com的目录下建立phpinfo的文件,在到浏览器上查询。详见实例1
/usr/local/php/bin/php -i|grep -i "loaded configuration file" 这个方法不太准
~2.
关于定义时区:
date.timezone 定义时区(有时候会有告警信息) date.timezone=Asis/Shanghai 详见实例2
~3.
关于禁掉危险函数:
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。由于黑客会经过访问phpinfo来获取信息。避免暴露
以上为,较危险的php函数(其中eval就是一句话木马所用到的函数)。针对这些作一些限制。详见实例3
~4.
关于错误日志:
display_errors, log_errors,error_log,error_reporting
display_errors:咱们若是把phpinfo禁掉的话,他会在浏览器里显示错误日志,同样会暴露。改成display_errors=Off
log_errors,error_log,error_reporting:咱们改成display_errors=Off以后,要设置错误日志。步骤为,检查是否打开>设置路径>错误级别
以上详见实例4
~5.
open_basedir
一台服务器上多个站点作隔离。好比A网站在A目录下,B网站在B目录下,及时被攻击了A网站也只能在A目录里,B不受影响
假如这台服务器全部的站点都在111.com下。咱们在PHP的配置文件里设置open_basedir=/data/wwwroot/111.com:/tmp,也没有什么用。由于都在一个目录下。因此咱们能够在Apache的虚拟配置文件里设置,下面的配置:
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
以上加:/tmp/是由于,默认的临时文件在tmp下,若是被限制了,他本身临时的文件也写不了
php_admin_value这个命令能够定义php.ini里面的参数
不一样的虚拟主机限制不一样的 open_basedir
实例:
1.
[root@axinlinux-01 111.com]# ls
123.php abc.jpg admin index.php upload
[root@axinlinux-01 111.com]# vim index.php
(若是第二行没有加载就要复制一个
[root@axinlinux-01 php-5.6.32]# cd /usr/local/src/php-7.1.6/
[root@axinlinux-01 php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
cp:是否覆盖"/usr/local/php7/etc/php.ini"? y
[root@axinlinux-01 php-7.1.6]# /usr/local/apache2/bin/apachectl graceful)
以上咱们就找到了php的配置文件。(最准的)
2.
[root@axinlinux-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
;date.timezone =Asis/Shanghai 注意首字母大写(A S)
[root@axinlinux-01 php-7.1.6]# /usr/local/apache2/bin/apachectl graceful
3.
[root@axinlinux-01 ~]# vim /usr/local/php7/etc/php.ini 咱们第一步骤获得的配置文件路径
搜索 disable_functions,后面直接加上哪些危险的函数便可。由于咱们实验要用phpinfo,因此没有禁掉
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
[root@axinlinux-01 ~]# /usr/local/apache2/bin/apachectl graceful
4.
[root@axinlinux-01 php-7.1.6]# vim /usr/local/php7/etc/php.ini
display_errors = Off 搜索display_errors,改成Off(首字母大写)
以上为白页
定义错误日志,首先检查log_errors是否打开(On)
log_errors = On
搜索error_log,设置错误路径
; Example:
error_log = /tmp/php_errors.log 这一行,前面加上目录便可,不要更名字
; Log errors to syslog (Event Log on Windows)
若是咱们在建立错误日志的时候,不能生成php_errors.log。就要先touch一个,并给他设置一个777的权限
[root@axinlinux-01 php-7.1.6]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log
[root@axinlinux-01 php-7.1.6]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@axinlinux-01 php-7.1.6]# /usr/local/apache2/bin/apachectl graceful
[root@axinlinux-01 php-7.1.6]# cat /tmp/php_errors.log
[07-Aug-2018 17:02:32 UTC] PHP Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
搜索error_reporting,设置错误的记录级别。生产环境设置为E_ALL & ~E_NOTICE。搜索的时候上面有选择,直接复制,后面括号的不用复制。
error_reporting = E_ALL ALL表明全部的都记录
5.
[root@axinlinux-01 php-7.1.6]# !vim
vim /usr/local/php7/etc/php.ini
open_basedir = /data/wwwroot/111.com/:/tmp
[root@axinlinux-01 php-7.1.6]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/" 在不一样的虚拟主机里加上不一样的 open_basedir 便可,直接输入这一行
[root@axinlinux-01 php-7.1.6]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@axinlinux-01 php-7.1.6]# /usr/local/apache2/bin/apachectl graceful