feat(security): 添加fail2ban集成防止暴力破解登录

- 新增fail2ban过滤器和监狱配置文件
- 修改登录视图记录客户端IP和认证失败日志
- 更新日志配置添加syslog处理器用于fail2ban检测
- 在README中添加fail2ban配置和使用文档
This commit is contained in:
2026-01-28 22:44:36 +08:00
parent f7692a6db6
commit ae95844177
5 changed files with 411 additions and 9 deletions

View File

@@ -196,13 +196,16 @@ LOGGING = {
'format': '[%(asctime)s] [%(levelname)s] [%(process)d] [%(module)s] %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'
},
'syslog': { # syslog格式用于fail2ban检测
'format': '%(name)s: %(levelname)s %(message)s'
},
},
'handlers': {
'file': { # 日志写入文件的处理器
'level': 'INFO', # 日志级别INFO及以上都记录ERROR/WARNING/INFO
'class': 'logging.handlers.RotatingFileHandler', # 日志轮转,防止文件过大
# ✅ 核心pathlib对象转字符串logging只接收字符串路径必转
'filename': str(LOG_DIR / 'all_in_one.log'),
'filename': str(LOG_DIR / 'all_in_one.log'),
'maxBytes': 1024 * 1024 * 100, # 单个日志文件最大100MB
'backupCount': 10, # 最多保留10个日志备份
'formatter': 'standard', # 使用上面定义的统一格式
@@ -213,6 +216,22 @@ LOGGING = {
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
'syslog': { # syslog处理器用于fail2ban检测登录失败
'level': 'WARNING',
'class': 'logging.handlers.SysLogHandler',
'address': '/dev/log', # Linux系统日志socket
'facility': 'local0',
'formatter': 'syslog',
},
'auth_file': { # 认证日志文件处理器(备选方案)
'level': 'WARNING',
'class': 'logging.handlers.RotatingFileHandler',
'filename': str(LOG_DIR / 'auth.log'),
'maxBytes': 1024 * 1024 * 50, # 50MB
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
},
# 所有日志器配置和原配置完全一致,无需任何修改
'loggers': {
@@ -226,6 +245,11 @@ LOGGING = {
'level': 'INFO',
'propagate': True,
},
'django.security.login': { # 登录安全日志用于fail2ban
'handlers': ['syslog', 'auth_file'],
'level': 'WARNING',
'propagate': False,
},
'celery': { # Celery客户端日志Django中提交任务的日志
'handlers': ['file'],
'level': 'INFO',