2020-11-08

Nginx安全日志配置与封禁策略


nginx


http{



#记录真实IP


map $http_x_forwarded_for $clientRealIp {

"" $remote_addr;

~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;

}

log_format cdn '$clientRealIp - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';


#REMOTE_ADDR:节点IP

#HTTP_X_FORWARDED_FOR:网民电脑IP,代理IP1,代理IP2

#HTTP_X_REAL_FORWARDED_FOR:网民电脑IP

#HTTP_X_CONNECTING_IP:代理IP2


#防止CC


#注意如果采用UA方式识别,要选择非常少见的UA标识,否则会造成误杀。

#map $http_user_agent $agent {

#default "";

#~*X11 $http_user_agent;

#~*Ubuntu $http_user_agent;

#}


map $request_uri $r_agent {

default "";

~*home.php\?mod=space&uid $clientRealIp;

~*sec\.baidu\.com $clientRealIp;

}

map $http_user_agent $agent {

default $r_agent;

~*X11 $clientRealIp;

~*Ubuntu $clientRealIp;

~*bingbot "";

~*yahoo "";

~*Googlebot "";

~*Baiduspider "";

~*Sogou "";

~*360Spider "";

}


#用来限制同一时间连接数,即并发限制

名称设定为TotalConnLimitZone

limit_conn_zone $agent zone=TotalConnLimitZone:20m ;

limit_conn_log_level notice;


#用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"

名称设定为ConnLimitZone

limit_req_zone $agent zone=ConnLimitZone:20m rate=10r/s;

limit_req_log_level notice;


#IP黑名单

geo $clientRealIp $banip {

default 0;

include blockip.conf; #格式 xxx.xxx.xxx.xxx 1;

}



server

{

#记录CC拦截引起的503错误,防止误杀。

location ~ /ErrorPages/503\.html$

{

root /home/wwwroot/lnmp2015/domain/wfun.com/web;

access_log /home/wwwroot/lnmp2015/logs/err_503.log cdn; #access_log end combined


}


#识别IP黑名单,禁止访问

if ($banip = 1) {

return 403;

}


#以下可在伪静态里面设置

location ~ .*\.php$

{

limit_conn TotalConnLimitZone 50; #并发为 50 ,相当于最大开50个线程

limit_req zone=ConnLimitZone burst=10 nodelay; #最多 10 个排队, 由于每秒处理 20 个请求 + 10个排队,因此每秒最多刷新30次。


}

#防木马执行

location ~ /(attachment|upload|mov|center|static|zone|jkb|000|a\_img)/.*\.(php|php5|PHP|PHP5)?$ {

deny all;

}


}

}


sh -vx 123.sh


编辑自动任务

crontab -e

检查进程

tail -f /var/log/cron

给予执行权限

chmod +x


自动封禁非法IP


ban_ip.sh


#!/bin/bash

max=5 #我们设定的最大值,当访问量大于这个值得时候,封锁

confdir=/home/wwwroot/lnmp2015/vhost/blockip.conf #nginx封锁配置文件路径

logdir=/home/wwwroot/lnmp2015/logs/err_503.log #nginx访问日志文件路径

echo "">$confdir #先把封锁配置文件中的内容清空

cat $logdir|awk '{print $1}'|sort|uniq -c|sort -n|while read line #截取IP段

do

a=(`echo $line`)

if [ $a -ge $max ] #比较每个访问IP是否大于设定的max值

then

echo "${a[1]} 1;">>$confdir #把“deny IP;”语句写入封锁配置文件中

fi

done

amh lnmp vhost_reload lnmp2015


#iptables -I INPUT -p tcp --dport 80 -s ${a[1]} -j DROP #把访问量大于设定值的IP加入的防火墙规则中,开CDN无效



day_log.sh


#!/bin/bash

#设置日志文件存放目录

LOG_HOME="/home/wwwroot/lnmp2015/logs/"

#备分文件名称

LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".wfun.com-access.log

#重命名日志文件

mv ${LOG_HOME}/wfun.com-access.log ${LOG_HOME}/${LOG_PATH_BAK}.log

#向nginx主进程发信号重新打开日志

if [ -f /usr/local/nginx-1.10/logs/nginx.pid ]; then

kill -USR1 `cat /usr/local/nginx-1.10/logs/nginx.pid`

fi



/etc/logrotate.d/nginx 系统自带切割(推荐)


/home/wwwroot/lnmp2015/logs/wfun.com-access.log {

daily

rotate 5

nocompress

sharedscripts

dateext

create

postrotate

if [ -f /usr/local/nginx-1.10/logs/nginx.pid ]; then

kill -USR1 `cat /usr/local/nginx-1.10/logs/nginx.pid`

fi

endscript

}


00 04 * * *  /usr/sbin/logrotate -f /etc/logrotate.d/nginx



inotifywait.sh 文件监控


#!/bin/bash

inotifywait -mrq -e modify,create,move,delete,attrib --exclude ^.+\.[^php]$ --fromfile '/home/file-list' --timefmt '%Y/%m/%d %H:%M' --format '%T %w%f %e' >> /home/log/file.log



chmod u+x /root/inotifywait.sh

开机启动:echo "nohup /root/inotifywait.sh &" >> /etc/rc.d/rc.local

直接后台运行:nohup /root/inotifywait.sh &



yum install -y inotify-tools

nohup inotifywait -mrq -e modify,create,move,delete,attrib --exclude ^.+\.[^php]$ --fromfile '/home/file-list' --timefmt '%Y/%m/%d %H:%M' --format '%T %w%f %e' >> /home/log/file.log &