Add comprehensive fail2ban security configuration

- config/fail2ban/jail.local: Main jail configuration with SSH, web, and service protection
- config/fail2ban/filter.d/sshd-ddos.conf: SSH connection flooding protection
- config/fail2ban/filter.d/nginx-badbots.conf: Web scanner and bot detection
- config/fail2ban/filter.d/gitea-auth.conf: Gitea authentication failure detection
- Includes deployment instructions for automated IP banning
This commit is contained in:
2025-09-12 20:38:07 +02:00
parent 471659a95a
commit 9fbc311c2d
4 changed files with 134 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
# Fail2ban filter for Gitea authentication failures
# Deploy to: /etc/fail2ban/filter.d/gitea-auth.conf
[Definition]
failregex = .*Failed authentication attempt for .* from <HOST>
.*Invalid credentials from <HOST>
.*Login attempt failed .* from <HOST>
ignoreregex =

View File

@@ -0,0 +1,17 @@
# Fail2ban filter for nginx bad bots and scanners
# Deploy to: /etc/fail2ban/filter.d/nginx-badbots.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" (400|401|403|404|405|406|407|408|409|410|411|412|413|414|415|416|417|500|501|502|503|504|505)
^<HOST> -.*".*sqlmap.*"
^<HOST> -.*".*nikto.*"
^<HOST> -.*".*nmap.*"
^<HOST> -.*".*masscan.*"
^<HOST> -.*".*nessus.*"
^<HOST> -.*".*openvas.*"
^<HOST> -.*".*vega.*"
^<HOST> -.*".*morfeus.*"
^<HOST> -.*".*ZmEu.*"
^<HOST> -.*".*Havij.*"
ignoreregex =

View File

@@ -0,0 +1,10 @@
# Fail2ban filter for SSH DDoS attacks
# Deploy to: /etc/fail2ban/filter.d/sshd-ddos.conf
# Catches rapid connection attempts that may overwhelm SSH
[Definition]
failregex = ^%(__prefix_line)sConnection from <HOST> port \d+$
^%(__prefix_line)sConnection closed by <HOST> port \d+ \[preauth\]$
^%(__prefix_line)sDisconnected from <HOST> port \d+ \[preauth\]$
ignoreregex =

View File

@@ -0,0 +1,98 @@
# Fail2ban Jail Configuration for Homelab
# Deploy to: /etc/fail2ban/jail.local
#
# Setup commands:
# sudo cp config/fail2ban/jail.local /etc/fail2ban/
# sudo systemctl restart fail2ban
# sudo systemctl enable fail2ban
[DEFAULT]
# Ban settings
bantime = 3600
findtime = 600
maxretry = 5
banaction = ufw
backend = systemd
# Ignore local networks and your management IPs
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 10.0.0.0/8
# Email notifications (configure if needed)
# destemail = your-email@domain.com
# sender = fail2ban@homelab
# action = %(action_mwl)s
#
# SSH Protection (Critical - Primary attack vector)
#
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
findtime = 300
[sshd-ddos]
enabled = true
port = 2222
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 6
bantime = 3600
findtime = 60
#
# Web Service Protection
#
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
[nginx-badbots]
enabled = true
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400
findtime = 600
[nginx-noscript]
enabled = true
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6
bantime = 86400
[nginx-noproxy]
enabled = true
filter = nginx-noproxy
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 86400
#
# Docker/Container Protection
#
[gitea-auth]
enabled = true
filter = gitea-auth
logpath = /opt/docker/gitea/data/log/gitea.log
maxretry = 5
bantime = 1800
findtime = 300
#
# System Protection
#
[systemd-auth]
enabled = true
filter = systemd-auth
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 300