Automatische Blacklist in Postfix

Automatische Blacklist in Postfix

Ich habe zahlreiche Postfix-Direktiven, die den Missbrauch erfolgreich einschränken.JEDOCH: Nachdem eine Einschränkung erzwungen wurde, stellt der Missbraucher einfach die Verbindung wieder her und durchläuft den gesamten Prozess, bei dem dieselben Tests erneut fehlschlagen. Es gibt keine dauerhafte Speicherung von vorherigen Einschränkungen, die einem verbundenen Client auferlegt wurden.

Gibt es eine Lösung, um diese Schleife zu umgehen und direkt zu einer Sperre zu gelangen, nachdem eine ressourcenintensive Direktive nur einmal durchgesetzt wurde? Idealerweise hätte ich gerne Unterstützung für die Sperrung von IPv4- und IPv6-Adressen.

Antwort1

AKTUALISIEREN:

Ich habe eine wesentliche Aktualisierung der Lösung vorgenommen und IPv6-Unterstützung und -Verwaltung hinzugefügt, um eine „rollende“ Sperrliste zu implementieren und IPs zu löschen, wenn die Angreifer Ihren Server nicht mehr angreifen.

Einleitung:

Obwohl es viele Postfix-Direktiven gibt, die Missbraucher blockieren können, besteht das Problem bei diesen darin, dass solche vorherigen Entscheidungen nicht dauerhaft gespeichert werden.Ein Missbraucher kann sich also endlos wieder verbinden und sein Datenverkehr muss dieselben Tests erneut durchlaufen. Das ultimative Ziel ist daher, diese Endlosschleife des Missbrauchs zu durchbrechen und eine verletzende IP einfach zu sperren, nachdem der erste ressourcenintensive Test fehlgeschlagen ist.

Ich habeEine Lösung als Open Source bereitgestelltIch verwende meinen eigenen (ziemlich) ausgelasteten Mailserver, der viele Konten für viele Domänen hostet. Kurz gesagt erstellt er einen SystemD-Dienst und -Timer, der ein Skript auslöst, das mithilfe von RegEx nach /var/log/maillogMissbrauchsmustern sucht – sowohl für IPv4- als auch für IPv6-Adressen. Tests haben bisher zu einer erheblichen Reduzierung des Missbrauchs geführt.

Beispielausgabe von /etc/postfix/access. Keine Einbeziehung einer einzelnen IPv6-Adresse:

213.230.115.33 REJECT
213.230.75.114 REJECT
185.66.252.78 REJECT
162.243.133.39 REJECT
104.168.159.38 REJECT
78.128.113.109 REJECT
77.40.3.227 REJECT
77.40.3.101 REJECT
61.163.192.88 REJECT
37.0.20.10 REJECT
26.189.237.221 REJECT
[2001:da8:5066:66:eda:41ff:fe1d:b27] REJECT

Übrigens, IPv6 damit zum Laufen zu bekommen war ein ziemlicher Krampf, aber am Ende habe ich es geschafft ;-)

Blacklisting-Strategie:

In 2,5 Monaten wurden über 1200 IPs auf die schwarze Liste gesetztIch verwende die vorherige Iteration meines Repo, die die IPs der Täter dauerhaft aufzeichnete. Ohne einen Mechanismus zum regelmäßigen Bereinigen dieser Liste gäbe es Skalierbarkeitsprobleme. Mein neuer Ansatz besteht darin, eine rollierende Sperrliste zu erstellen: Durchsuche das Maillog kontinuierlich nach neuen Missbrauchs-IPs und lösche diejenigen, die nicht mehr im Maillog erscheinen.Jeder andere Ansatz, der mir einfiel, basierte auf einer willkürlichen Zeitspanne zum Löschen von IPs.

Wenn also ein Missbrauchstäter nach einer Protokollrotation nicht im neuen Maillog erscheint, wird er NICHT in die schwarze Liste aufgenommen – nur, wenn er einen weiteren Missbrauchsversuch unternimmt. IPs werden dort nur für die Dauer des Maillogs vor einer Rotation auf die schwarze Liste gesetzt.

Code

Ich kann nach meinen Tests sagen, dass das Repo hält, was es verspricht. Ich zweifle jedoch nicht daran, dass einige Teile eleganter sein könnten. Unten finden Sie das Hauptskript, das die Aufgabe erfüllt und zur Peer-Review angeboten wird.

Wenn du irgendwelche Gedanken/Vorschläge hast, lass es uns wissen oder schick mir besser noch einen Pull Request (bitte erst, nachdem du deine Verbesserungen getestet hast). Das Skript ist einfach zu testen.es erledigt alles für Sie und der gesamte Code ist gut kommentiert- und ebenso leicht zu entspannen.

BITTE BEACHTEN SIE: Dieses Skript hat nur dann eine Wirkung, wenn Sie Anweisungen haben, die die „Zugriffs“-Karte in lesen main.cf.Beachten Sie auch, dass die restriktiven Anweisungen von Postfix von links nach rechts durchgesetzt werden., daher sollte jede Direktive, die die „Zugriffs“-Karte liest, links von Direktiven stehen, die teurere Tests ausführen.

Das Repo enthält ein Skript zum Deinstallieren aller Elemente, wenn Sie nur einige Tests durchführen möchten.

