BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改

在当前互联网极速发展的时代,网络攻击手段也在极速的发展中,比如之前虾皮路知道的因为BT宝塔面板爆出的重大安全问题《突发!BT宝塔面板爆出重大漏洞 数据库无需口令直接登陆》,由于种种问题导致网站服务器被黑客渗透。其实通过一些设置,可以让自己网站的安全防御抵挡大部分的安全攻击等。下面就来介绍一下如何使用BT宝塔的插件,让黑客寸步难行。

一、Nginx防火墙插件和企业级防篡改插件联动   

用过企业级防篡改的人都知道,企业级防篡改有些目录是不进行监控的,相当于白名单的意思,这就给了黑客一个突破的点,如果他们可以把php文件写入到那些不监控的目录,那么就成功突破了企业级防篡改插件,不过我们可以利用Nginx防火墙来进行补掉这个点。例如有如下代码

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图

他把文件写入到了config目录下的a.php中,然后在企业级防篡改中默认是不监控config目录的,所以写入的时候会写入成功

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(1)

写入php内容

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(2)

可以看到是没有报错,那代表是写入成功的意思。访问config/a.php

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(3)

不过我们可以在Nginx防火墙中,把那些企业级防篡改排除的目录加入到Nginx防火墙的URL黑名单中,这样别人就不可以访问到这个php文件了

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(4)

设置完成后访问刚刚写入的a.php

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(5)

除了防火墙还可以使用堡塔php安全防护进行拦截还是刚刚的案例。这里使用的不允许config  访问

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(6)

再次访问config/a.php

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(7)

也是达到了一样的效果

思路总结:      

利用黑白名单的思路,来结合两个防护插件的不足之处相互补充的地方。这样可以更好的守护网站的安全。

二、Nginx防火墙插件和PHP安全防护的联动    

Nginx防火墙可以防御一些基本且常见的漏洞,但是某些低版本是存在绕过的问题(建议升级到最新版版)。所以这个时候使用堡塔的PHP安全防护就是特别有必要的地方了。

例如典型的thinkphp的代码执行漏洞,使用如下payload

?s=index/think\app/invokefunction&function=array_map&vars[]=assert&vars[][]=phpinfo();

显示防火墙拦截了

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(8)

使用如下payload

?s=index/think\app/invokefunction&function=array_map&vars[]=assert&vars[][]='phpinfo'();

假设绕过了Nginx防火墙

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(9)

配合上我们的堡塔php安全防护,并且制定tp5.0规则

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(10)

再次使用刚刚的Payload,成功拦截掉了

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(11)

不过这里会暴露我们网站的绝对路径,按照下面配置屏蔽错误信息

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(12)

保存然后重启php服务,配置就生效了,再次访问

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(13)

思路总结:     

利用多层次的防御手段会有更多方面的一个安全效果。

三、攻击及防御测试   

下面先用一个有漏洞的网站进行测试假设下面是黑客攻击的目标

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(14)

假设黑客通过fuzz手段成功找到了一个任意文件读取漏洞

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(15)

通过读取配置成功获取到一个外部链接的mysql账号密码

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(16)

发现进去mysql不可以执行命令,黑客想起网站的界面是一个典型的tp的网站,直接使用payload测试了一下发现有这个漏洞,就直接上传大马来执行命令,假设站点没有禁用system函数

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(17)

这样黑客就已经成功获取到了www用户的权限,最后黑客就会通过一些漏洞进行提权操作,这里就不演示了

防御方案

Nginx防火墙+PHP安全防护+企业级防篡改+OpenRasp+防提权为什么要用这么多插件才可以抵御大部分的攻击呢?这些插件都是根据黑客攻击流程进行定制的。

黑客一般攻击流程:寻找网站程序漏洞->查找该cms或框架是否有漏洞->上传木马->执行命令->提权

首先按照前面的Nginx防火墙加上企业级防篡改联动进行配置,把排除的目录放到Nginx的URI中

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(18)
BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(19)

