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 &