使用Python定时从Nginx的日志中获取黑客的ip并加入访问黑名单

2024-11-07 11:01 使用Python定时从Nginx的日志中获取黑客的ip并加入访问黑名单已关闭评论

查看nginx日志经常会看到一些特殊的访问地址(包含十六禁止字符串请求),怀疑这些请求为非法请求,禁止包含特定字符请求对应的ip地址访问,保护服务器资源。

使用python实现一个定时脚本,分析 Nginx 日志中的异常请求并自动将可疑 IP 添加到黑名单,可以使用 Python 和一些基本的正则表达式。

实现思路

  1. 读取 Nginx 日志文件:打开并读取 /var/log/nginx/access.log 文件,逐行分析。

  2. 检测异常请求:使用正则表达式,查找包含特定十六进制字符串的请求(如 \x16\x03\x01 等)。这些字符串可能表示非正常访问或攻击请求。

  3. 提取 IP 地址:从符合条件的日志条目中提取 IP 地址。

  4. 更新黑名单文件:将新提取的 IP 地址添加到 /etc/nginx/includes/blackListIp.conf 文件中,确保不会重复添加。

  5. 刷新 Nginx 配置:使用命令 nginx -s reload 使更改生效。

  6. 定时执行脚本:使用 cron 作业或 schedule 库每隔一段时间执行脚本。

详细代码

import re
import subprocess
from datetime import datetime

# 日志文件和黑名单文件路径
NGINX_LOG_FILE = '/var/log/nginx/access.log'
BLACKLIST_FILE = '/etc/nginx/includes/blackListIp.conf'

# 正则表达式匹配含十六进制特殊字符的请求
HEX_PATTERN = re.compile(r'\\x[0-9A-Fa-f]{2}')
IP_PATTERN = re.compile(r'(\d{1,3}\.){3}\d{1,3}')

def extract_suspicious_ips(log_file):
    """从Nginx日志中提取可疑的IP地址"""
    suspicious_ips = set()
    with open(log_file, 'r') as file:
        for line in file:
            # 检查行中是否包含特殊十六进制字符
            if HEX_PATTERN.search(line):
                # 提取IP地址
                match = IP_PATTERN.search(line)
                if match:
                    ip_address = match.group(0)
                    suspicious_ips.add(ip_address)
    return suspicious_ips

def update_blacklist(blacklist_file, suspicious_ips):
    """更新黑名单文件,添加新的可疑IP"""
    # 读取现有的黑名单文件
    existing_ips = set()
    with open(blacklist_file, 'r') as file:
        for line in file:
            ip_match = IP_PATTERN.search(line)
            if ip_match:
                existing_ips.add(ip_match.group(0))

    # 计算新的IP列表
    new_ips = suspicious_ips - existing_ips
    if not new_ips:
        print(f"{datetime.now()}: 没有新的可疑IP需要添加。")
        return False

    # 将新的IP写入黑名单文件
    with open(blacklist_file, 'a') as file:
        for ip in new_ips:
            file.write(f"deny {ip};\n")

    print(f"{datetime.now()}: 添加新的可疑IP到黑名单: {', '.join(new_ips)}")
    return True

def reload_nginx():
    """重新加载Nginx配置"""
    try:
        subprocess.run(['nginx', '-s', 'reload'], check=True)
        print(f"{datetime.now()}: 成功重新加载Nginx配置。")
    except subprocess.CalledProcessError:
        print(f"{datetime.now()}: 重新加载Nginx配置失败。")

def main():
    suspicious_ips = extract_suspicious_ips(NGINX_LOG_FILE)
    if update_blacklist(BLACKLIST_FILE, suspicious_ips):
        reload_nginx()

if __name__ == "__main__":
    main()

说明

  • 提取可疑 IPextract_suspicious_ips 函数会读取 Nginx 日志文件并识别包含十六进制字符的请求。
  • 更新黑名单update_blacklist 函数将新检测到的 IP 添加到黑名单文件中,避免重复添加。
  • 刷新 Nginx 配置reload_nginx 函数通过命令 nginx -s reload 使黑名单更新生效。

定时运行脚本

可以使用 cron 每隔一定时间(如每小时)自动运行此脚本:

# 编辑crontab
crontab -e

# 添加以下行,每小时运行脚本
0 * * * * /usr/bin/python3 /home/pythontools/script.py

注意事项

  • 脚本需要 root 权限来修改黑名单文件并重新加载 Nginx 配置。
  • 确保黑名单文件路径正确配置,并在 nginx.conf 中正确引用
  • 需要优化,考虑每次整个nginx日志文件读取内容长度很大,存在耗时并占用过多服务器资源,需要间隔时间内针对已经分析过的nginx日志不用重复分析,给出具体的优化策略提供选择

如果你使用过程中遇到什么问题,公众号回复咨询。

当前文章价值6元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3688.html ,谢谢支持!

资源分享

module导入Android Studio的两种方式,你用了吧? module导入Android Studio的两
面向抽象的编程思想之重写RecyclerView 面向抽象的编程思想之重写Recyc
python库pyQt基础教程二 python库pyQt基础教程二
php详细介绍正则表达式实际用法 php详细介绍正则表达式实际用法

评论已关闭!