然后就是根据我们使用的框架或者cms,配置属于他的规则

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(20)

开启OpenRasp

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(21)

最后就是开启防提权了

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(22)

刚刚的文件包含漏洞,拦截

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(23)

tp5的rce,拦截

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(24)

假设黑客都成功绕过了上面的拦截,接下来就是利用WebShell执行命令了,直接被OpenRasp拦截

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(25)

假设绕过了OpenRasp,黑客肯定要尝试进行系统命令执行,被宝塔防提权拦截,如果设置了提醒还会发邮件提醒,让你第一时间收到网站被黑的消息

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(26)

总结:     通过各个方面去剖析黑客的一个攻击流量。然后达到一个各个方向的一个防御。和通过这种案例来结合实际的用法。能更好的达到一个防御的效果

四、Nginx 记录POST记录并设置日志只允许追加   

之前想融入到默认配置中。但是还是有一些会出现疑问。只能以文章的形式来配置之前想过异步的存储日志的方式,尝试udp 的方式也是挺消耗性能,未找到一种合理的解决方案。

1、Nginx 的默认日志文件如下

#设定日志格式,main是默认的格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

2、Nginx的内置函数

$args                    #请求中的参数值
$query_string            #同 $args
$arg_NAME                #GET请求中NAME的值
$is_args                 #如果请求中有参数,值为"?",否则为空字符串
$uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #当前请求的文档根目录或别名
$host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname                #主机名
$https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent              #传输给客户端的字节数
$connection              #TCP连接的序列号
$connection_requests     #TCP连接当前的请求数量
$content_length          #"Content-Length" 请求头字段
$content_type            #"Content-Type" 请求头字段
$cookie_name             #cookie名称
$limit_rate              #用于设置响应的速度限制
$msec                    #当前的Unix时间戳
$nginx_version           #nginx版本
$pid                     #工作进程的PID
$pipe                    #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr             #客户端地址
$remote_port             #客户端端口
$remote_user             #用于HTTP基础认证服务的用户名
$request                 #代表客户端的请求地址
$request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file       #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method          #HTTP请求方法,通常为"GET"或"POST"
$request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #请求使用的Web协议,"http" 或 "https"
$server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name             #服务器名
$server_port             #服务器端口
$server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status                  #HTTP响应代码
$time_iso8601            #服务器时间的ISO 8610格式
$time_local              #服务器时间(LOG Format 格式)
$cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",使用$http_accept_language即可
$http_cookie
$http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent         #用户终端浏览器等信息
$http_x_forwarded_for
$sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding

如果只是记录POST的话。只需要加一个参数$request_body

如下

log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status  $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(27)

然后找到网站的配置文件

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(28)

点击保存即可。访问之后呢,返回的日志格式为

<blockquote>192.168.10.1 - - [06/Aug/2020:15:55:41 +0800] "GET / HTTP/2.0" 304  0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" "-" "-"

POST 的日志的记录会在最后面。这样不影响大多数数据分析工具。

3、设置日志只允许追加

有时候大多数情况下,黑客都会及时的清理日志。这个时候需要配置一些让人恶心的动作了

chattr +a /www/wwwlogs/*.log

当对方尝试清空日志的时候

BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改插图(29)

会被直接拒绝清空日志。有时候会碰到日志切割的问题。只需要在日志切割的地方取消a 然后切割完之后加上去即可取消a 的方法

chattr -a /www/wwwlogs/*.log

安全防御设置总结

如上的方式是为了能让所有的访问日志不留余力的在你面前展示。可以通过这些攻击日志来确认你的漏洞点的位置,能达到一个及时响应的一个效果。

PS:这个需要自己一个个做设置,网站多的话可能会自闭

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

虾皮路版权所有,未经允许不得转载:虾皮路 » BT宝塔网站安全防御高级设置-Nginx防火墙/企业级防篡改

分享到: 更多 (0)
坚持下去不容易,打个赏呗

评论 抢沙发

  • QQ号
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活