Greylisting
- Updates
- 01.12.2009: Dieser Artikel über Greylisting für qmail ist veraltet.
- 19.11.2008: Alle toten Hyperlinks entfernt/ersetzt.
- 05.10.2008: Zum Kompilieren werden "gcc", "make" usw. benötigt. Neu: Inhaltsverzeichnis
- 30.09.2008: Die Links zur Webseite von Brent Meshier funktionieren nicht mehr => gelöscht.
- 18.11.2007: Es gibt Probleme mit neuen MySQL-Versionen (Lösung von AMD-Hammer).
- 02.10.2007: Auf die Wichtigkeit von "local_scan.c" und "qmail.sql" hingewiesen (Benutzer und Passwort müssen übereinstimmen)
- 22.09.2007: Der Fehler unter SuSE 10.x »error: conflicting types for 'write' readwrite.h:5: error: previous declaration (...) tritt nicht mehr auf.
- 16.08.2007: Die Warnungen »warning: pointer targets in initialization differ in signedness« treten nicht mehr auf.
- 03.08.2007: Die Warnungen »warning: conflicting types for built-in function "malloc"« treten nicht mehr auf.
- 28.07.2007: Die Warnungen »warning: pointer/integer type mismatch in conditional expression« treten nicht mehr auf.
- 22.07.2007: Tarball 1.05 released.
Greylisting ist eine erfolgreiche Möglichkeit, um Spam zu bekämpfen und deutlich weniger Spam zu erhalten. Es ist jedoch notwendig einen eigenen Server zu besitzen.
Dieser Artikel ist veraltet. Man sollte Greylisting für qmail mit spamdyke (spamdyke.org: Greylisting) umsetzen und ggf. mit Blacklists ergänzen.
Der folgende Artikel ist im Original von Brent Meshier veröffentlicht worden und hat beim Forum von SWsoft großen Zuspruch gefunden. Ich habe den Artikel übersetzt und eine Menge Fehler beseitigt. Die Arbeit basiert zu einem großen Teil auf der dem Artikel von Brent und TJ. Es handelt sich um eine sinngemäße Übersetzung eines Artikels von Brent Meshier, der nicht mehr verfügbar ist.
Nach der Fehlerbereinigung habe ich meine eigene Anleitung zur Installation geschrieben. Die Übersetzung ist weiter unten zu finden. Dort kann man auch den Original Tarball von Brent herunterladen, der allerdings gravierende Fehler in der C-Programmierung enthält. Ich habe versucht die Fehler und Warnungen zu bereinigen. Der C-Code sollte sich mit "make" auf allen gängigen Linux-Distributionen kompilieren lassen. Getestet wurde mit SuSE 10.1 und Fedora Core 5.
Wenn man die Installation richtig durchführt, sollte es keine Probleme geben, doch ich übernehme keine Haftung für Fehler, die durch mangelndes Linux-Wissen oder fehlende Backups hervorgerufen werden. Falsches Setzen der Rechte und/oder fehlerhafte Whitelist-Einträge können in drastischen Fehlern enden.
Fehler, Anmerkungen, Probleme und Fragen können im ServerSupportForum gestellt werden.
Inhaltsverzeichnis
Was ist Greylisting?
Die Original-Implementation und das White-Paper von Evan Harris kann auf seiner Homepage gefunden werden.
Brent hat die SWsoft Plesk 8 Qmail Patches und die Patches für Qmail mit seinen eigenen kombiniert, um Greylisting mit MySQL zu installieren, basierend auf Evans Greylisting für Sendmail.
Voraussetzungen
WICHTIG: Ohne die folgenden Pakete wird es zu Fehlern bei der Installation von Greylisting kommen. Demnach müssen installiert werden:
- Alle Pakete die zum Kompilieren notwendig sind (gcc, make, etc.)
- mysql-devel
- openssl-devel
- Download des Tarballs (siehe Installation)
- Mit TAR entpacken (siehe Installation)
- Das Passwort (hier: "topSecret") in der Datei "local_scan.c" ändern.
- Das Passwort (hier: "topSecret") in der Datei "qmail.sql" ändern.
- Die Daten in "local_scan.c" und "qmail.sql" müssen übereinstimmen, sonst bleibt die MySQL-Tabelle "relaytofrom" leer.
Außerdem sollte der neue Tarball mit dem von mir geänderten C-Code genommen werden. Im urprünglichen Tarball von Brent sind Fehler enthalten, die zu über 100 Warnungen beim "make" führen.
Installation
Zuerst muss man den Download des Tarballs starten. Danach kopiert man den Tarball mit FTP oder WinSCP auf den Server in "/usr/src/". Der Pfad kann aber auch "/root" oder anders lauten.
Die untenstehenden Pfade unterscheiden sich ein wenig von denen, die Brent angegeben hat, weil er wahrscheinlich kein SuSE 10.x verwendet hat.
Das Beispiel ist auch ausführlicher, als der BLOG-Eintrag von Brent, da auch noch die Ausgaben der Shell mit angezeigt werden. Außerdem gibt es an strategischen Punkten zusätzliche Überprüfungen, ob die Installation der einzelnen Teilschritte auch wirklich geklappt hat.
In den Pfad "/usr/src/" wechseln und den Tarball auspacken;
strato:~ # cd /usr/src strato:/usr/src # tar xvfz qmail-1.05_greylisting_plesk8.tar.gz qmail-1.05/ qmail-1.05/BLURB qmail-1.05/BLURB2 qmail-1.05/BLURB3 (...) qmail-1.05/qmail-smtpd.c.rej qmail-1.05/qmail-spp.o
Die Datei "local_scan.c" muss editiert werden, da auf keinen Fall die Default-Werte genommen werden dürfen.
strato:/usr/src # cd qmail-1.05 strato:/usr/src/qmail-1.05 # vi local_scan.c --- #define MYSQLHOST "localhost" #define MYSQLUSER "greylist" #define MYSQLPASS "topSecret" #define MYSQLDB "qmail" #define BLOCK_EXPIRE 5 /* minutes until email is accepted */ #define RECORD_EXPIRE 1500 /* minutes until record expires */ #define RECORD_EXPIRE_GOOD 36 /* days until record expires after accepting email */ ---
Da Greylisting mit der MySQL-Datenbank "qmail" und der Tabelle "relaytofrom" arbeitet, müssen ein paar Befehle im "MySQL Monitor" eingegeben werden (siehe Original von Brent). Wahlweise kann man auch einfach die mitgeliefert "qmail.sql" importieren (Idee: TJ). Die Login-Daten in der "qmail.sql" müssen an die "local_scan.c" angepasst werden.
strato:/usr/src/qmail-1.05 # vi qmail.sql strato:/usr/src/qmail-1.05 # mysql -u admin -p < qmail.sql Enter password: strato:/usr/src/qmail-1.05 #
Um zu überprüfen, ob Benutzer und Tabelle auch wirklich angelegt wurden, sollte man den MySQL-Monitor starten.
strato:/usr/src/qmail-1.05 # mysql -u greylist -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8974 to server version: 4.1.13 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> USE mysql; Database changed mysql> SELECT User, Password FROM user WHERE User = 'greylist'; +-------------+-------------------------------------------+ | User | Password | +-------------+-------------------------------------------+ | greylist | *930DAB011CE31AB33910A8A1F011CE98AA9D40FB | +-------------+-------------------------------------------+ 1 row in set (0.00 sec) mysql> SHOW COLUMNS FROM qmail.relaytofrom; +----------------+-----------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+-----------------------+------+-----+---------------------+----------------+ | id | bigint(20) | | PRI | NULL | auto_increment | | relay_ip | varchar(16) | YES | MUL | NULL | | | mail_from | varchar(255) | YES | MUL | NULL | | | rcpt_to | varchar(255) | YES | MUL | NULL | | | block_expires | datetime | | | 0000-00-00 00:00:00 | | | record_expires | datetime | | | 0000-00-00 00:00:00 | | | blocked_count | bigint(20) | | | 0 | | | passed_count | bigint(20) | | | 0 | | | aborted_count | bigint(20) | | | 0 | | | origin_type | enum('MANUAL','AUTO') | | | MANUAL | | | create_time | datetime | | | 0000-00-00 00:00:00 | | | last_update | timestamp | YES | | CURRENT_TIMESTAMP | | +----------------+-----------------------+------+-----+---------------------+----------------+ 12 rows in set (0.00 sec) mysql> quit Bye
Jetzt muss man die Dateien mit "make" kompilieren. Dazu gibt es im neuen Paket eine "install.sh" die vorher prüft, ob alle benötigten RPMs (siehe "Voraussetzungen") installiert wurden. Der Befehl "rpm" steht auf vielen Linux-Distributionen zur Verfügung. Ich habe das Shell-Skript mit SuSE und Debian getestet. Sollte "install.sh" eine Fehlermeldung bringen, die nichts mit den fehlenden Paketen "openssl-devel" oder "mysql-devel" zu tun hat, dann kann man hier auch nur "make" eingeben (siehe Original von Brent).
strato:/usr/src/qmail-1.05 # ./install.sh ( cat warn-auto.sh; \ echo CC=\'`head -1 conf-cc`\'; \ echo LD=\'`head -1 conf-ld`\' \ ) > auto-ccld.sh cat auto-ccld.sh make-load.sh > make-load (...) ./load spfquery spf.o ip.o ipme.o ipalloc.o strsalloc.o \ now.o dns.o datetime.a stralloc.a alloc.a str.a substdio.a \ case.a error.a fs.a `cat dns.lib` `cat socket.lib` ############################################################# #### 'make' finished. Please check for critical errors! #### #############################################################
Um den "make" zu kontrollieren kann man den untenstehende Befehl eingeben. Der Befehl sollte die Zahl "85" zurückliefern.
strato:/usr/src/qmail-1.05 # ls -l | grep -cv '\..\{1,12\}$\|conf-\|make-\|Makefile\|warn-\|[[:upper:]].$' 85
Der "make" sollte eigentlich nur dann fehlschlagen, wenn wichtige Pakete fehlen. Deshalb müssen jetzt nur noch die neuen Dateien kopiert werden und die Dateirechte gesetzt werden.
strato:/usr/src/qmail-1.05 # /etc/rc.d/qmail stop strato:/usr/src/qmail-1.05 # cp qmail-envelope-scanner /var/qmail/bin/. strato:/usr/src/qmail-1.05 # cp qmail-smtpd /var/qmail/bin/. strato:/usr/src/qmail-1.05 # chown root.qmail /var/qmail/bin/qmail-envelope-scanner strato:/usr/src/qmail-1.05 # chown root.qmail /var/qmail/bin/qmail-smtpd strato:/usr/src/qmail-1.05 # /etc/rc.d/qmail start
Danach habe ich ein CATCH-ALL für meine Domain aktiviert und ein "tail" lieferte
tail /tmp/greylist_dbg.txt -------- protocol = notneeded4qmail increaseblindsz.com increaseblindsz.com -> cloidtdclausvb.de (62.227.194.124) Doesn’t Exists Block -------- protocol = notneeded4qmail Scottblueskyimages.co.uk Scottblueskyimages.co.uk -> christoclausvb.de (86.196.215.34) Doesn’t Exists Block -------- protocol = notneeded4qmail logic-s.comusedoffset.com logic-s.comusedoffset.com -> wwwclausvb.de (200.120.143.210) Doesn't Exists Block -------- protocol = notneeded4qmail erika_mustermannyahoo.de erika_mustermannyahoo.de -> wwwclausvb.de (217.146.177.35) Doesn't Exists Block -------- protocol = notneeded4qmail erika_mustermannyahoo.de erika_mustermannyahoo.de -> wwwclausvb.de (217.146.177.35) Exists Accept id = 10 expire = 1 --------
Kritische Fehler
Obwohl ich einige der Warnungen bereinigt habe, ist es möglich, dass noch folgende "Fehler" auftreten:
qmail-qmtpd.c: In function resources: qmail-qmtpd.c:16: warning: incompatible implicit declaration of built-in function _exit qmail-smtpd.c: In function tls_verify: qmail-smtpd.c:783: warning: pointer targets in assignment differ in signedness spfquery.c: In function main: spfquery.c:30: warning: incompatible implicit declaration of built-in function strdup
Diese Warnungen sind alle normal und treten (vielleicht) nicht bei allen Linux-Distributionen auf. Der C-Code ist nicht sauber programmiert und nicht auf unterschiedlichen Systemen getestet worden.
Die folgenden Fehler sind jedoch kritisch:
qmail-remote.c:663: warning: return type of `main is not `int make: *** [qmail-remote.o] Error 1 ./compile: line 3: exec: cc: not found make: *** [qmail-local.o] Error 127 collect2: ld returned 1 exit status make: *** [qmail-envelope-scanner] Error 1 local_scan.c:255: error: `mysql undeclared (first use in this function) *** Error code 1 tls.c:12: error: conflicting types for strerror /usr/include/string.h:256: error: previous declaration of strerror was here make: *** [tls.o] Error 1
Die Fehler haben unterschiedliche Ursachen. Den Fehler in der Datei "tls.c" habe ich (dank TJ) gefixt. Es muss sichergestellt sein, das die Pakete "gcc", "mysql-devel" und "openssl-devel" installiert sind. Sollte dennoch einer der oben genannten Fehler auftreten, dann bitte einen Post im Forum machen, danke!
Es gibt ein außerdem ein Problem mit den neusten MySQL-Versionen (5.x und aufwärts): Huschi und AMD-Hammer haben das Problem lokalisiert. Es hat etwas mit der Passwortumstellung von MySQL zu tun. Dafür gibt es die MySQL-Funktion "OLD_PASSWORD". Da der C-Code noch mit der alten Funktion arbeitet, muss man das umstellen.
Cleanup-Perl-Skript
Um die Datenbank regelmäßig aufzuräumen sollte man ein (von mir leicht optimiertes) PERL-Skript in der "/etc/cron.daily" plazieren, mit folgendem Inhalt:
#!/usr/bin/perl use strict; use warnings; use constant DBD => 'DBI:mysql:qmail:localhost:3306'; use constant DBUSER => 'greylist'; use constant DBPASS => 'topSecret'; use DBI; system('cat /dev/null > /tmp/greylist_dbg.txt'); my $dbh = DBI->connect(DBD, DBUSER, DBPASS) or die 'Can't connect to MySQL ', $DBI::errstr, ":$!"; $dbh->do('DELETE FROM relaytofrom WHERE record_expires < NOW() - INTERVAL 1 HOUR AND origin_type = "AUTO"'); $dbh->do('OPTIMIZE TABLE relaytofrom'); $dbh->disconnect; exit;
Die Passwörter müssen entsprechend angepasst werden. Das oben gepostete Skript wurde von Gerard Earley in einigen Punkten überarbeitet.
Die Installation vom "Plesk Greylisting Control Panel"
Haggybear hat im ServerSupportForum seine Software "Plesk Greylisting Control Panel" zum Download bereitgestellt. Die Installation ist hier etwas anders beschrieben, weil ich lieber mit der Kommandozeile (auf Shell-Ebene) arbeite. Unter openSUSE ist das PSA-Verzeichnis "/usr/local/psa/admin/htdocs".
cd /usr/local/psa/admin/htdocs wget http://serversupportforum.de/forum/attachments/plesk/2226d1222016660-plesk-greylisting-control-panel-gcp.zip --18:04:01-- http://serversupportforum.de/forum/attachments/plesk/ => `2226d1222016660-plesk-greylisting-control-panel-gcp.zip' Auflösen des Hostnamen »serversupportforum.de«.... 85.25.23.250 Verbindungsaufbau zu serversupportforum.de|85.25.23.250|:80... verbunden. HTTP Anforderung gesendet, warte auf Antwort... 200 OK Länge: 41.751 (41K) [application/zip] 100%[==============================================================>] 41.751 --.--K/s 18:04:01 (1.37 MB/s) - »2226d1222016660-plesk-greylisting-control-panel-gcp.zip« gespeichert [41751/41751] server:/usr/local/psa/admin/htdocs # unzip 2226d1222016660-plesk-greylisting-control-panel-gcp.zip Archive: 2226d1222016660-plesk-greylisting-control-panel-gcp.zip creating: gcp17/ creating: gcp17/lang/ inflating: gcp17/lang/de.inc.php inflating: gcp17/lang/en.inc.php inflating: gcp17/INSTALL.txt inflating: gcp17/LICENSE.txt inflating: gcp17/bg.gif inflating: gcp17/block.gif inflating: gcp17/cm.php inflating: gcp17/config.inc.php inflating: gcp17/conn.php inflating: gcp17/db.php inflating: gcp17/domain.php inflating: gcp17/funcs.php extracting: gcp17/gllogo.gif inflating: gcp17/help_ico.gif inflating: gcp17/ident.php inflating: gcp17/index.php inflating: gcp17/kill.gif inflating: gcp17/loading.gif inflating: gcp17/overview.php inflating: gcp17/pass.gif inflating: gcp17/pgcp_updater.sh inflating: gcp17/pixel.gif inflating: gcp17/toggle.gif inflating: gcp17/toggle_block.gif inflating: gcp17/toggle_pass.gif inflating: gcp17/update.php extracting: gcp17/version.php inflating: gcp17/whitelist.php inflating: gcp17/wrapper server:/usr/local/psa/admin/htdocs # mv gcp17/ greylisting server:/usr/local/psa/admin/htdocs # chown root:psaadm greylisting server:/usr/local/psa/admin/htdocs # chmod 755 greylisting server:/usr/local/psa/admin/htdocs # cd greylisting/ server:/usr/local/psa/admin/htdocs/greylisting # chown root:psaadm -R * server:/usr/local/psa/admin/htdocs/greylisting # find . -type f -exec chmod 0644 {} \; server:/usr/local/psa/admin/htdocs/greylisting # find . -type d -exec chmod 0755 {} \;
Ich habe den Dateien nur die Rechte "644" gegeben, weil Ausführrechte nicht notwendig sind.
Der Screenshot zeigt, wie man in Plesk (mit deutscher Sprache) einen neuen Button anlegt. Danach folgt man der Anleitung von Haggybear aus der "INSTALL.txt". Bei mir sah das dann so aus:
Weblinks
Die Seite von Brent Meshier enthält die Artikel zu Greylisting nicht mehr. Deswegen habe ich die Artikel auf meiner Webseite übernommen bzw. hier auf archive.org verlinkt.
- huschi.net: Plesk & Qmail: Spamprotection mit greylist (Hinweise zu Debian und 64-bit-Systemen)
- Brent Meshier: Adding Greylisting support to qmail on Plesk 8
- Brent Meshier: Using Whitelist & Blacklist with Greylisting
- TJ: HowTo Install email greylist filtering for qmail with Plesk (Plesk 8.1 on Fedora Core 5)
- Foren: SWsoft (englisch) - ServerSupportForum (deutsch)
- Claus van Beek: Greylisting reduziert Spam um 83 Prozent
- Claus van Beek: Greylisting und kritische Fehler
- Claus van Beek: Greylisting und "mailnull.com"