Nginx日志實(shí)現(xiàn)訪問異常報(bào)警詳解
前言
在工作中為了防止一些惡意訪問的行為,例如不斷的請求刷流量,通過實(shí)時(shí)過濾Nginx訪問日志,將單位時(shí)間內(nèi)訪問次數(shù)達(dá)到指定閥值的來源ip及時(shí)的通知系統(tǒng)管理員,這里通過郵件的方式通知。
監(jiān)控腳本
vim /opt/nginx/sbin/nginx_log_monitor.sh
#!/bin/bash #日志文件 logfile=/opt/nginx/logs/www #開始時(shí)間 start_time=`date -d"$last_minutes minutes ago" +"%H:%M:%S"` #結(jié)束時(shí)間 stop_time=`date +"%H:%M:%S"` #過濾出單位之間內(nèi)的日志并統(tǒng)計(jì)最高ip數(shù) tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($4,RSTART+14,21);if(t>=st && t<=et) {print $0}}' \ | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10 ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'` # 單位時(shí)間[1分鐘]內(nèi)單ip訪問次數(shù)超過200次,則觸發(fā)郵件報(bào)警 if [[ $ip_top -gt 200 ]];then /usr/bin/python /opt/tools/send_mail.py & fi
chmod +x /opt/nginx/sbin/nginx_log_monitor.sh
定時(shí)任務(wù)
如上腳本監(jiān)控一分鐘內(nèi)的日志,因此每分鐘執(zhí)行一次:
# crontab -e */1 * * * * /bin/bash /opt/nginx/sbin/nginx_log_monitor.sh
郵件告警
這里通過python實(shí)現(xiàn)發(fā)送郵件
# vim /opt/tools/send_mail.py
# -*- coding: utf-8 -*- from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from datetime import datetime import os import smtplib def _format_addr(s): name, addr = parseaddr(s) return formataddr((Header(name, 'utf-8').encode(), addr)) # 郵箱定義 smtp_server = 'smtp.exmail.qq.com' smtp_port = 465 from_addr = 'chenqingkang@qiniu.com' password = os.environ.get('MAIL_PASSWD') to_addr = ['810959120@qq.com'] # 郵件對象 msg = MIMEMultipart() msg['From'] = _format_addr('發(fā)件人 <%s>' % from_addr) msg['To'] = _format_addr('收件人 <%s>' % to_addr) msg['Subject'] = Header('Warning:單ip請求次數(shù)異常', 'utf-8').encode() # 獲取系統(tǒng)中要發(fā)送的文本內(nèi)容 with open('/opt/nginx/logs/log_ip_top10', 'r') as f: line = f.readline().strip() line = line.split(" ") print(line) # 郵件正文是MIMEText: html = '<html><body><h2>一分鐘內(nèi)單ip請求次數(shù)超過閥值</h2>' + \ '<p>ip:%s 請求次數(shù)/min:%s</p>' % (line[1],line[0]) + \ '</body></html>' msg.attach(MIMEText(html, 'html', 'utf-8')) server = smtplib.SMTP_SSL(smtp_server, smtp_port) server.login(from_addr, password) server.sendmail(from_addr, to_addr, msg.as_string()) server.quit()
示例
寫個(gè)腳本不停curl請求資源觸發(fā)報(bào)警:
# vim curl.sh
#!/bin/bash #example:curl.sh http://www.qingkang.me 100 usage() { echo "usage: `basename $0` url count" } if [ $# -ne 2 ]; then usage exit 1 fi for i in `seq 1 $2`;do http_code=`curl -o /dev/null -s -w %{http_code} $1` echo $1 $http_code done
# bash curl.sh http://qingkang.me/ 5 http://qingkang.me/ 200 http://qingkang.me/ 200 http://qingkang.me/ 200 http://qingkang.me/ 200 http://qingkang.me/ 200
調(diào)低閥值觸發(fā)告警:
一分鐘內(nèi)單ip請求次數(shù)超過閥值 ip:115.231.182.82 請求次數(shù)/min:27
完善
這里僅實(shí)現(xiàn)了郵件告警功能,實(shí)際上還可以實(shí)現(xiàn)自動屏蔽惡意訪問的ip??梢酝ㄟ^Nginx deny來實(shí)現(xiàn),也可以iptables -I INPUT -s x.x.x.x -j DROP通過iptables屏蔽。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家能有一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
nginx配置PC站手機(jī)站分離實(shí)現(xiàn)重定向
這篇文章主要介紹了nginx配置PC站手機(jī)站分離實(shí)現(xiàn)重定向,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Nginx部署SpringBoot項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了Nginx部署SpringBoot項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Nginx+ModSecurity安全模塊部署的實(shí)現(xiàn)
本文主要介紹了Nginx+ModSecurity安全模塊部署的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08實(shí)例詳解SpringBoot+nginx實(shí)現(xiàn)資源上傳功能
這篇文章主要介紹了SpringBoot+nginx實(shí)現(xiàn)資源上傳功能,由于小編最近在使用nginx放置靜態(tài)資源問題,遇到很多干貨,特此分享到腳本之家平臺,供大家參考,需要的朋友可以參考下2019-10-10Linux 系統(tǒng) nginx 服務(wù)器安裝及負(fù)載均衡配置詳解
nginx(engine x) 是一個(gè) 高性能 的 HTTP 和 反向代理 服務(wù)器、郵件代理服務(wù)器以及通用的 TCP/UDP 代理服務(wù)器。這篇文章主要介紹了Linux 系統(tǒng) nginx 服務(wù)器安裝及負(fù)載均衡配置詳解,需要的朋友可以參考下2019-07-07