1. Ziel
  2. Wrapper für msmtp – /usr/local/bin/msmtp-logged.sh
  3. Mailprogramm konfigurieren
  4. Abuse-Report-Skript – /usr/local/sbin/fail2ban-abuse-report.sh
  5. Fail2Ban Action – /etc/fail2ban/action.d/abuse-report.conf
  6. Jail-Konfiguration – z. B. /etc/fail2ban/jail.d/sshd-abuse.conf
  7. Logrotate für msmtp
  8. Verwaltung
  9. 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert