- Ziel
- Wrapper für msmtp – /usr/local/bin/msmtp-logged.sh
- Mailprogramm konfigurieren
- Abuse-Report-Skript – /usr/local/sbin/fail2ban-abuse-report.sh
- Fail2Ban Action – /etc/fail2ban/action.d/abuse-report.conf
- Jail-Konfiguration – z. B. /etc/fail2ban/jail.d/sshd-abuse.conf
- Logrotate für msmtp
- Verwaltung
- Ergebnis
Ziel
Automatische Meldung von gebannten IP-Adressen durch Fail2Ban an die passende Abuse-Mailadresse per WHOIS-Abfrage.
Zusätzlich:
- 📧 Versand mit Zustellnachweis über
msmtp - 📄 Logging der gesendeten Meldungen
- 🔁 Logrotation
- 🔓 Möglichkeit zur Wiederfreigabe gebannter IPs
- 📎 Anhang im X-ARF-Format (maschinenlesbar)
Wrapper für msmtp – /usr/local/bin/msmtp-logged.sh
#!/bin/bash
LOGFILE="/var/log/msmtp/msmtp.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
RECIPIENT="$1"
{ echo "[$DATE] Mail an $RECIPIENT"; cat; echo "---"; } >> "$LOGFILE"
/usr/bin/msmtp "$@" >> "$LOGFILE" 2>&1
Rechte setzen:
sudo chmod +x /usr/local/bin/msmtp-logged.sh
Benutzer zur msmtp-Gruppe hinzufügen:
sudo usermod -aG msmtp <nutzername>
Mailprogramm konfigurieren
Versand erfolgt über mail aus dem Paket mailutils, das intern msmtp nutzt.
Alternativ: sendmail-Symlink auf den Wrapper zeigen.
Abuse-Report-Skript – /usr/local/sbin/fail2ban-abuse-report.sh
#!/bin/bash
IP="$1"
HOST=$(hostname -f)
DATUM=$(date +'%Y-%m-%d %H:%M:%S')
LOGFILE="/var/log/fail2ban_abuse_reports.csv"
BLACKLIST="/var/log/fail2ban_reported_ips.txt"
XARF_FILE="/tmp/xarf_${IP}.xarf"
# IP aus fail2ban.log holen wenn leer
if [ -z "$IP" ]; then
IP=$(grep 'Ban' /var/log/fail2ban.log | tail -1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
fi
if ! echo "$IP" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "❌ Invalid IP address!"
exit 1
fi
if [ -f "$BLACKLIST" ] && grep -q "$IP" "$BLACKLIST"; then
echo "ℹ️ IP $IP has already been reported. Exiting."
exit 0
fi
# WHOIS-Abfrage
WHOIS=$(whois "$IP")
# Primär: Versuche "abuse-mailbox" oder "abuse@" zu finden
ABUSE=$(echo "$WHOIS" | grep -Ei 'abuse-mailbox|abuse@' | head -1 | awk '{print $NF}')
# Sekundär: Fallback auf erste gefundene "e-mail:"-Adresse
if [ -z "$ABUSE" ]; then
ABUSE=$(echo "$WHOIS" | grep -Ei 'e-mail:' | head -1 | awk '{print $NF}')
fi
# Validierung: Ist es eine echte Mailadresse?
if [ -z "$ABUSE" ] || ! echo "$ABUSE" | grep -qE '.+@.+\..+'; then
echo "❌ No valid abuse contact found for IP $IP – skipping report."
exit 0
fi
# Mailtext (englisch)
MAILTEXT=$(cat <<EOF
Dear Sir or Madam,
On $DATUM, multiple unauthorized SSH login attempts were detected from IP address $IP targeting our server ($HOST). These attempts were automatically blocked by Fail2Ban.
Please investigate this incident and take appropriate action to prevent further attacks.
Kind regards,
Paul Schumacher
EOF
)
# XARF-Datei erzeugen
cat > "$XARF_FILE" <<EOF
Feedback-Type: abuse
User-Agent: fail2ban-abuse-report
Version: 0.1
Original-Mail-From: mailauth-reports@schumacher.or.at
Source-IP: $IP
Arrival-Date: $DATUM
Reporting-MTA: dns; $HOST
Reported-Domain: $HOST
Received-Date: $DATUM
Authentication-Results: none
Message-ID: <fail2ban-$IP@$HOST>
Incidents: 1
EOF
# MIME-Mail mit Anhang senden
{
echo "To: $ABUSE"
echo "From: mailauth-reports@schumacher.or.at"
echo "Subject: Abuse report for IP $IP"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/mixed; boundary=\"XARF-BOUNDARY\""
echo
echo "--XARF-BOUNDARY"
echo "Content-Type: text/plain; charset=\"utf-8\""
echo
echo "$MAILTEXT"
echo
echo "--XARF-BOUNDARY"
echo "Content-Type: message/feedback-report"
echo "Content-Disposition: attachment; filename=\"report.xarf\""
echo
cat "$XARF_FILE"
echo "--XARF-BOUNDARY--"
} | /usr/local/bin/msmtp-logged.sh -a default -t
# Logging
echo "$DATUM,$IP,$ABUSE" >> "$LOGFILE"
echo "$IP" >> "$BLACKLIST"
# Aufräumen
rm -f "$XARF_FILE"
Rechte setzen:
sudo chmod +x /usr/local/sbin/fail2ban-abuse-report.sh
Fail2Ban Action – /etc/fail2ban/action.d/abuse-report.conf
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = /usr/local/sbin/fail2ban-abuse-report.sh <ip>
actionunban =
[Init]
name = abuse-report
Jail-Konfiguration – z. B. /etc/fail2ban/jail.d/sshd-abuse.conf
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
action = %(action_)s
abuse-report
Logrotate für msmtp
Datei: /etc/logrotate.d/msmtp
/var/log/msmtp/msmtp.log {
rotate 10
daily
compress
missingok
notifempty
create 664 root msmtp
}
Test:
sudo logrotate -f /etc/logrotate.d/msmtp
Verwaltung
Blacklist-Eintrag löschen (z. B. IP 206.189.157.238):
sudo sed -i '/206.189.157.238/d' /var/log/fail2ban_reported_ips.txt
CSV-Log leeren:
sudo truncate -s 0 /var/log/fail2ban_abuse_reports.csv
msmtp-Log leeren:
sudo truncate -s 0 /var/log/msmtp/msmtp.log
Fail2Ban neu laden:
sudo fail2ban-client reload
Ergebnis
🔒 Bei jedem Ban durch Fail2Ban wird automatisch:
- eine strukturierte Abuse-Meldung per E-Mail an den zuständigen Provider versendet
- die Aktion geloggt
- eine X-ARF-kompatible Meldung zur automatisierten Verarbeitung erzeugt
- jede IP nur einmalig gemeldet
Schreibe einen Kommentar