cat <<'EOF'> /etc/postfix/access-autoBlacklisting.sh
#!/bin/bash
#
# Author/Developer: Terrence Houlahan Linux Engineer F1Linux.com
# Linkedin: https://www.linkedin.com/in/terrencehoulahan
# License: GPL 3.0
# Source:  https://github.com/f1linux/postfix-autoBlacklisting.git
# Version: 03.20.00

# OPERATION:
# ----------
# This script PREPENDS offending IP addresses from "/var/log/maillog" to "/etc/postfix/access"
# This ensures restrictive access rules applied before permissive grants.
# Consult README.md file for more granular detail about this script and its operation.

# Stop timer from executing Blacklisting script: Existing blacklist in /etc/postfix/access is enforce enforced while the new blacklist rebuilds
systemctl stop Postfix-AutoBlacklisting.timer

# Purge blacklist: Blacklist recreated each script execution capturing both previous offending IPs as well as newest ones present in logs
sed -i '/REJECT$/d' /etc/postfix/access

# Purge the scratch file:
> /etc/postfix/access-blacklist

### Scrape log for different forms of abuse using different tests to identify abuse IPs and squirt each to same central file:
# Enable/Disable any of below tests according to your requirements. Adding your own is easy if you use my tests which isolate offending IPs as templates.

# TEST 1: Blacklist Zombie hosts from endlessly squirting spam: These are identified by no PTR record being set for them.
# This test will catch both new zombies as well as those already RBLed which should serve to stop them constantly being endlessly checked against the RBL
# IPv4 Test:
# Below commented test was found to not be 100 perecent as accurate as the one using the awk form. Have not investigated why however.
#grep "does not resolve to address" /var/log/maillog | grep -Eo "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort -u >> /etc/postfix/access-blacklist
grep "does not resolve to address" /var/log/maillog | awk 'match($0, /([0-9]{1,3}[\.]){3}[0-9]{1,3}/) {print substr($0, RSTART, RLENGTH)}' | sort -u >> /etc/postfix/access-blacklist
# IPv6 Test:
grep "does not resolve to address" /var/log/maillog | grep -Eo "2[0-9a-fA-F]{3}:(([0-9a-fA-F]{1,4}[:]{1,2}){1,6}[0-9a-fA-F]{1,4})" | sort -u | awk '{print "["$1"]"}' >> /etc/postfix/access-blacklist


# TEST 2: Block spammers guessing account names where they know our domain:
# WARNING: this could potentially cause a block where an unintentional misspelling of an mail account name occured.
# Uncomment only if you are OK with accepting such a risk:
# IPv4 Test:
#grep "Recipient address rejected: User unknown in virtual mailbox table" /var/log/maillog | sed -rn 's/.*\[(([0-9]{,3}.){4})\].*/\1/gp' >> /etc/postfix/access-blacklist
# IPv6 Test:
#grep "Recipient address rejected: User unknown in virtual mailbox table" /var/log/maillog | grep -Eo "2[0-9a-fA-F]{3}:(([0-9a-fA-F]{1,4}[:]{1,2}){1,6}[0-9a-fA-F]{1,4})" | sort -u | awk '{print "["$1"]"}' >> /etc/postfix/access-blacklist


# Populate an array with sorted and depuplicated list of offending IPs scraped from maillog using foregoing tests:
readarray arrayIPblacklist < <( cat /etc/postfix/access-blacklist | sort -u -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | sed '/^$/d' )

# If "access" is a new empty file then the subsequent "sed" will fail. Any new file will have a zero size so the '-s' test will not equal 'true'.
# So we use negation to test "true" and echo a blank space to file. The subsequent "sed" will now execute.
# If "access" file already has whitelist entry then the 'if' statement does nothing and "sed" which follows executes as expected for a non-empty file:
if [ ! -s /etc/postfix/access ]; then echo "" > /etc/postfix/access; fi

for i in "${arrayIPblacklist[@]}"; do
        # Write list of IPS from array to TOP of "access" file to enforce restrictions BEFORE processing whitelisted "OK" addresses:
        sed -i "1i $i" /etc/postfix/access
        # Append " REJECT" (with a space prepended in front of it) after each of the IPs added to to the "access" file:
        sed -i '1s/$/ REJECT/' /etc/postfix/access
done


# Rebuild the /etc/postfix/access Berkeley DB:
postmap /etc/postfix/access

systemctl reload postfix.service

# After cycle completes and IPs written to /etc/postfix/acces we wipe array which repopulates anew upon next script execution:
unset arrayIPblacklist

systemctl start Postfix-AutoBlacklisting.timer

EOF

Abschluss:

Ich glaube, ich habe ein System entwickelt, das die Speicherung zuvor blockierter IPs dauerhaft ermöglicht, damit aufwändige Tests nicht endlos wiederholt werden. Ist es perfekt? Es könnte wahrscheinlich noch etwas Feinschliff vertragen, aber die Ergebnisse meiner bisherigen Tests scheinen vielversprechend.

Wenn Sie es satt haben, dass Ihre Mailserver ständig von Spammern missbraucht werden, können Sie mit dieser Lösung schnell und einfach die Spammer abschalten:

https://github.com/f1linux/postfix-autoBlacklisting

verwandte Informationen