| Title: | Howto: ISP-ähnlicher Email Server mit Debian-Etch und Postfix |
|---|---|
| Autor: | Dipl.-Inform. Christoph Haas |
| Übersetzung: | Florian Fritsch |
| Lizenz: | (C) 2007 Christoph Haas. Dieses document wurde unter den Bedingungen der GNU General Public License (http://www.gnu.org/licenses/gpl.html) veröffentlicht |
| Quelle: | Die aktuellste Version dieses Dokuments können Sie auf workaround.org finden. Wenn Sie die Notwendigkeit sehen, dieses Dokument zu spiegeln, halten Sie bitte ihre Kopie auf dem neuesten Stand. Ansonsten verursachen Sie dem Autor jede Menge Kopfschmerzen, da Leser evtl. über Probleme stolpern, die in einer neueren Version dieses Dokuments bereits behoben wurden. |
Sicherlich sind Ihnen die großen Web Hoster bekannt, bei denen Sie sich eine Domain mieten und darüber E-Mails empfangen können. Wenn Sie einen Debian-Rechner mit permanenter Internetanbindung besitzen, können Sie den gleichen Dienst anbieten. Auf Grund von dynamischen DNS-Diensten wie dyndns.org brauchen Sie nicht mal eine statische IP-Adresse. Alles was Sie brauchen, ist dieses Dokument, eine Tasse guten Tee und etwas Zeit. Wenn Sie mit der Installation fertig sind, wird ihr Server...
Dieses Dokument ist keine einfach Copy-und-Paste-Anleitung. Der Gedanke dahinter ist Ihnen die verschiedenen Komponenten, die Sie benutzen verständlich zu machen. Es gibt kein Script dass die Installation vollautomatisch für Sie durchführt. Aber zum Schluss werden Sie genügend Wissen besitzen, um Problemen selbstständig auf den Grund zu gehen. Wenn Sie Hilfe bei der Installation brauchen, lesen Sie bitte die Hinweise unter Fehlerbehebung. Die Installation in dieser Anleitung wurde von vielen Lesern ausgiebig getestet. Anders als bei anderen Postfix-Tutorials im Internet ist dies hier bereits die 3. Auflage. Dieses Tutorial ist nicht nur eine kurze Zusammenfassung sondern eine ausführliche Anleitung die Sie leitet. Es zu schreiben kostete einen Monat Arbeit.
Die beschriebene Konfiguration ist nicht wirklich kompliziert, muss aber sorgfältig durchgeführt werden. Sie sollten Grundkenntnisse in folgenden Punkten besitzen:
Das "ISP-Mail"-Tutorial wird seit Debian "Woody" gepflegt. Es kann sein dass Sie bereits frühere Versionen der Anleitung verwendet haben und nun auf Debian "Etch" updaten wollen. Es ist nicht leicht, eine genaue Anleitung hierfür anzubieten. Sie werden sicherlich Ausfallzeiten haben, falls Sie nicht mehrere Mailserver haben die Sie nach und nach migrieren können. Einige grundlegende Informationen:
Sie sollten ausserdem die Veröffentlichungshinweise von Debian Etch lesen bevor Sie ein Upgrade Ihres Systems von Sarge auf Etch durchführen.
Übrigens sind für die IMAP-Ordner beim Wechsel von Courier zu Dovecot nicht mehr automatisch abonniert. Glücklicherweise sind die 'courierimapsubscribed'-Dateien kompatibel u Dovecots 'subscriptions'-Dateien, aber Sie müssten den Präfix "INBOX." in den Dateien entfernen. Diese Dateien befinden sich in den Mailboxverzeichnissen.
Die hier beschrieben Konfiguration nutzt folgende Komponenten:
Haben Sie sich je gefragt wie Internet Service Anbieter (ISPs) tausende Domains verwalten, für die Sie E-mails empfangen? Es gibt sicher niemand, der die ganzen Domains und Aliase in die Konfigurationsdatei main.cf händisch einträgt. Postfix bietet eine viel bessere Möglichkeit an, um solche Domänen und Konten zu verwalten: virtuelle Domänen und virtuelle Benutzer.
Zusätzlich zu den lokalen Benutzern (die in der /etc/passwd aufgelistet sind) kann Postfix zusätzliche virtuelle Benutzern in virtuellen Domänen verwalten. Virtuelle Benutzer können sich nicht auf dem Rechner anmelden und haben weder eine Benutzer ID noch ein Home-Verzeichnis. Sie existieren nur in der Datenbank. Wenn Sie aber Postfix mit dieser Datenbank verbinden, können diese Benutzer E-Mails empfangen. Postfix kann mit einer Liste der virtuellen Benuter arbeiten und E-Mails in jedes Verzeichnis das Sie möchten zustellen Dies würde so aussehen:
| Virtueller Benutzer | Speicherort des virtuellen Postfachs |
|---|---|
| john@doe.org | /var/mail/doe.org/john |
| jack@doe.org | /var/mail/doe.org/jack |
| jeff@foo.org | /var/mail/foo.org/jeff |
Sie müssen Postfix außerdem mitteilen, welche virtuellen Domänen Sie benutzen möchten. Wenn auf Ihrem System eine virtuelle Domäne nicht benutzt wird, lehnt Postfix die E-Mails ab. So sieht eine Liste mit Domänen aus:
| Virtuelle Domäne | Beispieltext |
|---|---|
| doe.org | banana daiquiri |
| foo.org | rose garden |
Die Informationen könnten natürlich auch in eine Text-Datei geschrieben werden. Wie Sie sich vorstellen können, würde dies aber schnell unübersichtlich werden. Glücklicherweise kann Postifx diese Informationen auch aus anderen Quellen wie LDAP oder SQL-Datenbanken lesen. Wir benutzen in unserer Anleitung eine SQL-Datenbank.
Sie haben nun festgestellt, dass eine Zuweisung einen Wert einem anderen Wert zuweist. Wenn Sie eine Datenbank abfragen müssen Sie Postfix mitteilen welche zwei Spalten Sie meinen. Dies wird duch 'cf'-Dateien erledigt (cf = configuration file). Sie finden die Dokumentation hierfür unter http://www.postfix.org/MYSQL_README.html oder durch Eingabe von "man 5 mysql_table" in der Konsole.
Beispieldatei:
# Information zur Verbindung mit dem SQL-Server user = someone password = some_password hosts = 127.0.0.1 # Der Name der Datenbank auf dem SQL-Server dbname = mailserver # Die SQL-Datenbankabfrage query = SELECT destination FROM virtual_aliases WHERE source='%s'
In dieser Datei wird festgelegt wie Postfix auf die Daten der Datenbank zugreifen kann. Diese Variante wäre geeignet für die Zuweisung von virtual_alias_maps. Stellen Sie sich vor, dass die vorigen Zeilen in einer Datei /etc/postfix/mysql-virtual-alias-maps.cf gespeichert wären. Folgende Zeile in Ihrer main.cf würde Postfix die Möglichkeit geben die Datenbank abzufragen:
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf
Wie funktioniert das? Stellen Sie sich vor, das Postfix eine E-Mail an john@doe.net senden und die virtual_alias_maps überprüfen will. Postfix stellt eine Verbindung zum MySQL-Server mit der IP Adresse 127.0.0.1 her und authentifiziert sich mit dem Benuternamen someone und dem Passwort some_password. Es wählt die Datenbank mailserver aus und macht schließlich diese Abfrage:
SELECT destination FROM virtual_aliases WHERE source='john@doe.net'
Nehmen wir an, die SQL-Abfrage würde folgende Ergebnisse zurückliefern:
Dies gleicht dem Benutzen einer Textdatei mit Aliasen wie folgt:
john@doe.net jack@example.com, jeff@example.com, kerstin@example.com
Soviel als kurze Einführung, wie man Zuweisungen mit Datenbanken benutzt.
Es ist wichtig die 3 verschiedenen Arten von Domänen zu verstehen, die Postfix kennt. Die meisten "es funktioniert nicht" E-Mails, stammen von Lesern, die virtuelle und lokale Domänen vermischen. Domänen sind entweder...
Alle Domänen die in der main.cf unter mydestination aufgeführt sind werden als lokale Domänen behandelt. Ihre Standarddomäne (/etc/defaultdomain) ist normalerweise als lokale Domäne konfiguriert. E-Mails für lokale Domänen werden an Systembenutzer (die in `` /etc/passwd`` aufgelistet sind) zugestellt. Die Mails werden standardmäßig nach /var/mail zugestellt. Sie sollten auf alle Fälle "localhost" als lokale Domäne benutzen, damit Sie immer Mails für root@localhost emfpangen können. Stellen Sie sich vor Ihre Datenbank Server hat Probleme und sendet diese an Ihren Root-Account, aber ihr Root Account liegt auf einer virtuellen Domäne. Eine lokale Domäne kann hier helfen.
Domänen die als virtual_alias_domains gelistet sind, könne für Weiterleitung ("aliasing") der E-Mails von einer Adresse zu einer anderen Adresse (oder mehreren Adressen) benutzt werden. Virtuelle Alias-Domänen empfangen keine Mails der Benutzer. Sie leiten die Mails nur an eine andere Adresse weiter.
Die virtual_alias_maps-Zuweisung beinhaltet Weiterleitungen (Quelle, Ziel) der Benutzer oder Domänen zu anderen E-Mail Adressen oder ganzen Domänen. Übrigens funktionieren virtual_allias_maps auch bei lokalen E-Mail Adressen. Sie brauchen virtuelle Alias-Domänen also nicht unbedingt, da Sie alle Domänen als virtuelle Postfach-Domänen deklarieren und virtual_alias_maps als Aliase benutzen können.
Die interessanteste Domänenart in dieser Anleitung ist die virtuelle Postfach-Domäne. Solche Domänen sind in virtual_mailbox_domains gelistet, empfangen E-Mails für virtuelle Benutzer und speichern diese in den Postfächern auf Ihrer Festplatte.
Die virtual_mailbox_maps Parameter geben Postfix vor, wo sich das Postfach für einen bestimmten User auf der Festplatte befindet. Der Pfad ist relativ zum virtual_mailbox_base Verzeichnis, welches standardmäßig nicht gesetzt ist.
Bemerkung
Eine Domäne darf nur in einer dieser drei Kategorien aufgeführt werden. Wenn Sie dies nicht beachten, werden Sie Fehlermeldungen und unvorhersehbares Verhalten feststellen.
Wenn Sie alle Domänen als virtuelle Postfach Domänen deklarieren wollen, werden Sie sich wundern warum Sie überhaupt noch lokale Domänen benötigen. Sie sollten auf alle Fälle folgendes setzen:
mydestination = localhost
damit Sie E-Mails z.B. an root@localhost senden können.
Wir empfehlen außerdem, dass Sie sich bei Gelegenheit mit der offiziellen Dokumentation zu virtuellen Domänen geschäftigen.
Da Sie jetzt hoffentlich die grundlegenden Konzepte von virtuellen Domänen, Zuweisungen und Datenbankzugriffen verstehen, ist es an der Zeit sich die Hände schmutzig zu machen. Werden Sie root auf Ihrem Server und stellen Sie sicher, dass ihre /etc/hostname den Hostnamen ohne den Domänenteil beinhaltet. Die Datei /etc/mailname beinhaltet hingegen den voll-qualifizierten Hostnamen mit dem Domänenteil.
Sie müssen evtl. auch Ihre /etc/hosts anpassen. Führen Sie hostname --fqdn aus und stellen Sie sicher, dass Sie den voll-qualifizierten Hostnamen erhalten. Wenn Sie den Hostnamen ohne den Domänenteil erhalten, überprüfen Sie Ihre /etc/hosts Datei. Der voll-qualifizierte Hostname muss der erste in der Liste sein.
Falsch:
20.30.40.50 mailserver42 mailserver42.example.com
Richtig:
20.30.40.50 mailserver42.example.com mailserver42
Fangen Sie nun an, indem Sie Postfix mit MySQL-Unterstützung installieren:
$> aptitude install postfix-mysql
Dies wird ausserdem das postfix Paktet als Abhängigkeit installieren. Wenn Sie nach der Art der Konfiguration gefragt werden, wählen Sie "Internet Site". Beantworten Sie die Frage nach dem "Mail name" durch Eingabe des voll-qualifizierten Hostnamens (mit dem Domänenteil) Ihres Systems.
Wenn Sie den MySQL-Server auf dem gleichen Server laufen lassen wollen:
$> aptitude install mysql-server-5.0
Da Sie Ihren Benutzern POP3- und IMAP-Dienste anbieten wollen, müssen Sie diese installieren:
$> aptitude install dovecot-pop3d $> aptitude install dovecot-imapd
Ihre Benutzer werden es mögen, wenn Sie Spam und (Windows) Viren für Sie ausfiltern. Amavis leistet hier gute Arbeit:
$> aptitude install amavisd-new libclass-dbi-mysql-perl
Damit AMaViS später die Domäneninformationen aus der Datenbank lesen kann, benötigen wir das Perl DBI-Modul. AMaViS an sich ist beinahe nutzlos, solange Sie nicht die vorgeschlagenen Pakete installieren um Anhäge auf Viren überprüfen und Spam erkenne zu können. Installieren Sie nun diese Pakete:
$> aptitude install spamassassin clamav-daemon cpio arj zoo nomarch lzop cabextract pax
Einige der vorgeschlagenen Pakete sind nicht "frei" genug um in der Debian main-Sektion verfügbar zu sein. Wenn Sie diese installieren wollen, müssen Sie zuerst die Sektionen contrib und non-free in ihrem Debian-Spiegel unter /etc/apt/sources.list nachtragen. Normalerweise müssen Sie nur die Wörter contrib und non-free an die existierende Spiegel Zeile anhängen:
deb http://ftp.debian.org/debian/ etch main contrib non-free
Nun sind Sie in der Lage die non-free Pakete zu installieren:
$> aptitude update $> aptitude install lha unrar
Als nächstes wollen wir das OpenSSL-Paket installieren, um später ein korrektes SSL Zertifikat zu erstellen, damit Ihre Benutzer den Mailserver sicher benutzen können:
$> aptitude install openssl
Wenn Sie einen Webmail Dienst anbieten wollen, können wir Ihnen das Squirrelmail-Paket empfehlen. Dieses wird automatisch einen Apache Server mitinstallieren, falls Sie noch keinen installiert haben. Tippen Sie:
$> aptitude install squirrelmail
Da Ihre Information für Postfix in einer MySQL-Datenbank gespeichert werden, können Sie die PhpMyAdmin-Software installieren, um die Datenbank und deren Inhalt später bequem im Webbrowser zu administrieren:
$> aptitude install phpmyadmin libapache2-mod-php5 php5-mysql
Damit Sie Ihren Server später mit 'telnet' testen können:
$> aptitude install telnet
Mit dem konsolenbasierten E-Mail Client mutt können Sie Mails der Postfächer direkt von der Festplatte lesen. Es wird ihnen helfen, die Konfiguration zu testen. Es ist außerdem ein sehr mächtiger IMAP Email-Client, den viele Nutzer als Ihr hauptsächliches Mail-Programm verwenden. Vielleicht gefällt es Ihnen ja auch. Sie sollten es installieren:
$> aptitude install mutt
Jetzt ist es an der Zeit, die MySQL-Datenbank und dessen Tabellen zu erstellen. Wenn Sie Erfahrung mit der Benutzung von MySQL haben, können Sie Ihre SQL-Abfragen in der 'mysql' Kommandozeile eingeben. Alternativ können Sie phpmyadmin benutzen, in dem Sie in der Adressleiste Ihres Browsers http://yourmailserver/phpmyadmin aufrufen
Falls Sie Ihren MySQL-Server gerade erst installiert haben, können Sie sich mit dem Benutzer 'root' ohne Passwort einloggen. Setzen Sie unbedingt ein neues Passwort für diesen Account. Dazu führen Sie folgenden Befehl in der Konsole aus:
$> mysqladmin password root2007
Bemerkung
Ersetzen Sie 'root2007' unbedingt durch ein sicheres Passwort. Sie können das Paket 'pwgen' installieren und benutzen um ein sichers Passwort zu generieren. In der Anleitung benutzen wir als Beispielpasswort 'root2007'. Ersetzen Sie dieses durch Ihr eigenes, wenn es hier im Tutorial erwähnt wird.
Erstellen Sie nun die Datenbank und nennen Sie sie 'mailserver' (sie werden nach dem obigen Passwort gefragt):
$> mysqladmin -p create mailserver
Aus Sicherheitsgründen ist es sinnvoll, einen weiteren MySQL-Benutzer mit weniger Rechten anzulegen, den Ihr Mailserver später benutzen wird. Verbinden Sie sich mit Ihrer Datenbank:
$> mysql -p
Wenn Sie den mysql>-Prompt sehen, geben Sie folgendes SQL Statement ein, um die passenden Rechte zu vergeben:
mysql> GRANT SELECT ON mailserver.* TO mailuser@localhost IDENTIFIED BY 'mailuser2007'; exit
Dies erzeugt einen Benutzer namens 'mailuser' der nur lesende Rechte auf die Datenbank besitzt, sie jedoch nicht verändern kann. Wenn Sie Daten in der Datenbank verändern möchten, verwenden Sie den Benutzer 'root' order legen Sie einen weiteres Konto für diesen Zweck an. Das Passwort 'mailuser2007' dient nur als Beispiel, ersetzen Sie es durch ein sicheres Passwort.
In Ihrer neu erstellten Datenbank müssen Sie Tabellen anlegen, die die Informationen von Domänen, Weiterleitungen und E-Mailpostfächer der Benutzer beinhalten. Verbinden Sie sich erneut mit MySQL und wählen Sie die Datenbank 'mailserver':
$> mysql -p mailserver
Sie werden erneut den mysql>-Promt sehen. Erstellen Sie zuerst eine Tabelle für die Liste der virtuellen Domänen die Sie anbieten wollen:
mysql> CREATE TABLE `virtual_domains` ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL ) ENGINE = InnoDB;
Die nächste Tabelle beinhaltet Informationen der aktuellen Benutzer-Konten. Jeder Benutzer hat einen Benutzernamen und ein Passwort. Diese Daten werden benötigt um Zugang zu den Mailpostfächern über POP3 oder IMAP zu erhalten, um sich in die Webmail-Oberfläche einzuloggen oder um E-Mails zu verschicken wenn man sich nicht im lokalen Netzwerk befindet. Da Benutzer gerne mal etwas vergessen, ist die E-Mail Adresse des Benutzers zugleich sein Login Benutzername. Erstellen Sie nun die Tabelle:
mysql> CREATE TABLE `virtual_users` ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, domain_id INT(11) NOT NULL, user VARCHAR(40) NOT NULL, password VARCHAR(32) NOT NULL, CONSTRAINT UNIQUE_EMAIL UNIQUE (domain_id,user), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE = InnoDB;
Und zum Schluss brauchen wir noch eine Tabelle für die Aliase (Email-Weiterleitungen) von einer Email-Adresse zu einer anderen:
mysql> CREATE TABLE `virtual_aliases` ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, domain_id INT(11) NOT NULL, source VARCHAR(40) NOT NULL, destination VARCHAR(80) NOT NULL, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE = InnoDB;
Sie wundern sich über die foreign keys? Sie drücken aus, dass Einträge in der virtual_aliases und virtual_users Tabelle mit Einträgen in der virtual_domains Tabelle verbunden sind. Dies hält die Daten in Ihrer Datenbank konsistent, da Sie keine virtuellen Aliase oder virtuelle Benutzer anlegen können, die nicht mit einer virtuellen Domäne verbunden sind. Und Sie vermeiden Redundanz, da Sie den Domänennamen nur einmal speichern - in der virtual_domains Tabelle - sonst nirgendwo. Der Zusatz 'ON DELETE CASCADE' bedeutet, dass automatisch Aliases und Benutzerkonten gelöscht werden, wenn Sie die dazugehörige Domäne löschen. Somit vermeiden Sie verwaiste Einträge. Stellen Sie sich vor dass Sie eine bestimmte Domäne nicht länger hosten wollen. Sie können einfach den Eintrag aus der virtual_domains Tabelle löschen und alle referierende/abhängige Einträge in den anderen Tabellen werden ebenfalls gelöscht. Diese Vorgehensweise bezeichnet man auch als normalisierte Datenbank.
Ein Beispiel der Daten in der Tabelle:
| virtual_domains | |
|---|---|
| id | name |
| 1 | example.com |
| 2 | foobar.org |
| virtual_users | |||
|---|---|---|---|
| id | domain_id | user | password |
| 1 | 1 | john | summersun |
| 2 | 1 | steve | veryloud |
| 3 | 2 | kerstin | dogfood |
Die Email-Adressen der drei Benutzer in der Datenbank wären dann:
Lassen Sie uns einen einfachen Alias hinzufügen:
| virtual_aliases | |||
|---|---|---|---|
| id | domain_id | source | destination |
| 1 | 1 | steve | steve.miller@gmail.com |
| 2 | 2 | kerstin | kerstin42@yahoo.com |
| 3 | 2 | kerstin | kerstin@mycompany.com |
Dies bewirkt, dass Mails für steve@example.com an steve.miller@gmail.com weitergeleitet werden. Die Mails für kerstin@foobar.org werden an kerstin42@yahoo.com und kerstin@mycompany.com weitergeleitet.
Seien Sie nicht verängstigt, wenn diese Vorgehensweise etwas kompliziert aussieht. Die Datenbank ist nicht dafür ausgelegt, um durch manuelle SQL-Kommandos verwaltet zu werden. Aber es ist dennoch wichtig, dass Sie das Schema der Datenbanktabellen verstehen. Es gibt bereits Web-basierte Administrations-Programme, die die Verwaltung von Email-Konten einfacher machen.
Wie vorher bereits beschrieben, sind Zuweisungen bei Postfix nur Tabellen, die eine linke und eine rechte Seite haben. Damit Postfix MySQL benutzt, um eine Zuweisung zu definieren, benötigen wir eine 'cf' Datei (Konfigurationsdatei). Fangen Sie mit der Erstellung der Datei /etc/postfix/mysql-virtual-mailbox-domains.cf für die virtual_mailbox_domains-Zuweisung an:
user = mailuser password = mailuser2007 hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s'
Stellen Sie sich vor, dass Postfix herausfinden will ob example.com eine virtuelle Postfach-Domäne ist. Postfix wird die obige SQL-Abfrage ausführen und '%s' mit 'example.com' ersetzen. Wenn es einen passenden Eintrag in der virtual_domains-Tabelle findet, wird es den Wert '1' zurückliefern. Eigentlich ist es egal welcher Wert zurückgeliefert wird, solange irgendein Ergebnis zurückgeliefert wird.
Jetzt müssen Sie Postfix beibringen, diese Zuweisung auch zu benutzen:
$> postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
(Das postconf -e-Kommando fügt in geeigneter Weise die Zeilen in Ihre /etc/postfix/main.cf Datei ein. Ausserdem aktiviert es die neuen Einstellungen sofort (Sie müssen Postfix also nicht neu laden.)
Postfix wird ab jetzt Ihre virtual_domains-Tabelle durchsuchen, ob eine bestimmte Domäne eine virtuelle Postfach-Domäne ist. Lassen Sie uns testen ob es funktioniert. Erstellen Sie eine Zeile in der virtual_domains Tabelle mit einer Domäne. Verbinden sie sich hierzu mit Ihrer Datenbank:
$> mysql -p mailserver
und führen Sie folgende Abfrage aus:
mysql> INSERT INTO virtual_domains (id, name) VALUES (1, 'example.com'); exit
Zurück in Ihrer Shell können Sie nun überprüfen ob die Domäne 'example.com' als virtuelle Postfach Domäne erkannt wird:
$> postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Sie sollten den Wert '1' zurückgeliefert bekommen.
Bemerkung
Wenn Sie eine diese Fehlermeldung erhalten: postmap: warning: connect to mysql server 127.0.0.1: Access denied... liegt ein Problem mit dem Benutzerkonto "mailuser" vor, über den Sie sich mit der Datenbank verbinden. Überprüfen Sie dann erneut die MySQL-Rechte.
Wenn Sie folgende Fehlermeldung erhalten: postmap: warning: connect to mysql server 127.0.0.1: Can't connect to MySQL server on '127.0.0.1' läuft entweder Ihr MySQL-Server nicht oder er horcht nicht auf der Adresse 127.0.0.1. Überprüfen Sie Ihre MySQL Server Konfiguration (/etc/mysql/my.cnf).
Ihre erste Zuweisung funktioniert. Prima. Gehen wir zur zweiten über. Sie definieren nun die virtual_mailbox_maps welche für die Zuweisung von Email-Adressen (linke Seite) zum Speicherort der Benutzer-Postfächer auf Ihrer Festplatte (rechte Seite) zuständig ist. Wenn Sie eingehende Mails über den Postfix-eigenen virtuellen Zustellungsdienst ausliefern, würde eine Abfrage erfolgen um den Pfad zum Postfach herauszufinden. Aber in unserem Fall erfolgt die Zustellung durch den LDA (local delivery agent) von Dovecot, so dass Postfix der Pfad zum Postfach egal sein kann. Postfix benötigt lediglich die Möglichkeit zu überprüfen ob eine bestimmte Email Adresse zu einem vorhandenen virtuellen Benutzer gehört. Wie oben auch benötigen Sie also eine SQL-Abfrage die nach einer Email-Adresse sucht und den Wert "1" zurückliefert.
Zuerst müssen Sie sich jedoch mit den Dateirechten befassen. Aus Sicherheitsgründen wird vorgeschlagen, dass Sie einen neuen System Benutzer erstellen, dem alle virtuellen Postfächer gehören. Die folgenden Shell Kommandos erstellen eine System-Gruppe "vmail" mit der GID (Gruppen ID) 5000 und einen System-Benutzer mit der UID (Benutzer ID) 5000. (Stellen Sie sicher, dass die UID und GID nicht bereits benutzt wird - Sie können jede Nummer zwischen 1000 und 65000 wählen, die noch frei ist):
$> groupadd -g 5000 vmail $> useradd -g vmail -u 5000 vmail -d /home/vmail -m
Sie müssen die virtual_uid_maps und virtual_gid_maps auf diese IDs setzen:
$> postconf -e virtual_uid_maps=static:5000 $> postconf -e virtual_gid_maps=static:5000
Erstellen Sie einen Eintrag in der virtual_users Tabelle für den Testbenutzer john@example.com:
mysql>
INSERT INTO virtual_users (id, domain_id, user, password)
VALUES (1, 1, 'john', MD5('summersun'));
Als nächstes müssen Sie eine cf-Datei erstellen, um für Postfix die passende SQL-Abfrage für diese Tabelle festzulegen. Aber offensichtlich können Sie nicht alle Informationen nur aus der virtual_user Tabelle bekommen. Der Domänen-Name muss aus der virtual_domains Tabelle geholt werden. "john@example.com" ist unser virtueller Benutzer, jedoch ist der Benutzer Teil "john" in der Tabelle virtual_users gespeichert während der Eintrag für die Domäne "example.com" in der Tabelle virtual_domains liegt. Dank der JOIN SQL-Anweisung können Sie diese beiden Tabellen verbinden. Eine Abfrage die uns die Email-Adressen aller virtuellen Benutzer zeigen kann, würde so aussehen:
mysql> SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email FROM virtual_users LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
MySQL sollte ausgeben:
+------------------+ | email | +------------------+ | john@example.com | +------------------+
Zusätzlich zu der Email-Adresse ist es später auch wichtig das Passwort des Benutzers zu erhalten. Da der Pfad zum Speicherort der Benutzerpostfächer sich nicht ändert, ist es unwichtig diese Information aus der Datenbank zu holen. Die Verzeichnisstruktur sieht so aus: /home/vmail/$DOMAIN/$USER. Bei Johns Beispiel wäre dies /home/vmail/example.com/john.
Die Abfrage muss lediglich auch nach dem password-Feld fragen:
mysql>
SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email,
virtual_users.password
FROM virtual_users
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
Das Ergebnis der Abfrage lautet:
+------------------+----------------------------------+ | email | password | +------------------+----------------------------------+ | john@example.com | 14cbfb845af1f030e372b1cb9275e6dd | +------------------+----------------------------------+
Wie Sie sehen wird das Passwort nicht im Klartext sondern als MD5 Hash gespeichert. Die Abfrage sieht vielleicht etwas kompliziert aus, wenn Sie nicht täglich mit SQL-Abfragen zu tun haben. Auf alle Fälle ist sie nicht gerade handlich. Anstatt diese Abfrage in die cf Datei zu schreiben, gibt es seit MySQL 5.0 ein Feature namens Ansichten (views). Eine Ansicht erlaubt Ihnen, Abfragen in einer Tabelle zu speichern. Erstellen wir nun die Ansicht:
mysql>
CREATE VIEW view_users AS
SELECT CONCAT(virtual_users.user, '@', virtual_domains.name) AS email,
virtual_users.password
FROM virtual_users
LEFT JOIN virtual_domains ON virtual_users.domain_id=virtual_domains.id;
Nun können wir die Informationen der virtuellen Benutzer mit einer einfachen SELECT-Abfrage über die view_users-Ansicht abfragen:
mysql> SELECT * FROM view_users;
Sie sollten das gleiche Ergbnis wie oben erhalten:
+------------------+----------------------------------+ | email | password | +------------------+----------------------------------+ | john@example.com | 14cbfb845af1f030e372b1cb9275e6dd | +------------------+----------------------------------+
Jetzt sind die Dinge etwas einfacher und Sie können die cf Datei /etc/postfix/mysql-virtual-mailbox-maps.cf mit folgendem einfachen Inhalt erstellen:
user = mailuser password = mailuser2007 hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM view_users WHERE email='%s'
Teilen Sie Postfix mit, dass es diese Konfigurationsdatei für die Zuweisung virtual_mailbox_maps benutzen soll:
$> postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Schauen Sie nach, ob Postfix mit diesen Einstellungen glücklich ist, indem Sie es fragen wo sich das Postfach Verzeichnis von john@example.com befindet:
$> postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Sie sollten als Resultat 1 erhalten, was bedeutet dass john@example.com ein existierender virtueller Postfachbenutzer auf Ihrem Server ist. Später im Konfigurationsteil von dovecot werden Sie die email und password Felder benutzen. Postfix an sich braucht diese hier nicht.
Die Zuweisung virtual_alias_maps wird benutzt, um Emails von einer Email-Adresse zu einer anderen weiterzuleiten. Hier ein paar Beispiele für Einträge in solch einer Zuweisung:
| Quelle (links) | Ziel (rechts) | Bedeutung |
|---|---|---|
| john@example.com | jmiller@gmail.com | Johns Mails zu gmail weiterleiten |
| john@example.com | john@example.com, jmiller@gmail.com | Ein Kopie zum originalen Konto von john@example.com weiterleiten jedoch auch eine Kopie an jmiller@gmail.com zu senden |
| @example.com | john@example.com | Alle E-Mails dieser Domäne an john@example.com weiterleiten solange kein weiteres Benutzer Konto existiert. Wenn kerstin@example.com nicht existiert werden ihre Mails an John weitergeleitet. Falls kerstin@example.com existiert bekommt sie die Mails. Dies nennt man ein catchall Konto. |
Unter man 5 virtual bekommen Sie die formelle Beschreibung.
Wie Sie sehen können, ist es möglich verschiedene Ziele getrennt durch Kommas anzugeben. In der Datenbank kann der gleiche Effekt durch Benutzung verschiedener Zeilen erreicht werden. Der erste Eintrag oben sollte in 2 Zeilen aufgeteilt werden:
| Quelle (LHS) | Ziel (RHS) |
|---|---|
| john@example.com | john@example.com |
| john@example.com | jmiller@gmail.com |
Lassen Sie uns nun ein Beispiel in die Datenbank schreiben:
mysql>
INSERT INTO virtual_aliases (id, domain_id, source, destination)
VALUES (1, 1, 'john', 'john@example.com'),
(2, 1, 'john', 'jmiller@gmail.com');
Erstellen wir nun auch eine Ansicht (view) für die virtuellen Aliase:
mysql>
CREATE VIEW view_aliases AS
SELECT CONCAT(virtual_aliases.source, '@', virtual_domains.name) AS email,
destination
FROM virtual_aliases
LEFT JOIN virtual_domains ON virtual_aliases.domain_id=virtual_domains.id;
Diese Abfrage ist etwas komplizierter als der vorhergehende. Sie holt alle Zeilen von virtual_aliases und verbindet sie mit der virtual_domains-Tabelle (das domain_id-Feld der virtual_aliases-Tabelle stimmt mit dem id-Feld der virtual_domains-Tablle überein). Zu kompliziert? Das braucht Sie nicht länger zu ärgern, da Sie jetzt die Ansicht view_aliases benutzen können:
mysql> SELECT * FROM view_aliases;
um die entsprechenden Ergebnisse zu erhalten:
+------------------+-------------------+ | email | destination | +------------------+-------------------+ | john@example.com | john@example.com | | john@example.com | jmiller@gmail.com | +------------------+-------------------+
Da die SQL-Ansicht perfekt funktioniert, können Sie sie nun mit Postfix benutzen. Erstellen Sie eine cf-Datei namens /etc/postfix/mysql-virtual-alias-maps.cf mit folgendem Inhalt:
user = mailuser password = mailuser2007 hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM view_aliases WHERE email='%s'
Testen Sie, ob die Zuweisung Datei wie erwartet funktioniert:
$> postmap -q john@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Sie sollten die beiden erwarteten Ziele erhalten:
john@example.com,jmiller@gmail.com
Bevor Sie die Einstellung der virtual_alias_maps vornehmen, müssen Sie eine kleine Besonderheit beachten. Es gibt eine spezielle Art der Weiterleitung: Die "Catch-All" Aliase. Catch-Alls fangen alle Mails für eine Domäne für die keine Benutzerkonten spezifiziert wurden. Ein Catch-All Alias wäre z.B. "@example.com", welcher alle E-Mails der Domäne auf ein Konto weiterleiten würde. Wir haben einen Benutzer 'john@example.com' erstellt und wollen dass alle anderen E-Mails der Domäne an 'kerstin@gmail.com' weitergeleitet werden. Wir würden hier für folgenden Catch-All Alias anlegen:
| Ziel | |
|---|---|
| @example.com | kerstin@gmail.com |
Stellen Sie sich vor was passieren würde, wenn Postfix eine E-Mail für 'john@example.com' empfangen würde. Postfix würde zuerst nachsehen ob es in der virtual_alias_maps einen Alias gibt. Es würde den obigen Catch-All Eintrag finden und die Mail an 'kerstin@gmail.com' weiterleiten, da kein anderer Alias definiert würde. Das ist jedoch nicht was wir wollen. Deswegen müssen Sie die Tabelle um einen Eintrag erweitern:
| Ziel | |
|---|---|
| @example.com | kerstin@gmail.com |
| john@example.com | john@example.com |
Spezifischer festgelegte Aliase haben höhere Priorität als die Catchall-Aliase. Postfix wird den Eintrag für 'john@example.com' zuerst finden und die Mails sollten an die gleiche Adresse 'john@example.com' "weitergeleitet" werden. Diese Vorgehensweise scheint etwas verwirrend zu sein, aber Sie werden Sie brauchen wenn Sie Catch-All Konten benutzen wollen. Die virtual_alias_maps-Zuweisung muss also beides leisten: die "view_aliases" und die "john-an-sich-selbst"-Zuweisung. Erstellen Sie eine cf-Datei /etc/postfix/mysql-email2email.cf für das letztere mit folgendem Inhalt:
user = mailuser password = mailuser2007 hosts = 127.0.0.1 dbname = mailserver query = SELECT email FROM view_users WHERE email='%s'
Überprüfen Sie ob Sie John's Email Adresse zurückgeliefert bekommen, wenn Sie Postfix fragen, ob es Aliasse für ihn gibt:
$> postmap -q john@example.com mysql:/etc/postfix/mysql-email2email.cf
Das Ergebnisse sollte die gleiche Adresse sein:
john@example.com
Nun müssen Sie Postfix noch mitteilen, dass diese beiden Zuweisungen durchsucht werden sollen indem Sie folgende Zeile in Ihre main.cf eintragen:
$> postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf,mysql:/etc/postfix/mysql-email2email.cf
Bitte denken Sie daran, dass die Reihenfolge der beiden Zuweisungen wichtig ist. Postfix wird alle passenden Einträge in der ersten virtual_alias_maps beachten und sie als Alias verwenden. Nur wenn keine Ergebnisse gefunden werden, wird Postfix die zweite Zuweisung email2email befragen.
Sie haben es geschafft! Alle Zuweisungen sind eingerichtet und die Datenbank ist bereit um mit Domänen und Benutzer gefüllt zu werden. Stellen Sie sicher, dass nur 'root' und der 'postfix' Benutzer die-cf Dateien lesen kann, da hier ihr Datenbankpasswort gespeichert ist:
chgrp postfix /etc/postfix/mysql-*.cf chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Postfix nutzt standardmäßig einen Zustellagenten namens "virtual", der gewöhnlich die E-Mails an virtuelle Postfächer ausliefert. Dovecot hat jedoch seinen eigenen Zustellagenten, der auch "Dovecot LDA" genannt wird und mehr Funktionalität bietet.
Damit Postfix diesen Agenten auch benutzt, müssen Sie einen Dienst in Ihre /etc/postfix/master.cf eintragen:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
Ebenso müssen Sie ein paar Zeilen in Ihre /etc/postfix/main.cf eintragen, damit Postfix den Dienst für die virtuelle Zustellung auch nutzt:
$> postconf -e virtual_transport=dovecot $> postconf -e dovecot_destination_recipient_limit=1
Dies ermöglicht Postfix, eingehende Emails für virtuelle Benutzer an das Programm /usr/lib/dovecot/deliver weiterzureichen. Nun ist es an der Zeit, Dovecot zu konfigurieren:
Lassen Sie uns nun Dovecot konfigurieren, damit die POP3- und IMAP-Dienste funktionieren können. Die Konfigurationsdateien von Dovecot finden Sie unter /etc/dovecot. Beginnen Sie mit der...
Setzten Sie die Parameter in der Zeile protocols auf folgende Werte:
protocols = imap imaps pop3 pop3s
damit Dovecot den IMAP- und POP3-Dienst, sowie die äquivalenten Dienste die eine SSL (secure socket layer)-verschlüsselte Verbindung benutzen, startet.
Wenn sich Benutzer beschweren, dass sie keine E-Mails empfangen können, ändern Sie folgende Einstellung:
disable_plaintext_auth = no
Dies bewirkt, dass man sich auch mit Klartext Passwörtern über eine unsichere (nicht-SSL verschlüsselte) Verbindung authentifizieren kann. Standardmäßig ist der Wert aus Sicherheitsgründen auf 'yes' gesetzt. Ihn auf 'no' zu setzten, bedeutet weniger Sicherheit wird aber Nutzern helfen, die keine sichere Verbindung verwenden können.
Eine viel wichtigere Einstellung ist:
mail_location = maildir:/home/vmail/%d/%n
welche mitteilt, dass die Postfächer der Benutzer im maildir-Format unter /home/vmail/DOMAIN/USER zu finden sind.
Wenn Sie einer früheren Anleitung für Sarge oder Woody gefolgt sind und bereits virtuelle Mailpostfächer auf Ihrem System haben, sollten Sie den eindeutigen Namensraum für IMAP definieren, damit die Bneutzer Ihre Ordner dort vorfinden, wo Sie vorher auch waren:
namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
Suchen Sie den Konfigurationsabschnitt "auth default". Definieren Sie zuerst die erlaubten Authentifizierungsmodi:
mechanisms = plain login
Im gleichen Abschnitt müssen Sie ändern:
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
Dies teilt Dovecot mit, dass die Passwörter in einer SQL-Datenbank gespeichert sind. Und durch den Eintrag:
userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
weiß Postfix wo sich die Postfächer befinden. Dies ist das gleiche wie die mail_location Einstellung.
Den Abschnitt namens passdb pam der den Zugang für System-Benutzer erlaubt, sollten Sie auskommentieren. Andernfalls wird Dovecot auch nach Systembenutzern Ausschau halten, wenn jemand Emails abruft. Dies führt zu Warnungen in Ihren Log-Dateien.
Suchen Sie nun den Abschnitt socket listen. Hier definieren Sie die Socket-Dateien, die für die Kommunikation mit Dovecot's Autentifizierungsmethoden verwendet werden:
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
Der Abschnitt master wird benutzt, um dem Zustellagenten von Dovecot (das Programm, dass die Mails in die Postfächer der Benutzer speichert) Zugang zu den userdb-Informationen zu erlauben. Der Abschnitt client erstellt einen Socket im "chroot" Verzeichnis von Postfix. Chroot bedeutet dass einige Teile von Postfix unter /var/spool/postfix gefangen sind und nur auf Dateien in diesem Verzeichnis zugreifen können. Es stellt ein gutes Maß an Sicherheit dar. Sogar wenn Postfix Fehler haben sollte und ein Angriff stattfinden würde, hätte der Angreifer trotzdem keinen Zugriff auf z.B. /etc/passwd.
Zum Schluss muss noch der Abschnitt protocol lda angepasst werden. Der Zustellagent (LDA) ist geeigneter als der mit Postfix kommende "virtual"-Agent. Er ermöglicht Quotas und Sieve-Filter (ist im Standard Paket docecot-common enthalten). Der Abschnitt sollte so aussehen:
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@example.com
mail_plugins = cmusieve
global_script_path = /home/vmail/globalsieverc
}
Bitte ändern Sie die obige postmaster E-Mail Adresse auf eine gültige Adresse, über die der Administrator erreicht werden kann.
Editieren Sie die /etc/dovecot/dovecot-sql.conf und ändern Sie die Einstellungen wie folgt:
driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuser2007 default_pass_scheme = PLAIN-MD5 password_query = SELECT email as user, password FROM view_users WHERE email='%u';
Starten Sie Dovecot neu:
$> /etc/init.d/dovecot restart
Schauen Sie sich nun Ihre /var/log/mail.log an. Sie sollten einen ähnlichen Eintrag wie hier finden:
dovecot: Dovecot v1.0.rc15 starting up dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)
Während des ersten Neustarts von Dovecot werden Diffie-Hellman Parameter erstellt und die Rechte von /var/run/dovecot und /var/run/dovecot/login angepasst. Das ist völlig normal.
Sie müssen zuerst die Datei-Rechte für /etc/dovecot/dovecot.conf ändern, bevor Sie die erste Testmail verschicken können. Der Benutzer vmail muss Zugang zur Konfigurationsdatei von Dovecot haben, da Postfix den Zustellagenten mit den Rechten von vmail startet:
$> chgrp vmail /etc/dovecot/dovecot.conf $> chmod g+r /etc/dovecot/dovecot.conf
Lassen Sie uns nun versuchen, eine E-Mail an einen Benutzer zu senden. Da die Domäne "example.com" nicht wirklich existiert und Sie Ihre DNS Einstellungen nicht zum richtigen Server führt, simulieren wir nun eine SMTP Sitzung mit dem telnet Kommando:
$> telnet localhost smtp
Der Server sollte antworten:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailtest ESMTP Postfix (Debian/GNU)
Großartig. Postfix lauscht und will von uns SMTP Eingaben. Zuerst müssen wir freundlich sein:
ehlo example.com
Postfix schätzt unsere Freundlichkeit und erzählt uns, welche Funktionen es anbietet:
250-my-new-mailserver 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Hey Postfix, wir haben eine Mail von steve@example.com:
mail from:<steve@example.com>
Sieht so aus als wäre Postfix glücklich darüber, weil zurückgelieferte Codes die mit '2' beginnen grundsätzlich gut sind:
250 2.1.0 Ok
Teilen Sie Postfix mit wer der Empfänger der Mail ist:
rcpt to:<john@example.com>
Postfix akzeptiert dies:
250 2.1.5 Ok
Jetzt können wir die eigentlichen Mail schicken:
data
Postfix stimmt zu und sagt uns, dass wir die aktuelle Mail nun verschicken können und die Eingabe mit einem Punkt in einer separaten Zeile beenden sollen:
354 End data with <CR><LF>.<CR><LF>
Okay, schreiben Sie nun den Text der Mail:
Hallo John, Ich wollte dir nur mal eine Mail schicken. .
Postfix teilt uns mit, das es die Mail empfangen und mit einer Wartenschlagen ID (Queue ID) in die Warteschlange gestellt hat:
250 2.0.0 Ok: queued as A9D64379C4
Danke Postfix, wir sind fertig:
quit
Schauen Sie sich nun die Datei /var/log/mail.log an. Sie sollten einen ähnlichen Eintrag wie folgenden finden:
postfix/smtpd[...]: connect from localhost[127.0.0.1] postfix/smtpd[...]: 5FF712A6: client=localhost[127.0.0.1] postfix/cleanup[...]: 5FF712A6: message-id=<...> postfix/qmgr[...]: 5FF712A6: from=<steve@example.com>, size=364, nrcpt=1 (queue active) postfix/pipe[...]: 5FF712A6: to=<john@example.com>, relay=dovecot, ..., status=sent (delivered via dovecot service) postfix/qmgr[...]: 5FF712A6: removed postfix/smtpd[...]: disconnect from localhost[127.0.0.1]
Die Zustellung hat funktioniert. Postfix hat richtig erkannt, dass die Zieldomäne eine virtuelle Domäne ist und hat die E-Mail an den 'dovecot' Dienst weitergeleitet.
Die E-Mail sollte sich nun irgendwo unter /home/vmail/example.com/john befinden. Schauen wir uns das an:
$> cd /home/vmail/example.com/john $> find . ./cur ./new ./new/1179521979.V801I2bbf7M15352.mailtest ./tmp
Da ist die E-Mail. Versuchen Sie die Mail mit dem Programm "mutt" zu lesen:
$> mutt -f .
Die neue Mail wird angezeigt:
q:Quit d:Del u:Undel s:Save m:Mail r:Reply g:Group ?:Help 1 N May 18 steve@example.c (0.1K)
Drücken Sie ENTER um die Mail zu lesen:
From: steve@example.com To: undisclosed-recipients: ; Hallo John, Ich wollte dir nur mal eine Mail schicken.
Die Mail ist also in Johns Konto angekommen. Perfekt. Drücken Sie nun zweimal 'q' um Mutt zu verlassen.
John wird es sicherlich bevorzugen seine Mails mit einem komfortablen Mail-Programm zu lesen. Deswegen braucht er eine Möglichkeit, Zugang zu seinem Mailpostfach zu erlangen. Zwei Protokolle kommen hier ins Spiel:
Lassen Sie uns versuchen, eine POP3 Verbindung herzustellen und Johns E-Mails zu lesen:
$> telnet localhost pop3
Der Server antwortet:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Dovecot ready.
Als Benutzer John einloggen:
user john@example.com
Der Server sollte dies akzeptieren:
+OK
Senden Sie das Passwort:
pass summersun
Der Server sollte das Passwort annehmen:
+OK Logged in.
Eine Liste der Mails von John anzeigen:
list
Dovecot wird Ihnen sagen, dass eine Mail im Postfach vorliegt:
+OK 1 messages: 1 474 .
holen Sie sich die E-Mail Nummer 1:
retr 1
Dovecot schickt Ihnen die Mail:
+OK 474 octets
Return-Path: <steve@example.com>
X-Original-To: john@example.com
Delivered-To: john@example.com
Received: from example.com (localhost [127.0.0.1])
by ... (Postfix) with ESMTP id 692DF379C7
for <john@example.com>; Fri, 18 May 2007 22:59:31 +0200 (CEST)
Message-Id: <...>
Date: Fri, 18 May 2007 22:59:31 +0200 (CEST)
From: steve@example.com
To: undisclosed-recipients:;
Hallo John,
Ich wollte dir nur mal eine Mail schicken.
.
Trennen Sie die Verbindung zum POP3 Server:
quit
Der Server wird Ihre Verbindung trennen:
+OK Logging out. Connection closed by foreign host.
Anstatt folgende Prozedur zu nutzen (IMAP ist ziemlich kompliziert) könen Sie auch mutt benutzen um eine IMAP Verbindung herzustellen:
$> mutt -f imaps://john@example.com@localhost
Ansonsten stellen Sie eine IMAP Verbindzung zum Server her und geben Sie die IMAP-Befehle selbst ein:
$> telnet localhost imap2
Sie sollten eine Verbindung erhalten:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. * OK Dovecot ready.
IMAP-Befehle starten immer mit einer Nummer und antworten dem Kommando mit der gleichen Nummer. Deswegen müssen Sie folgende Kommandos mit der Nummer am Anfang jeder Zeile eingeben: Loggen Sie sich mit Benutzernamen und Passwort ein:
1 login john@example.com summersun
Dovecot loggt Sie ein:
1 OK Logged in.
Fragen Sie Dovecot nach einer Liste der Mailordner von John:
2 list "" "*"
Die Ausgabe der Liste erfolgt:
* LIST (\HasNoChildren) "." "INBOX" 2 OK List completed.
Wählen Sie Ihren Posteingang (Inbox):
3 select "INBOX"
Dovecot liefert Ihnen alle Informationen über den Ordner zurück:
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft) * OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted. * 1 EXISTS * 0 RECENT * OK [UIDVALIDITY 1180039205] UIDs valid * OK [UIDNEXT 3] Predicted next UID 3 OK [READ-WRITE] Select completed.
Sie sehen, dass eine Mail vorliegt. Holen Sie sie ab:
4 fetch 1 all
IMAP wird Ihnen nur grundlegende Informationen über die E-Mail liefern:
* 1 FETCH (FLAGS (\Seen) INTERNALDATE ......... 4 OK Fetch completed.
Um den wirklichen Mail Body zu lesen müssen Sie diesen explizit anfordern:
5 fetch 1 body[]
Da kommt er:
* 1 FETCH (BODY[] {474}
Return-Path: <steve@example.com>
X-Original-To: john@example.com
Delivered-To: john@example.com
Received: from example.com (localhost [127.0.0.1])
by ... (Postfix) with ESMTP id 692DF379C7
for <john@example.com>; Fri, 18 May 2007 22:59:31 +0200 (CEST)
Message-Id: <...>
Date: Fri, 18 May 2007 22:59:31 +0200 (CEST)
From: steve@example.com
To: undisclosed-recipients:;
Hallo John,
Ich wollte dir nur mal eine Mail schicken.
)
5 OK Fetch completed.
Trennen Sie die Verbindung zum Server:
6 logout
Dovecot loggt Sie aus:
* BYE Logging out 6 OK Logout completed. Connection closed by foreign host.
Es sieht so aus, als würden POP3 und IMAP funktionieren. Sie können nun einen E-Mail Client wie Kmail, Evolution oder Thunderbird/Icedove verwenden und ein POP3- oder IMAP-Email Konto einrichten. Mutt zu verwenden ist der schnellste weg um verschlüsselte Verbindungen zu testen:
$> mutt -f imaps://john@example.com@localhost
Wenn Sie andere Email-Programme verwenden, müssen Sie daran denken, dass der Benutzername gleich der E-Mail Adresse, also 'john@example.com' und das Passwort 'summersun' ist. Sie können folgende Verbindungsarten probieren:
Wenn Sie TLS/SSL verwenden, werden Sie eine Warnung erhalten dass das Zertifikat des Servers nicht vertrauenswürdig ist. Dovecot besitzt ein Beispielzertifikat, damit Sie Ihre Installation und die Benutzung von TLS/SSL (um Mails sicher zu empfangen) testen können. Unglücklicherweise scheint das "postinst" Skript (das nach der Installation des Packets 'dovecot-common' aufgerufen wird) das Zertifikat nicht richtig zu erstellen.
Dem allgemeinen Namen des Servers fehlt der Teil für die Domäne. (Ich habe den Fehler unter der Bug Nummer #425917 an bugs.debian.org gemeldet. Es sieht jedoch so aus als würde der Fehler in Etch nicht behoben werden) Deshalb rate ich Ihnen, Ihr eigenes Zertifikat mit dem richtigen Servernamen erstellen:
$> openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem
Während das Zertifikat und der Schlüssel erstellt werden, werden Ihnen ein paar Fragen dazu gestellt:
Generating a 1024 bit RSA private key .........++++++ ............................++++++ writing new private key to '/etc/ssl/certs/dovecot.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:Hamburg Locality Name (eg, city) []:Hamburg Organization Name (eg, company) [Internet Widgits Pty Ltd]:workaround.org Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:mailtest.workaround.org Email Address []:postmaster@workaround.org
Natürlich sollten Sie hier Ihre eigenen Informationen eintragen. Die wichtigste Einstellung ist der Common Name welcher den voll-qualifizierten Namen Ihres Mail-Servers enthalten muss. Ach ja, dieses Zertifikat ist für 10 Jahre gültig (3650 Tage) - legen Sie einfach die gewünschte Gültigkeitsdauer fest.
Vergessen Sie nicht, den privaten Key mit den richtigen Rechten zu versehen, damit niemand ihn unautorisiert lesen kann:
$> chmod o= /etc/ssl/private/dovecot.pem
Es ist wichtig, dass Sie zuerst das Problem offener Relays verstehen. Aus Sicherheitsgründen erlaubt Postfix entweder nur Mails von IP-Adressen die unter mynetworks (ihrem lokalen Netzwerk) aufgelistet sind oder zu lokalen oder virtuellen Domänen gehören zu verschicken. Alle anderen Fälle, wie z.B. das Senden einer Mail an eine andere Person im Internet, werden als relaying bezeichnet und sind aus Sicherheitsgründen beschränkt. Wenn Sie jede Mail weiterleiten würden, könnten Spammer Ihren Mailserver missbrauchen um Mails in Ihrem eigenen Interesse zu versenden. Sie würden als offenes Relay gelistet werden und wahrscheinlich in kürzester Zeit auf verschiedenen Sperrlisten (Blacklists) landen. Wenn dieser Fall erst einmal eintritt, wird es schwierig, jemals wieder Mails versenden zu können. Das setzen der Rechte smtpd_recipient_restrictions (wie unten beschrieben) ist deshalb sehr wichtig.
Generell können Sie die Netzwerke definieren, denen es erlaubt ist über Ihren Server weiterzuleiten, indem Sie die Einstellungen von mynetworks in der main.cf anpassen. Gewöhnlich setzt man es auf das eigene Netzwerk, damit lokale Benutzer sich nicht authentifizieren müssen:
$> postconf -e mynetworks=192.168.50.0/24
Ein Fall von Relaying von außerhalb Ihres lokalen Netzes ist aber tatsächlich wichtig. Stellen Sie sich vor Sie haben einen Benutzer der nicht mit dem lokalen Netzwerk verbunden ist, aber Emails über Ihren Server ins Internet senden will. Durch die obigen Regeln könnte der Benutzer keine EMails senden, da diese weder über Ihr Netzwerk versendet noch an eine Domäne von Ihnen adressiert sind. Sie müssen also einen Weg suchen, der es Benutzern im Internet ermöglicht, von Ihrem Mailserver als vertrauenswürdig eingestuft zu werden. Die Benutzer müssen sich mit Benutzernamen und Passwrot anmelden, damit der Server das Relaying erlaubt. Dies nennt man authentifiziertes SMTP. Die meisten E-Mail Clients unterstützen diese Funktion standardmäßig.
Authentifiziertes SMTP mit Postfix stellte immer ein Problem dar. Es wurde durch die Bibliothek SASL (Simple Authentificatin and Security Layer) erledigt, welche ein Teil des Cyrus Mail Servers war. Es war beinahe unmöglich, Fehler in der Konfiguration zu finden, da die Fehlermeldungen nicht besonders aussagekräftig waren. Ab Postfix 2.3 können wir Postfix dazu bringen den Dovecot Server zu benutzen, um den Benutzernamen und das Passwort zu verifizieren. Da Sie Dovecot bereits konfiguriert haben, sind die weiteren Schritte wirklich einfach. Postfix benötigt nur einige zustätzliche Konfigurationseinträge:
$> postconf -e smtpd_sasl_type=dovecot $> postconf -e smtpd_sasl_path=private/auth $> postconf -e smtpd_sasl_auth_enable=yes $> postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_auth_enable aktiviert die SMTP-Authentifizierung. smtpd_recipient_restrictions definiert Regeln, die überprüft werden sobald der Sender das RCPT TO: Kommando im SMTP Dialog sendet. In diesem Fall ist Relaying erlaubt, wenn:
Es gibt zustätzliche Beschränkungen (smtpd_client_restrictions, smtpd_helo_restrictions, smtpd_sender_restrictions). Solange Sie diese nicht einrichten wollen ist es ausreichend, sich auf smtpd_recipient_restrictions zu beschränken.
Versuchen Sie, sich während einer SMTP Sitzung zu authentifizieren:
$> telnet localhost smtp
Der Server wird Sie hereinlassen:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailtest ESMTP Postfix (Debian/GNU)
Sagen Sie Hallo:
helo example.com
Postfix wird Ihnen eine Liste der verfügbaren Funktionen auflisten:
250-mailtest 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
Senden Sie die Base64-verschlüsselte Zeichenkette des Passworts:
auth plain am9obkBleGFtcGxlLmNvbQBqb2huQGV4YW1wbGUuY29tAHN1bW1lcnN1bg==
Der Server sollte die Authentifizierung akzeptieren:
235 2.0.0 Authentication successful
Trennen Sie die Verbindung zu Postfix:
quit
Auf Wiedersehen:
221 2.0.0 Bye
Die Authentifizierung funktioniert. Prima.
Bemerkung
Wenn Sie Johns Passwort von 'summersun' auf ein anderes geändert haben, müssen Sie dies selbst mit Base64 verschlüsseln. Benutzen Sie:
perl -MMIME::Base64 -e \
'print encode_base64("john\@example.com\0john\@example.com\0password")';
Jetzt können Sie versuchen, die erste Mail mit Authentifizierung zu versenden. Damit auch Ihr lokales Netzwerk temporär als nicht vertrauenswürdig eingestuft wird, können Sie folgende Einstellungen vornehmen:
$> postconf -e mynetworks=
Starten Sie Ihr Mail-Programm und beobachten Sie Ihre mail.log während Sie eine E-Mail an eine Domäne im Internet schicken. Ich schlage vor Sie schicken an devnull@workaround.org, die Ihre Mails einfach verwirft. Wenn alles klappt, sollte Ihre Logdatei ähnliches zeigen:
postfix/smtpd[4032]: 1234567890: client=..., sasl_method=PLAIN, sasl_username=john@example.com
postfix/cleanup[4040]: 2EAE8379CB: message-id=<...>
postfix/qmgr[3963]: 1234567890: from=<john@example.com>, size=830, nrcpt=1 (queue active)
postfix/smtpd[4032]: disconnect from ...
postfix/smtp[4041]: 1234567890: to=<devnull@workaround.org>,
relay=torf.workaround.org[212.12.58.129]:25, delay=6,
delays=0.09/0.08/5.6/0.23, dsn=2.0.0, status=sent
(250 OK id=1HsPC3-0008UJ-O5)
postfix/qmgr[3963]: 2EAE8379CB: removed
Falls es Probleme gibt, würde es so aussehen:
postfix/smtpd[4032]: connect from ...[10.20.30.40] postfix/smtpd[4032]: warning: ...[10.20.30.40]: SASL PLAIN authentication failed: postfix/smtpd[4032]: lost connection after AUTH from ...[10.20.30.40] postfix/smtpd[4032]: disconnect from ...[10.20.30.40]
Ihr Mail-Programm hat Sie vielleicht bereits auf das nicht-vertrauenswürdige SSL-Zertifikat hingewiesen. Das Standardzertifikat, dass mit Postfix kommt wurde von der nicht existierenden "Office for Complication of Otherwise Simple Affairs" erstellt. Dies ist egal für die Tests, jedoch wird wie bereits bei Dovecot empfohlen, dass Sie ein korrektes SSL Zertifikat erstellen, welches zumindest den richtigen Hostnamen beinhaltet. Das Standardzertifikat ist unter /etc/ssl/certs/ssl-cert-snakeoil.pem und der Standardschlüssel unter /etc/ssl/private/ssl-cert-snakeoil.key gespeichert. Erstellen Sie ein neues Zertifikat/Schlüssel und speichern Sie es als postfix.pem:
$> openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem \
-keyout /etc/ssl/private/postfix.pem
Die gleiche Vorgehensweise wie die, der Erstellung des Zertifikates für Dovecot oben. Denken Sie nur daran den "Common Name" auf den voll-qualifizierten Hostnamen zu setzen. Natürlich können Sie auch das gleiche Zertifikat verwenden, das Sie für Dovecot erstellt haben, solange der Servername gleichbleibt. In diesem Fall benutzen Sie diee Dateien /etc/ssl/certs/dovecot.pem und /etc/ssl/private/dovecot.pem in Verbindung mit dem Postconf Kommando weiter unten.
Vergessen Sie nicht die Rechte des privaten Schlüssels zu ändern, damit diesen niemand unautorisiert lesen kann:
$> chmod o= /etc/ssl/private/postfix.pem
Nun müssen wir Postfix mitteilen wo es Ihre Zertifikat und den privaten Schlüssel finden kann:
$> postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem $> postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
Sie sollten jetzt in Ihrem Mail-Programm keine weiteren Warnungen über das Zertifikat erhalten.
Standardgemäß erlaubt Postfix, dass Anmeldungen am SMTP Dienst als Klartext gesendet werden dürfen. Sie sollten das besser ändern und nur verschlüsselte Übertragungen erlauben:
$> postconf -e smtpd_use_tls=yes $> postconf -e smtpd_tls_auth_only=yes
Die Parameter fordern eine Verschlüsselung für die SASL Authentifizierung von den Benutzer an, damit Passwörter im Format PLAIN oder LOGIN nicht im Klartext übertragen werden. Wenn sich der Client anfangs mit dem Server verbindet, wird das AUTH-Kommando vom Server nicht angeboten. Wenn der Client das STARTTLS Kommanto sendet und die TLS Verbindung erfolgreich abschließt, sendet der Client das HELO-Kommando ein zweites mal. Nun bietet der Server das AUTH-Kommando an.
Dies erfordert keine Verschlüsselung von anderen Systemen, die sich nicht anmelden müssen (z.B. andere Mail-Server die Emails an Ihre Domains senden möchten - im Gegensatz zu Anwendern, die über Ihren Email-Server relayen möchten).
Wenn sie unverschlüsselte STMP-Verbindungen wirklich verbieten wollen, (ich tue dies auf Port 587 und 465), können Sie entweder "smtpd_tls_security_level = encrypt" (für STARTTLS, auf Port 587) oder "smtpd_tls_wrappermode = yes" (für SSL Verschlüsselung der eigentlichen Verbindung, auf port 465).
Zwei lästige Punkte gibt es bei der Benutzung von E-Mails: Spam und Viren. Glücklicherweise können Sie beide durch Benutzung von AMaViS (A Mail Virus Scanner) erschlagen. AMaViS ist eine Schnittstelle zwischen Postfix, Spamassassin (bekannt für sein Bayes-basierte Spamerkennung) und einem optionalen Virenscanner. AMaViS regelt das Filtern von Spam, hat jedoch keinen eingebauten Virenscanner. Für diesem Zweck sollten Sie ClamAV installieren. Dies ist ein kostenloser Virenscanner der häufig aktualisiert wird.
In Debian Etch hat sich die Konfiguration von AMaviS von der Datei /etc/amavis/amavisd.conf auf verschiedene Dateien im Order /etc/amavis/conf.d geändert. Glücklicherweise ist der Virenscanner "ClamAV" standardmäßig richtig konfiguriert. Somit müssen Sie das nicht erledigen. Wie auch immer: Ich empfehle Ihnen sich die Datei /etc/amavis/conf.d/20-debian_defaults näher anzusehen:
In der Datei /etc/amavis/conf.d/15-content_filter_mode sollten Sie die '#' von den Zeilen @bypass_... entfernen, damit das Filtern von Spam und Viren aktiviert wird.
In der Datei /etc/spamassassin/local.cf sollten Sie eine weitere Zeile hinzufügen, damit gelernter Spam nie abläuft. Dieses Feature würde sonst zu Konflikten mit AMaViS führen:
bayes_auto_expire 0
Wenn Sie die Konfigurationsdateien verändert haben, müssen Sie AMaViS neu starten:
$> /etc/init.d/amavis restart
Stellen Sie sicher, dass AMaViS am TCP-Port 10024 auf eingehende Verbindungen wartet:
$> netstat -nap | grep 10024
Sie sollten dieses Ergebnis erhalten:
tcp 0 0 127.0.0.1:10024 0.0.0.0:* LISTEN 12345/amavisd
Wenn Sie diese Ausgabe erhalten, läuft AMaViS und wartet auf eingehende SMTP-Sitzungen. Andernfalls überprüfen Sie Ihre /var/log/mail.log - vielleicht haben Sie ja einen Fehler in der Konfigurationsdatei gemacht.
Ein paar Worte dazu, wie AMaViS in Postfix integriert wird. Wenn Ihnen jemand über das Internet eine E-Mail schickt, wird diese über Postfix (dem smtpd-Dämon) zunächst auf TCP-Port 25 (SMTP) emfpangen. Wenn Postfix die E-Mail akzeptiert, wird diese zu AMaViS auf Port 10024 (SMTP) weitergeleitet. Wenn AMaViS ebenfalls mit der Mail und deren Inhalt einverstanden ist, wird diese wieder an Postifx auf den TCP Port 10025 (SMTP) weitergeleitet. Postfix liefert die Mail letztendlich an den entsprechenden Empfänger aus.
Damit postfix die Mail an AMaViS weiterleitet, müssen Sie die content_filter Einstellungen verändern:
$> postconf -e content_filter=smtp-amavis:[127.0.0.1]:10024 $> postconf -e receive_override_options=no_address_mappings
Zuerst müssen wir jedoch den smtp-amavis Dienst in der /etc/postfix/master.cf definieren. Außerdem müssen Sie Postfix beibringen auf TCP-Port 10025 von AMaViS zurückgeschickte Mails zu warten:
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
-o local_header_rewrite_clients=
Starten Sie postfix neu:
$> postfix reload
Zwei Einstellungen bedürfen näherer Erklärung. Zuerst werden die receive_override_options auf no_address_mappings gesetzt. Dies deaktiviert alle Weiterleitungen. Ihre virtuellen Aliase z.B. werden zuerst nicht beachtet. Die Mail wird dann zu smtp-amavis und letztendlich an den Dienst 127.0.0.1:10025 gesendet, der jede Menge Optionen setzt. Eine dieser Optionen ist die receive_override_options. Diese Mail wird jedoch die Einstellung no_address_mappings ausgelassen. Hier überprüft Postfix nun Ihre virtuellen Aliase. Klingt kompliziert? Es muss jedoch so gemacht werden, da Ihre Aliase ansonsten zweimal ausgewertet werden würden, was zu doppelten Mails führen würde. Die anderen Optionen sind dazu da, Überprüfungen die Postfix bereits beim ersten Mal gemacht hat, abzuschalten.
Bemerkung
Das Setzen von receive_override_options=no_address_mappings bewirkt, dass Postfix die Aliase nicht mehr beachtet. Wenn Sie also den Content-Filter AMaViS deaktivieren wollen, darf diese Einstellung nicht gesetzt sein.
Ein weiterer Knackpunkt: Der Benutzer "clamav" muss ein Mitglied der System-Gruppe "amavis" sein, damit die beiden Dienste untereinander kommunizieren können:
$> adduser clamav amavis $> /etc/init.d/clamav-daemon restart
Und noch etwas: AMaViS verucht herauszufinden, ob eine Email eingehend (vom Internet an Ihre Domäne gesendet) oder ausgehend (von Ihrem System ins Internet gesendet) ist, indem es die Einstellungen @acl_local_domains überprüft. Sie müssen AMaViS mitteilen ob eine bestimmte Domäne einer Ihrer Zieldomänen ist. Editieren Sie die Datei /etc/amavis/conf.d/50-user und fügen Sie folgende Zeilen vor "1;" ein:
@lookup_sql_dsn = (
['DBI:mysql:database=mailserver;host=127.0.0.1;port=3306',
'mailuser',
'mailuser2007']);
$sql_select_policy = 'SELECT name FROM virtual_domains WHERE CONCAT("@",name) IN (%k)';
Der @lookup_sql_dsn-Eintrag definiert, wie AMaViS Ihre Datenbank abrufen soll. Der Eintrag $sql_select_policy definiert den SQL Query der ausgeführt wird, wenn AMaViS überprüft ob die überprüfte Mail an eine Ihre virtuellen Domänen adressiert ist. Die Variable %k stellt eine Liste von Zeichen dar, die AMaViS erwartet zu finden. Die Abfrage würde also so aussehen:
SELECT name
FROM virtual_domains
WHERE CONCAT("@",name)
IN (
'john@example.com',
'john',
'@example.com',
'@.example.com',
'@.com',
'@.')
Dies sieht etwas verwirrend aus, aber letztendlich wird nach der Zeichenkette '@example.com' gesucht. Starten Sie AMaViS neu:
$> /etc/init.d/amavis restart
Versuchen Sie nun, eine E-Mail an john@example.com zu senden. Wenn Sie sich die Header der Mail ansehen, sollten Sie folgende Zeilen finden, die durch AMaViS hinzugefügt wurden:
X-Virus-Scanned: Debian amavisd-new at mymailserver X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-9999 required=6.31 tests=[none]
Aufgrund dieser Informationen können Ihre Benutzer Spam filtern. Die Zeile X-Spam-Status wird auf "Yes" gesetzt, sobald die Spampunkte die festgelegten Spampunkte ($sa_tag2_level_deflt) überschreiten. Die Zeile X-Spam-Level enthält einige "*", welche die Spampunkte mitteilen. Wenn Ihr E-Mail Programm auf X-Spam-Level: ***** Header überprüft, nimmt es Spam mit mindestens 5 Punkten an.
Ein Beispiel von empfangenen Spam:
X-Spam-Status: Yes, hits=16.0 tagged_above=-9999.0 required=6.31
tests=BAYES_99, FORGED_MUA_OUTLOOK, MSGID_FROM_MTA_ID,
RCVD_IN_BL_SPAMCOP_NET, UNDISC_RECIPS, URIBL_OB_SURBL, WORK_AT_HOME
X-Spam-Level: ***************
X-Spam-Flag: YES
Nun sollten alle eingehenden E-Mails auf Spam und Viren überprüft werden. Überprüfen Sie dies. Spamassassin hat eine Beispieldatei mit Beispiel-Spam. Diese Datei beinhaltet GTUBE (Generic Test for Unsolicited Bulk Email), eine Signatur die dafür vorgesehen ist Spamfilter zu testen. Dies ist vergleichbar mit dem EICAR.COM-Testvirus, der zum Testen von Virenscannern benutzt wird. Senden Sie nun John eine Spammail:
$> sendmail john@example.com < /usr/share/doc/spamassassin/examples/sample-spam.txt
Ihre /var/log/mail.log enthält nun unter anderem eine von AMaViS geschrieben Zeile:
amavis[13001]: (13001-02) Passed SPAM, <...> -> <john@example.com>, ...
Die E-Mail wurde also als Spam erkannt und an John weitergeleitet. Sehr schön. Passen Sie nun die Rechte der AMaViS Konfigurationsdateien an, damit niemand unautorisiert Ihr Datenbank-Passwort auslesen kann:
$> chmod o= /etc/amavis/conf.d/50-user
Die Software SpamAssassin unterscheidet Spam-Mails von Nicht-Spam-Mails (Ham). Sie beinhaltet eine Vielzahl von Test, denen Mails unterzogen werden. SpamAssassin fragt sogar Echtzeit-Sperrlisten (real-time blacklists / RBL) im Internet ab. Zusätzlich zu den statischen Tests gibt es den sogenannten Bayesian Filter. Dieser benutzt bedingte Wahrscheinlichkeiten um die Wörter der Mail mathematisch zu analysieren. So kann sich der Filter ableiten ob die Mail Spam ist oder nicht. Je mehr Spam und Ham E-Mails Sie dem Filter zeigen, desto besser wird dessen Erkennung. Sie müssen mindestens 200 Spam- und und 200 Nicht-Spam-Mails für das Training benutzen, damit der Bayes Filter aktiv wird. Die hier beschriebene Konfiguration wird nicht die Spam-Mails pro Benutzer lernen, aber eine globale Bayes-Datenbank erstellen.
Da der Benutzer 'amavis' der Eigentümer der Datei /var/lib/amavis/.spamassassin (zuständig für das Speichern der Bayes Datenbank) ist, jedoch der Benutzer 'vmail' benutzt wird um die Postfächer der Benutzer zu verwalten, haben wir hier ein kleines Problem mit den Dateirechten. Leider können wir diess Problem nicht lösen indem wir den Benutzer 'amavis' zu der Gruppe 'vmail' hinzufügen. Die Rechte von /home/vmail erlauben es nicht einer Gruppe Schreibzugriff zu erteilen. Aus diesem Grund muss das erlernen von Spam und Ham durch den Benutzer 'root' erfolgen, was ein potentielles Sicherheitsrisiko darstellt.
Ein Skript, dass SpamAssassin Ham und Spam beibringt, kann einmal am Tag vom Benutzer 'root' ausgeführt werden. Ein Beispiel des Scriptes (welches Sie z.B. über einen Cronjob laufen lassen können):
#!/bin/bash -e
SADIR=/var/lib/amavis/.spamassassin
DBPATH=/var/lib/amavis/.spamassassin/bayes
SPAMFOLDERS="\
/home/vmail/well-known-customer.com/fred/.spam/cur \
/home/vmail/spamtrap.org/jeanne/.spam/cur \
"
HAMFOLDERS="\
/home/vmail/spamtrap.org/jeanne/.trash/cur \
"
for spamfolder in $SPAMFOLDERS ; do \
echo Learning spam from $spamfolder ; \
nice sa-learn --spam --showdots --dbpath $DBPATH $spamfolder
done
for hamfolder in $HAMFOLDERS ; do \
echo Learning ham from $hamfolder ; \
nice sa-learn --ham --showdots --dbpath $DBPATH $hamfolder
done
chown -R amavis:amavis $SADIR
Sie können nachsehen, was AMaViS als Ham und Spam gelernt hat:
$> sa-learn --dbpath /var/lib/amavis/.spamassassin/bayes --dump magic 0.000 0 977 0 non-token data: nspam 0.000 0 27866 0 non-token data: nham [...]
Der Wert nspam ist die Anzal der Spam-Emails, die SpamAssassin bereits gesehen hat. nham ist die Anzahl der Ham-Mails die bereits gelernt wurden.
Hinweis: Sie trainieren hiermit die globale Bayesian-Datenbank. Dies betrifft alle E-Mails die auf Ihr System treffen. Stellen Sie sicher, dass Sie keine Spam-Mails von unzuverlässigen Benutzern trainieren. Dies kann Ihre Spamerkennungsrate drastisch verschlechtern, wenn die Benutzer Nachrichten in Ihren 'Spam' Ordner verschieben, die keine wirklichen Spam-Mails sind. Nur weil ein Benutzer keine E-Mails seiner Ex-Freundin erhalten will, sollte er diese nicht als Spam für alle markieren. Seien Sie also vorsichtig, welche Mails Sie für das Training der globalen Bayes Datenbank verwenden. SpamAssassin sollte auch nicht aus Mails lernen, die Ihnen Benutzer weitergeleitet haben. Die Header Informationen würden dadurch verloren gehen. Diese enthalten jedoch viele Informationen, die es SpamAssassin ermöglichen Spam zu erkennen. Stellen Sie sicher, dass die Benutzer die 'bounce'-Funktion des Email-Programms verwenden, oder die Mail als Anhang senden. Die beste Wahl ist, die Mails direkt aus den Postfächern der Benutzer zu holen.
Nun da Ihr Server mit den Testeinträgen funktioniert, ist es an der Zeit, die Datenbank mit richtigen Daten zu füllen.
Wenn Sie einer früheren Anleitung für Sarge gefolgt sind, können Sie einfach das Konvertierungsscript verwenden:
$> wget http://workaround.org/articles/ispmail-etch/dbconvert.py $> chmod +x dbconvert.py ... Editieren Sie die db_sarge- und db_etch-Variablen im Skript ... $> ./dbconvert.py
Dieses Skript sollte die Struktur Ihrer Daten der Sarge-basierten Datenbank in das Format der Etch-Datenbank konvertieren.
Natürlich brauchen Sie eine geeignete Schnittstelle um die Daten in der Datenbank zu verwalten. Viele Leser haben bereits angeboten ein Webinterace zu schreiben um die Verwaltung von Domänen, Konten und Aliase zu vereinfachen. Robert Klikics hat dazu ein PHP Script veröffentlicht, das von seinem Auszubildenden Ronny Tiebel programmiert wurde.
Ein weiteres PHP-basiertes Web-Frontend zum Administrieren von Benutzerkonten wurde von Peter Gutwein erstellt und kann unter http://www.grs-service.ch/pub/grs_mminstallation.html heruntergeladen werden.
Die Installation hier ist optional, jedoch bieten die meisten E-Mail-Provider einen Weg an, die Mails im Browser zu lesen. Glücklicherweise ist dies recht einfach umzusetzen. Das benötigte Paket nennt sich "squirrelmail" - ein webbasiertes Email-System, das IMAP-Server (wie den Dovecot IMAP Server, den wir hier benutzen) abfragen kann. Um das Programm lauffähig zu machen, müssen Sie zuerst die Konfiguration von Squirrelmail in der Apache Konfiguration bekannt machen:
$> ln -s /etc/squirrelmail/apache.conf /etc/apache2/conf.d/squirrelmail.conf $> apache2ctl restart
Sie müssen noch mindestens einen Parameter in der Konfiguration ändern. Führen Sie dazu das Konfigurationsprogramm aus:
$> squirrelmail-configure
Wählen Sie Option 3 (Folder Defaults) und setzen Sie Option 3 (Default Folder Prefix) auf 'none'. Sie können auch die anderen Menüs durchgehen und die Parameter nach Ihren Wünschen anpassen (z.B. Firmenname, etc.)
Rufen Sie mit Ihrem Browser folgenden Link auf um das Webinterface zu benutzen: http://localhost/squirrelmail (localhost ist die IP Adresse des Servers). Loggen Sie sich nun als 'john@example.com' mit dem Passwort 'summersun' ein und schon sollten Sie in der Lage sein John's E-Mails zu lesen. Einfacher könnte es wirklich nicht sein.
Wenn Sie mit der Adresse http://mein.server/squirrelmail nicht glücklich sind und lieber eine Adresse wie http://my.server haben würden, lesen Sie bitte den Abschnitt users will prefer a simple URL (Benutzer bevorzugen eine einfache URL) in der Datei /etc/squirrelmail/apache.conf.
Sie haben jetzt bereits einen voll funktionsfähigen Email-Server, der sogar Spam markiert. Jedoch haben wir die Arbeit, Spam-Mails auszusortieren, unseren Benutzern überlassen. Das können wir schöner lösen, indem wir serverseitige Filter anlegen. Das Ziel ist, den Spam jedes Benutzers in seinen entsprechenden Spamordner zu verschieben. Wir benutzen dazu die Möglichkeiten des Sieve_-Plugins, das ein Mail-Filter wie procmail ist (bis darauf, dass Procmail in Verbindung mit virtuellen Postfächern leider nutzlos ist). Sieve benutzt eine einfache Skriptsprache, die es erlaubt, alle E-Mails die von Spamassassin markiert wurden, automatisch in einen Spamordner weiterzuleiten. Weiter oben haben wir protocol lda definiert und dort folgende Variable gesetzt: global_script_path = /home/vmail/globalsieverc. Jedesmal wenn eine E-Mail an einen virtuellen Benutzer ausgeliefert wird, wird diese Datei als Filter ausgeführt. Erstellen Sie eine Datei /home/vmail/globalsieverc mit folgendem Inhalt:
require ["fileinto"];
# Move spam to spam folder
if header :contains "X-Spam-Flag" ["YES"] {
fileinto "spam";
stop;
}
Schicken Sie John erneut eine Spam E-Mail:
$> sendmail john@example.com < /usr/share/doc/spamassassin/examples/sample-spam.txt
Schauen Sie sich die Datei /home/vmail/dovecot-deliver.log an. Die letzte Zeile sollte in etwa so aussehen:
deliver(john@example.com): "2007-06-18 22:17:46 "Info: msgid=<GTUBE1.1010101@example.net>: saved mail to spam
Der Eintrag zeigt uns, dass die E-Mail im Spamordner gespeichert wurde. Wenn Sie nun die Mails abrufen, sollten Sie die Mail in dem Ordner finden.
Eine häufig gestellte Frage ist, wie man Mailing-Listen mit der berühmten Software 'mailman' betreiben kann, wenn man virtuelle Domänen benutzt. Das ist nicht wirklich schwer und es gibt verschiedene Wege dies zu erreichen. Der einfachste und flexibelste Weg ist lokale Aliase zu benutzen:
Der erste Ansatz benutzt die Aliase, die Sie normalerweise unter /etc/aliases eintragen. Sie müssen lediglich verstehen, dass virtuelle Benutzer keine Aliase haben können, die an externe Programme weiterleiten. Sobald Sie eine neue Mailing-Liste mit dem newlist-Befehl angelegt haben, müssen Sie bestimmte Aliase in Ihre /etc/aliases-Datei hinzufügen wie chitchat-admin, chitchat-bounces, chitchat-join u.s.w., die auf das Mailman weiterleiten wie z.B. "|/var/lib/mailman/mail/mailman post powerdns-debian". Die Email wird also an dieses Programm übergeben und Mailman erhält diese Email als Eingabe zur Weiterverarbeitung.
Das funktioniert gut für lokale Domänen aber klappt leider nicht bei virtuelen Aliasen. Das liegt daran, dass es keinen System-Benutzer gibt, unter dessen Benutzerrechten dieses Skript ablaufen könnte. Die Lösung ist hier eine Weiterleitung von der virtuellen Email-Adresse an eine lokale Email-Adresse.
Ich schlage vor, dass Sie 'localhost' als lokale Domäne definieren (mydestination = localhost) und jeden der Mailman-Aliases an das @localhost-Äquivalent weiterleiten. Falls Sie also eine Adresse chitchat-subscribe@virtual.domain haben, muss sie an die Adresse chitchat-subscribe@localhost und dann unter Verwendung der /etc/aliases an das "mailman"-Programm weitergeleitet werden.
vielleicht findet jemand eine elegante Lösung, die /etc/aliases auch noch in die MySQL-Datenbank zu integrieren. :)
Wenn Sie Ihren Kunden/Nutzern erlauben wollen, eigene Mailing-Listen zu erstellen, ist die oben genannte Lösung nicht flexibel genug. Postfix's mächtige Transport-Maps erlauben es Ihnen, Postfix mitzuteilen, welche Wege (Dienste) für bestimmte E-Mail Adressen oder ganze Domänen benutzt werden sollen.
Benutzen Sie reguläre Ausdrücke, um Emails weiterzuleiten, in denen die Empfänger-Adresse mit einem bestimmten Muster übereinstimmt. Das folgende Beispiel von Transport-Maps zeigt eine Weiterleitung an den Mailman-Dienst von E-Mails mit dem Emfpänger mylist@example.com und jeder anderen Empfängeradresse die ähnlich aussieht wie mylist-*@example.com:
/^(mylist|mylist-.*)@example\.com$/ mailman:
Wenn Sie die Adressen Ihrer Mailing-Liste mit einer MySQL-Tabelle verwalten wollen, benutzen Sie folgende Konfigurationsdatei mit dem Namen /etc/postfix/mysql-transport-mailman.cf:
user = mailuser password = mailuser2007 hosts = 127.0.0.1 dbname = mailserver query = SELECT 'mailman:' FROM transports WHERE email LIKE '%s'
Die Tabelle transport besteht aus mindestens einer Spalte email die die Adressen der Mailining-Liste beinhaltet. Benutzen Sie als Platzhalter '%' in der Datenbank.
Machen Sie Postfix mit der Konfigurationsdatei vertraut:
$> postconf -e transport_maps=mysql:/etc/postfix/mysql-transport-mailman.cf
Viele Administratoren schwärmen von der Methode genannt greylisting. Wie funktioniert das? Normalerweise besitzen MTAs einen Puffer, der die Mails zwischenspeichert wenn es temporäre Auslieferungsprobleme seitens des Empfängers gibt. SMTP behandelt temporäre Fehler beginnend mit "4" und dauerhafte Fehler beginnend mit der Nummer "5". Wenn ein 5er-Fehler auftritt, wird der Empfänger über die fehlgeschlagene Zustellung informiert. Wenn ein 4er-Fehler auftritt, wird einige Tage lang wiederholt versucht, die Mail zuzustellen. Viele Versender von Spam benutzen keine MTAs mit einem Zwischenspeicher (queue), da sie einfach mehrere tausende Anhnungslose mit Spam überhäufen wollen und sich keine Gedanken um die Fehlerbehandlung nicht zugestellter Emails machen. Wenn ihr System also den ersten Zustellversuch temporär ablehnt, kann es sein dass die Spammer es nicht weiter versuchen. Diesen Vorgang nennt man Greylisting. Postfix lehnt den ersten Zustellungsversuch eines unbekannten Systems mit einem Fehler 4 ab. Nach fünf Minuten akzeptiert Postfix aber den nächsten Zustellungsversuch.
Greylisting hat Vor- und Nachteile. Sie blocken Spammer, die keine Queues verwenden. Aber Sie werden auch normale Mails um mindestens 5 Minuten verzögern, was einige Ihrer Benutzer stören wird, wenn diese dringend auf eine w