关于aws上RHEL-7.5_HVM部署自封iptables脚本+openresty及waf模块部署,


一、开启ami,使用putty登录,登录名默认ec2-user
1、根据官网提供的方法登录连接到EC2服务器(官网推荐windows用户使用PUTTY连接)
2、 创建root的密码,输入如下命令:
sudo passwd root
3、然后会提示你输入new password。输入一个你要设置的root的密码,需要你再输入一遍进行验证。
4、接下来,切换到root身份,输入如下命令:
su root
二、安装openresty配置waf防火墙,不需要编译nginx
①安装依赖包和创建nginx运行的普通用户

[root@linux-node1 ~]# yum install -y readline-devel pcre-devel openssl-devel
[root@linux-node1 src]# useradd -s /sbin/nologin -M www
②下载当前最新的luajit,并编译
[root@linux-node1 ~]# cd /usr/local/src/
[root@linux-node1 src]# wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz(win本地下载,后scp工具上传)
[root@linux-node1 src]# tar -xzf LuaJIT-2.0.5.tar.gz
[root@linux-node1 src]# cd LuaJIT-2.0.5
[root@linux-node1 LuaJIT-2.0.5]# make (yum install -y gcc 之后的安装需要gcc包)&& make install
[root@linux-node1 LuaJIT-2.0.5]# export LUAJIT_LIB=/usr/local/lib
[root@linux-node1 LuaJIT-2.0.5]# export LUAJIT_INC=/usr/local/include/luajit-2.0
[root@linux-node1 ~]# ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

一定创建此软连接,否则会报错

如果不创建符号链接,可能出现以下异常: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
③下载并编译安装openresty

[root@linux-node1 ~]#cd /usr/local/src
[root@linux-node1 src]# wget https://openresty.org/download/openresty-1.11.2.2.tar.gz

[root@linux-node1 src]#tar -zxf openresty-1.11.2.2.tar.gz
[root@linux-node1 src]#cd ngx_openresty-1.11.2.2
yum install perl
[root@linux-node1 ngx_openresty-1.11.2.2]# ./configure –prefix=/usr/local/openresty \
–user=www \
–group=www \
–with-luajit \
–with-http_v2_module \
–with-http_stub_status_module \
–with-http_ssl_module \
–with-http_gzip_static_module \
–with-ipv6 –with-http_sub_module \
–with-pcre \
–with-pcre-jit \
–with-file-aio \
–with-http_dav_module
[root@linux-node1 ngx_openresty-1.11.2.2]#gmake && gmake install
⑤测试并启动nginx

[root@linux-node1 ~]#/usr/local/openresty/nginx/sbin/nginx -t
[root@linux-node1 ~]#/usr/local/openresty/nginx/sbin/nginx

三、WAF部署
①本地下载好waf文件,scp传到ec2-user
[root@linux-node1 ~]# cp -r /home/ec2-user/waf/ /usr/local/openresty/nginx/conf/

②修改Nginx的配置文件,加入(http字段)以下配置。注意路径,同时WAF日志默认存放在/tmp/日期_waf.log

[root@linux-node1 ~]# cd /usr/local/openresty/nginx/conf
[root@linux-node1 conf]# vi nginx.conf
http {
include mime.types;
default_type application/octet-stream;
lua_shared_dict limit 50m; #防cc使用字典,大小50M
lua_package_path “/usr/local/openresty/nginx/conf/waf/?.lua”;
init_by_lua_file “/usr/local/openresty/nginx/conf/waf/init.lua”;
access_by_lua_file “/usr/local/openresty/nginx/conf/waf/access.lua”;
#log_format main ‘remoteaddrremote_user [timelocal]"request” ’
测试地址/.sql
显示拦截,说明成功
四、自封ip脚本

!/bin/bash

Author:ZhangGe

Desc:Auto Deny Black_IP Script.

Date:2014-11-05

取得参数$1为并发阈值,若留空则默认允许单IP最大50并发(实际测试发现,2M带宽,十来个并发服务器就已经无法访问了!)

if [[ -z 1]];thennum=50elsenum=1
fi

巧妙的进入到脚本工作目录

cd (cd(dirname $BASH_SOURCE) && pwd)

请求检查、判断及拉黑主功能函数

function check(){
iplist=netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk -v str=$num '{if ($1>str){print $2}}'
if [[ ! -z $iplist ]];
then

./black_ip.txt
for black_ip in $iplist
do
#白名单过滤中已取消IP段的判断功能,可根据需要自行修改以下代码(请参考前天写的脚本)
#exclude_ip=echo $black_ip | awk -F"." '{print $1"."$2"."$3}'
#grep -q excludeip./whiteip.txtgrepqblack_ip ./white_ip.txt
if [[ ?eq0]];thenechoblack_ip (white_ip)” >>./black_ip.txt
else
echo blackip>>./blackip.txtiptablesnL|grepblack_ip ||(iptables -I INPUT -s black_ip -j DROP & echo “black_ip date +%Y-%m-%H:%M:%S“>>./deny.log & echo 1 >./sendmail)
fi
done

    fi

}

间隔10s无限循环检查函数

while true
do
check
#每隔10s检查一次,时间可根据需要自定义
sleep 10
done
二、执行脚本

将以上代码保存为 deny_blackip.sh 之后,进入到脚本文件所在目录,然后使用如下命令后台执行脚本(后面的 50 表示并发数,可自行调整):
kill -s -9 id
pkill -s -9 id

三、附加说明

①、脚本发邮件需要安装 sendmail,若未安装请执行 yum -y install sendmail 安装并启动即可;
②、若要停止后台运行的脚本,只要使用 ps aux 命令找到该脚本的 pid 线程号,然后执行 kill -9 pid 号即可结束;
③、关于脚本的单 IP 并发限制,我实际测试同时打开博客多个页面并持续刷新,顶多也就产生十来个并发,所以单 IP 超过 50 个并发就已经有很大的问题了!当然,文章的阈值设为 50 也只是建议值,你可以根据需求自行调整(如果网站静态文件未托管到 CDN,那么一个页面可能存在 10 多个并发);
④、写这个脚本,主要是为了弥补用 crontab 执行时间间隔最低只能是 1 分钟的不足,可以让 CC 防护更严密,甚至每隔 1S 执行一次!虽说脚本不怎么占用资源,不过还是建议 10s 执行一次为佳,不用太过极端是吧?
⑤、对于白名单过滤,只要将白名单 IP 保存到脚本同一目录下的 white_ip.txt 文件中即可,若发现攻击 IP 在白名单中,脚本不会直接拉黑,而是发一封邮件给你,让你自己判断这个白名单攻击你是为毛?如果白名单需要支持 IP 段,请参考我前天写的脚本即可。

参考:
https://zhangge.net/4649.html

https://blog.csdn.net/m0_37886429/article/details/73178889

后记:waf之前用的modsecurity+CRS 但是效果不明显,估计是crs不熟悉。

相关内容

    暂无相关文章