Greylisting mit Plesk 8.3 und Debian 4.0

~ 0 min
2008-03-01 20:51

 

Dieses Howto stammt von Brent Meshir Brent Meshier und Claus van Beek Claus van Beek und wurde von mir bezüglich Debian 4.0 angepasst.

Installation

Download: qmail-1.05_greylisting_plesk8.tar.gz 

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.oDie 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

#bei Plesk 8 fehlt leider eine Datei:
strato:/usr/src # echo "-lssl -lcrypto" >ssl.lib

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  4 /* 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 admin -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

Jetzt kann man noch das Logverhalten von Qmail etwas verbessern: Dazu bearbeiten wir die Datei qmail-smtpd.c und ergänzen nur die Fett gedruckten Zeilen an der entsprechenden Stelle:

qmail-smtpd.c

...
#include "wait.h"
#include "fd.h"
#include <syslog.h> /* huschi */
...
static void smtpauth_authenticate(void)
{
...
    close(fds[1]);
    wait_pid(&st, pid);
openlog("qmail-smtpd", 0, LOG_MAIL); /* huschi */
    if (wait_exitcode(st) == 0) {
      out("235 go ahead\r\n");
      flush();
      syslog(LOG_INFO, "smtp-auth[%i] ok for login: %s", getpid(), smtpauthlogin); /* huschi */
      relayclient="";
      authenticated=1;
      return;
    }
    sleep(2);
    out("535 auth failure\r\n");
    flush();
syslog(LOG_DEBUG, "smtp-auth[%i] fail for login: %s", getpid(), smtpauthlogin); /* huschi */
    return;
}

Mit tail -f /usr/local/psa/var/log/maillog | grep smtpd kann das ganze so aussehen:

Mar  1 17:07:04 h1083027 qmail-smtpd: smtp-auth[14650] ok for login: michi@webmasterhilfe.de
Mar  1 17:11:40 h1083027 qmail-smtpd: smtp-auth[21461] fail for login: webmaster@webmasterhilfe.de 

Vielen Dank an Huschi @ http://huschi.net für diesen Tipp.

Unter Debian 4.0 sollte man unter /usr/lib das Verzeichniss mysql anlegen. per apt-get install libmysqlclient15-dev libssl-dev installieren.
Dann kopiert man alle libmysqlclient* Dateien von /usr/lib nach /usr/lib/mysql.

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´

 strato:/usr/src/qmail-1.05 # make


#############################################################
#### '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 startDanach habe ich ein CATCH-ALL für meine Domain aktiviert und ein "tail" lieferte

tail -f /tmp/greylist_dbg.txt

--------
protocol = notneeded4qmail increase@blindsz.com
increase@blindsz.com -> cloidtd@clausvb.de (62.227.194.124) Doesn’t Exists Block
--------
protocol = notneeded4qmail Scott@blueskyimages.co.uk
Scott@blueskyimages.co.uk -> christo@clausvb.de (86.196.215.34) Doesn’t Exists Block
--------
protocol = notneeded4qmail logic-s.com@usedoffset.com
logic-s.com@usedoffset.com -> www@clausvb.de (200.120.143.210) Doesn't Exists Block
--------
protocol = notneeded4qmail erika_mustermann@yahoo.de
erika_mustermann@yahoo.de -> www@clausvb.de (217.146.177.35) Doesn't Exists Block
--------
protocol = notneeded4qmail erika_mustermann@yahoo.de
erika_mustermann@yahoo.de -> www@clausvb.de (217.146.177.35) Exists Accept id = 10  expire = 1

Cleanup-Perl-Skript von Brent Meshier
Um die Datenbank regelmäßig aufzuräumen sollte man ein 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 db ", $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.

 

Durchschnittliche Bewertung 0 (0 Abstimmungen)

Es ist möglich, diese FAQ zu kommentieren.