E-Mail-Server · 20 min read · Sep 25, 2025

Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Ubuntu 13.10)

Dieses Tutorial ist Copyright (c) 2014 von Falko Timme & Srijan Kishore. Es basiert auf einem Tutorial von Christoph Haas, das Sie unter http://workaround.org finden können. Sie dürfen dieses Tutorial unter der Creative Commons Lizenz 2.5 oder einer späteren Version verwenden.

Dieses Dokument beschreibt, wie man einen Postfix-Mailserver installiert, der auf virtuellen Benutzern und Domains basiert, d.h. Benutzern und Domains, die sich in einer MySQL-Datenbank befinden. Ich werde auch die Installation und Konfiguration von Courier (Courier-POP3, Courier-IMAP) demonstrieren, damit Courier gegen die gleiche MySQL-Datenbank authentifizieren kann, die Postfix verwendet.

Der resultierende Postfix-Server ist in der Lage, SMTP-AUTH und TLS und Quota zu unterstützen (Quota ist standardmäßig nicht in Postfix integriert, ich werde zeigen, wie man Postfix entsprechend patcht). Passwörter werden in verschlüsselter Form in der Datenbank gespeichert (die meisten Dokumente, die ich gefunden habe, behandelten Klartextpasswörter, was ein Sicherheitsrisiko darstellt). Zusätzlich behandelt dieses Tutorial die Installation von Amavisd, SpamAssassin und ClamAV, damit E-Mails auf Spam und Viren gescannt werden. Ich werde auch zeigen, wie man SquirrelMail als Webmail-Oberfläche installiert, damit Benutzer E-Mails lesen und senden sowie ihre Passwörter ändern können.

Der Vorteil einer solchen “virtuellen” Einrichtung (virtuelle Benutzer und Domains in einer MySQL-Datenbank) ist, dass sie viel leistungsfähiger ist als eine Einrichtung, die auf “realen” Systembenutzern basiert. Mit dieser virtuellen Einrichtung kann Ihr Mailserver Tausende von Domains und Benutzern verwalten. Außerdem ist es einfacher zu verwalten, da Sie nur mit der MySQL-Datenbank umgehen müssen, wenn Sie neue Benutzer/Domains hinzufügen oder bestehende bearbeiten. Keine weiteren postmap-Befehle zum Erstellen von DB-Dateien, kein erneutes Laden von Postfix usw. Für die Verwaltung der MySQL-Datenbank können Sie webbasierte Tools wie phpMyAdmin verwenden, die ebenfalls in diesem Howto installiert werden. Der dritte Vorteil ist, dass Benutzer eine E-Mail-Adresse als Benutzernamen haben (anstatt eines Benutzernamens + einer E-Mail-Adresse), was einfacher zu verstehen und sich zu merken ist.

Dieses Howto ist als praktische Anleitung gedacht; es behandelt nicht die theoretischen Hintergründe. Diese werden in vielen anderen Dokumenten im Web behandelt.

Dieses Dokument kommt ohne Gewährleistung jeglicher Art! Ich möchte sagen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten, dieses Ziel zu erreichen, aber dies ist der Weg, den ich gehe. Ich gebe keine Garantie, dass dies für Sie funktioniert!

1 Vorbemerkung

Dieses Tutorial basiert auf Ubuntu 13.10 Server (Saucy Salamander), daher sollten Sie eine grundlegende Ubuntu 13.10-Serverinstallation einrichten, bevor Sie mit diesem Tutorial fortfahren. Das System sollte eine statische IP-Adresse haben. Ich verwende 192.168.0.100 als meine IP-Adresse in diesem Tutorial und server1.example.com als den Hostnamen.

Stellen Sie sicher, dass Sie als root angemeldet sind (geben Sie ein

sudo su

um root zu werden), da wir alle Schritte aus diesem Tutorial als Root-Benutzer ausführen müssen.

Es ist sehr wichtig, dass Sie /bin/sh zu einem Symlink auf /bin/bash machen…

dpkg-reconfigure dash

Verwenden Sie dash als Standard-System-Shell (/bin/sh)? <– Nein

… und dass Sie AppArmor deaktivieren:

/etc/init.d/apparmor stop   
update-rc.d -f apparmor remove   
apt-get remove apparmor apparmor-utils

2 Installieren Sie Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Um Postfix, Courier, Saslauthd, MySQL und phpMyAdmin zu installieren, führen wir einfach aus

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

Sie werden ein paar Fragen gestellt:

Neues Passwort für den MySQL “root”-Benutzer: <– yourrootsqlpassword
Wiederholen Sie das Passwort für den MySQL “root”-Benutzer: <– yourrootsqlpassword
Verzeichnisse für die webbasierte Verwaltung erstellen? <– Nein
Allgemeiner Typ der Mailkonfiguration: <– Internet Site
System-Mailname: <– server1.example.com
SSL-Zertifikat erforderlich <– Ok
Webserver automatisch neu konfigurieren: <– apache2
Datenbank für phpmyadmin mit dbconfig-common konfigurieren? <– Nein

3 Wenden Sie den Quota-Patch auf Postfix an

Wir müssen die Postfix-Quellen abrufen, sie mit dem Quota-Patch patchen, neue Postfix.deb-Pakete erstellen und diese .deb-Pakete installieren:

apt-get build-dep postfix
cd /usr/src  
apt-get source postfix

(Stellen Sie sicher, dass Sie die richtige Postfix-Version in den folgenden Befehlen verwenden. Ich habe Postfix 2.10.2 installiert. Sie können Ihre Postfix-Version herausfinden, indem Sie ausführen

postconf -d | grep mail_version

Die Ausgabe sollte so aussehen:

root@server1:/usr/src# postconf -d | grep mail_version  
mail_version = 2.10.2  
milter_macro_v = $mail_name $mail_version  
root@server1:/usr/src#
wget http://vda.sourceforge.net/VDA/postfix-vda-v13-2.10.0.patch  
cd postfix-2.10.2  
patch -p1 < ../postfix-vda-v13-2.10.0.patch

Öffnen Sie als Nächstes debian/rules und ändern Sie DEB_BUILD_HARDENING von 1 auf 0:

vi debian/rules

| [...] export DEB_BUILD_HARDENING=0 [...] |

Wenn Sie dies nicht tun, schlägt Ihr Build mit den folgenden Fehlermeldungen fehl:

maildir.c: In function âdeliver_maildirâ:  
maildir.c:974:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:977:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:983:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c:986:17: error: format not a string literal and no format arguments [-Werror=format-security]  
maildir.c: In function âsql2fileâ:  
maildir.c:404:25: warning: ignoring return value of âreadâ, declared with attribute warn_unused_result [-Wunused-result]  
maildir.c:417:26: warning: ignoring return value of âwriteâ, declared with attribute warn_unused_result [-Wunused-result]  
cc1: some warnings being treated as errors  
make: * [maildir.o] Error 1  
make: Leaving directory `/usr/src/postfix-2.10.2/src/virtual'  
make[1]: * [update] Error 1  
make[1]: Leaving directory `/usr/src/postfix-2.10.2'  
make: *** [build] Error 2  
dpkg-buildpackage: error: debian/rules build gave error exit status 2  
root@server1:/usr/src/postfix-2.10.2#

Jetzt können wir die neuen Postfix.deb-Pakete erstellen:

dpkg-buildpackage

Jetzt gehen wir ein Verzeichnis nach oben, dort wurden die neuen .deb-Pakete erstellt:

cd ..

Der Befehl

ls -l

zeigt Ihnen die verfügbaren Pakete:

root@server1:/usr/src# ls -l  
total 7124  
drwxr-xr-x 18 root root     4096 Apr 16 04:29 postfix-2.10.2  
-rw-r--r--  1 root root   48594 Apr 16 04:29 postfix-cdb_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root  161974 Apr 16 04:29 postfix-dev_2.10.2-1_all.deb  
-rw-r--r--  1 root root 1094344 Apr 16 04:29 postfix-doc_2.10.2-1_all.deb  
-rw-r--r--  1 root root   57342 Apr 16 04:29 postfix-ldap_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   50554 Apr 16 04:29 postfix-mysql_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   50804 Apr 16 04:29 postfix-pcre_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   50756 Apr 16 04:29 postfix-pgsql_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root   55701 Jun  7  2013 postfix-vda-v13-2.10.0.patch  
-rw-r--r--  1 root root  282175 Apr 16 04:28 postfix_2.10.2-1.diff.gz  
-rw-r--r--  1 root root    1522 Apr 16 04:28 postfix_2.10.2-1.dsc  
-rw-r--r--  1 root root    3899 Apr 16 04:29 postfix_2.10.2-1_amd64.changes  
-rw-r--r--  1 root root 1542368 Apr 16 04:29 postfix_2.10.2-1_amd64.deb  
-rw-r--r--  1 root root 3828326 Sep 12  2013 postfix_2.10.2.orig.tar.gz

Wählen Sie die Pakete postfix und postfix-mysql aus und installieren Sie sie wie folgt:

dpkg -i postfix_2.10.2-1_amd64.deb postfix-mysql_2.10.2-1_amd64.deb

4 Erstellen Sie die MySQL-Datenbank für Postfix/Courier

Jetzt erstellen wir eine Datenbank namens mail:

mysqladmin -u root -p create mail

Sie werden nach dieser Frage gefragt:

Passwort eingeben: <– yourrootsqlpassword

Als Nächstes gehen wir zur MySQL-Shell:

mysql -u root -p

In der MySQL-Shell erstellen wir den Benutzer mail_admin mit dem Passwort mail_admin_password (ersetzen Sie es durch Ihr eigenes Passwort), der SELECT, INSERT, UPDATE, DELETE-Berechtigungen auf der Mail-Datenbank hat. Dieser Benutzer wird von Postfix und Courier verwendet, um sich mit der Mail-Datenbank zu verbinden:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

Immer noch in der MySQL-Shell erstellen wir die Tabellen, die von Postfix und Courier benötigt werden:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
ENGINE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
ENGINE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) ENGINE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) ENGINE=MyISAM;
quit;

Wie Sie vielleicht bemerkt haben, speichert die domains-Tabelle jede virtuelle Domain, für die Postfix E-Mails empfangen soll (z.B. example.com).

domain
example.com

Die forwardings-Tabelle dient dazu, eine E-Mail-Adresse auf eine andere zuzuordnen, z.B. E-Mails für [email protected] an [email protected] weiterzuleiten.

sourcedestination
[email protected][email protected]

Die users-Tabelle speichert alle virtuellen Benutzer (d.h. E-Mail-Adressen, da die E-Mail-Adresse und der Benutzername identisch sind) und Passwörter (in verschlüsselter Form!) sowie einen Quota-Wert für jedes Postfach (in diesem Beispiel beträgt der Standardwert 10485760 Bytes, was 10 MB entspricht).

emailpasswordquota
[email protected]No9.E4skNvGa. (“secret” in verschlüsselter Form)10485760

Die transport-Tabelle ist optional, sie ist für fortgeschrittene Benutzer. Sie ermöglicht es, E-Mails für einzelne Benutzer, ganze Domains oder alle E-Mails an einen anderen Server weiterzuleiten. Zum Beispiel,

domaintransport
example.comsmtp:[1.2.3.4]

würde alle E-Mails für example.com über das SMTP-Protokoll an den Server mit der IP-Adresse 1.2.3.4 weiterleiten (die eckigen Klammern [] bedeuten “keine Suche nach dem MX-DNS-Eintrag durchführen” (was für IP-Adressen sinnvoll ist…). Wenn Sie stattdessen einen vollqualifizierten Domainnamen (FQDN) verwenden, würden Sie die eckigen Klammern nicht verwenden.).

Übrigens, (ich gehe davon aus, dass die IP-Adresse Ihres Mailserver-Systems 192.168.0.100 ist) können Sie phpMyAdmin über http://192.168.0.100/phpmyadmin/ in einem Browser aufrufen und sich als mail_admin anmelden. Dann können Sie sich die Datenbank ansehen. Später können Sie phpMyAdmin verwenden, um Ihren Mailserver zu verwalten.

5 Konfigurieren Sie Postfix

Jetzt müssen wir Postfix mitteilen, wo es alle Informationen in der Datenbank finden kann. Dazu müssen wir sechs Textdateien erstellen. Sie werden feststellen, dass ich Postfix anweise, sich über die IP-Adresse 127.0.0.1 an MySQL zu verbinden, anstatt localhost. Dies liegt daran, dass Postfix in einem Chroot-Jail läuft und keinen Zugriff auf den MySQL-Socket hat, auf den es zugreifen würde, wenn ich Postfix anweisen würde, localhost zu verwenden. Wenn ich 127.0.0.1 verwende, verwendet Postfix TCP-Netzwerkverbindungen, um sich mit MySQL zu verbinden, was auch in einem Chroot-Jail kein Problem darstellt (die Alternative wäre, den MySQL-Socket in das Chroot-Jail zu verschieben, was einige andere Probleme verursacht).

Bitte stellen Sie sicher, dass /etc/mysql/my.cnf die folgende Zeile enthält:

vi /etc/mysql/my.cnf

| [...] # Anstatt skip-networking ist die Standardeinstellung jetzt, nur auf # localhost zu hören, was kompatibler ist und nicht weniger sicher. bind-address = 127.0.0.1 [...] |

Wenn Sie /etc/mysql/my.cnf ändern mussten, starten Sie MySQL bitte jetzt neu:

/etc/init.d/mysql restart

Führen Sie aus

netstat -tap | grep mysql

um sicherzustellen, dass MySQL auf 127.0.0.1 (localhost.localdomain) hört:

root@server1:~# netstat -tap | grep mysql  
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      24970/mysqld      
root@server1:~#

Jetzt erstellen wir unsere sechs Textdateien.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

Ändern Sie dann die Berechtigungen und die Gruppe dieser Dateien:

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Jetzt erstellen wir einen Benutzer und eine Gruppe namens vmail mit dem Home-Verzeichnis /home/vmail. Hier werden alle Postfächer gespeichert.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Als Nächstes führen wir einige Postfix-Konfigurationen durch. Stellen Sie sicher, dass Sie server1.example.com durch einen gültigen FQDN ersetzen, andernfalls funktioniert Ihr Postfix möglicherweise nicht richtig!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_sasl_authenticated_header = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "Der Benutzer, den Sie zu erreichen versuchen, hat das Quota überschritten." '  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Anschließend erstellen wir das SSL-Zertifikat, das für TLS benötigt wird:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Landname (2-Buchstaben-Code) [AU]: <– Geben Sie Ihren Landnamen ein (z.B. “DE”).
Bundesland oder Provinzname (vollständiger Name) [Some-State]: <– Geben Sie den Namen Ihres Bundeslandes oder Ihrer Provinz ein.
Ortsname (z.B. Stadt) []: <– Geben Sie Ihre Stadt ein.
Name der Organisation (z.B. Firma) [Internet Widgits Pty Ltd]: <– Geben Sie den Namen Ihrer Organisation ein (z.B. den Namen Ihres Unternehmens).
Name der organisatorischen Einheit (z.B. Abteilung) []: <– Geben Sie den Namen Ihrer organisatorischen Einheit ein (z.B. “IT-Abteilung”).
Allgemeiner Name (z.B. IHR Name) []: <– Geben Sie den vollqualifizierten Domainnamen des Systems ein (z.B. “server1.example.com”).
E-Mail-Adresse []: <– Geben Sie Ihre E-Mail-Adresse ein.

Ändern Sie dann die Berechtigungen der smtpd.key:

chmod o= /etc/postfix/smtpd.key

6 Konfigurieren Sie Saslauthd

Zuerst führen Sie aus

mkdir -p /var/spool/postfix/var/run/saslauthd

Bearbeiten Sie dann /etc/default/saslauthd. Setzen Sie START auf yes und ändern Sie die Zeile OPTIONS=”-c -m /var/run/saslauthd” in OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”:

vi /etc/default/saslauthd

| # # Einstellungen für den saslauthd-Daemon # Bitte lesen Sie /usr/share/doc/sasl2-bin/README.Debian für Details. # # Sollte saslauthd beim Start automatisch ausgeführt werden? (Standard: nein) START=yes # Beschreibung dieser saslauthd-Instanz. Empfohlen. # (Vorschlag: SASL Authentication Daemon) DESC="SASL Authentication Daemon" # Kurzer Name dieser saslauthd-Instanz. Stark empfohlen. # (Vorschlag: saslauthd) NAME="saslauthd" # Welche Authentifizierungsmechanismen sollte saslauthd verwenden? (Standard: pam) # # Verfügbare Optionen in diesem Debian-Paket: # getpwent -- verwenden Sie die getpwent()-Bibliotheksfunktion # kerberos5 -- verwenden Sie Kerberos 5 # pam -- verwenden Sie PAM # rimap -- verwenden Sie einen Remote-IMAP-Server # shadow -- verwenden Sie die lokale Schattenpasswortdatei # sasldb -- verwenden Sie die lokale sasldb-Datenbankdatei # ldap -- verwenden Sie LDAP (Konfiguration befindet sich in /etc/saslauthd.conf) # # Nur eine Option kann gleichzeitig verwendet werden. Siehe die saslauthd-Man-Seite # für weitere Informationen. # # Beispiel: MECHANISMS="pam" MECHANISMS="pam" # Zusätzliche Optionen für diesen Mechanismus. (Standard: keine) # Siehe die saslauthd-Man-Seite für Informationen zu mech-spezifischen Optionen. MECH_OPTIONS="" # Wie viele saslauthd-Prozesse sollten wir ausführen? (Standard: 5) # Ein Wert von 0 erstellt für jede Verbindung einen neuen Prozess. THREADS=5 # Weitere Optionen (Standard: -c -m /var/run/saslauthd) # Hinweis: Sie MÜSSEN die -m-Option angeben, sonst wird saslauthd nicht ausgeführt! # # WARNUNG: GEBEN SIE NICHT DIE -d-OPTION AN. # Die -d-Option bewirkt, dass saslauthd im Vordergrund anstelle als Daemon ausgeführt wird. Dies wird # DAS BOOTEN IHRES SYSTEMS BEHINDERN. Wenn Sie saslauthd im Debug-Modus ausführen möchten, führen Sie es # besser manuell aus, um auf Nummer sicher zu gehen. # # Siehe /usr/share/doc/sasl2-bin/README.Debian für Debian-spezifische Informationen. # Siehe die saslauthd-Man-Seite und die Ausgabe von 'saslauthd -h' für allgemeine # Informationen zu diesen Optionen. # # Beispiel für Chroot-Postfix-Benutzer: "-c -m /var/spool/postfix/var/run/saslauthd" # Beispiel für nicht-Chroot-Postfix-Benutzer: "-c -m /var/run/saslauthd" # # Um zu wissen, ob Ihr Postfix in Chroot läuft, überprüfen Sie /etc/postfix/master.cf. # Wenn es die Zeile "smtp inet n - y - - smtpd" oder "smtp inet n - - - - smtpd" hat, # dann läuft Ihr Postfix in einem Chroot. # Wenn es die Zeile "smtp inet n - n - - smtpd" hat, dann läuft Ihr Postfix NICHT # in einem Chroot. #OPTIONS="-c -m /var/run/saslauthd" OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r" |

Erstellen Sie dann die Datei /etc/pam.d/smtp. Sie sollte nur die folgenden beiden Zeilen enthalten (stellen Sie sicher, dass Sie Ihre korrekten Datenbankdetails einfüllen):

vi /etc/pam.d/smtp

| auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 |

Erstellen Sie als Nächstes die Datei /etc/postfix/sasl/smtpd.conf. Sie sollte so aussehen:

vi /etc/postfix/sasl/smtpd.conf

| pwcheck_method: saslauthd mech_list: plain login allow_plaintext: true auxprop_plugin: sql sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: mail_admin sql_passwd: mail_admin_password sql_database: mail sql_select: select password from users where email = '%u@%r' |

Fügen Sie dann den Postfix-Benutzer zur sasl-Gruppe hinzu (dies stellt sicher, dass Postfix die Berechtigung hat, auf saslauthd zuzugreifen):

adduser postfix sasl

Starten Sie dann Postfix und Saslauthd neu:

/etc/init.d/postfix restart  
/etc/init.d/saslauthd restart

7 Konfigurieren Sie Courier

Jetzt müssen wir Courier mitteilen, dass es gegen unsere MySQL-Datenbank authentifizieren soll. Bearbeiten Sie zuerst /etc/courier/authdaemonrc und ändern Sie den Wert von authmodulelist, sodass er folgendermaßen lautet:

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" [...] |

Machen Sie dann eine Sicherungskopie von /etc/courier/authmysqlrc und leeren Sie die alte Datei:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig  
cat /dev/null > /etc/courier/authmysqlrc

Öffnen Sie dann /etc/courier/authmysqlrc und fügen Sie die folgenden Zeilen ein:

vi /etc/courier/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Während der Installation werden die SSL-Zertifikate für IMAP-SSL und POP3-SSL mit dem Hostnamen localhost erstellt. Um dies auf den richtigen Hostnamen (server1.example.com in diesem Tutorial) zu ändern, löschen Sie die Zertifikate…

cd /etc/courier  
rm -f /etc/courier/imapd.pem  
rm -f /etc/courier/pop3d.pem

… und ändern Sie die folgenden beiden Dateien; ersetzen Sie CN=localhost durch CN=server1.example.com (Sie können auch die anderen Werte nach Bedarf ändern):

vi /etc/courier/imapd.cnf

| [...] CN=server1.example.com [...] |

vi /etc/courier/pop3d.cnf

| [...] CN=server1.example.com [...] |

Erstellen Sie dann die Zertifikate neu…

mkimapdcert  
mkpop3dcert

… und starten Sie Courier neu:

/etc/init.d/courier-authdaemon restart  
/etc/init.d/courier-imap restart  
/etc/init.d/courier-imap-ssl restart  
/etc/init.d/courier-pop restart  
/etc/init.d/courier-pop-ssl restart

Durch Ausführen von

telnet localhost pop3

können Sie sehen, ob Ihr POP3-Server korrekt funktioniert. Es sollte +OK Hello there. zurückgeben. (Geben Sie quit ein, um zur Linux-Shell zurückzukehren.)

root@server1:/etc/courier# telnet localhost pop3  
Trying ::1...  
Connected to localhost.localdomain.  
Escape character is '^]'.  
+OK Hello there.  
<-- quit  
+OK Better luck next time.  
Connection closed by foreign host.  
root@server1:/etc/courier#

8 Ändern Sie /etc/aliases

Jetzt sollten wir /etc/aliases öffnen. Stellen Sie sicher, dass der Postmaster auf root und root auf Ihren eigenen Benutzernamen oder Ihre E-Mail-Adresse zeigt, z.B. so:

vi /etc/aliases

| [...] postmaster: root root: [email protected] [...] |

oder so (wenn administrator Ihr eigener Benutzername ist):

| [...] postmaster: root root: administrator [...] |

Wann immer Sie /etc/aliases ändern, müssen Sie danach

newaliases

ausführen und Postfix neu starten:

/etc/init.d/postfix restart

9 Installieren Sie amavisd-new, SpamAssassin und ClamAV

Um amavisd-new, spamassassin und clamav zu installieren, führen Sie den folgenden Befehl aus:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

Danach müssen wir amavisd-new konfigurieren. Die Konfiguration ist in verschiedene Dateien aufgeteilt, die sich im Verzeichnis /etc/amavis/conf.d befinden. Werfen Sie einen Blick auf jede von ihnen, um sich mit der Konfiguration vertraut zu machen. Die meisten Einstellungen sind in Ordnung, jedoch müssen wir drei Dateien ändern:

Zuerst müssen wir ClamAV und SpamAssassin in /etc/amavis/conf.d/15-content_filter_mode aktivieren, indem wir die Zeilen @bypass_virus_checks_maps und @bypass_spam_checks_maps auskommentieren:

vi /etc/amavis/conf.d/15-content_filter_mode

Die Datei sollte so aussehen:

| use strict; # Sie können diese Datei ändern, um die SPAM-Prüfung über spamassassin wieder zu aktivieren # und um die Antivirus-Prüfung wieder zu aktivieren. # # Standard-Antivirus-Prüfmodus # Bitte beachten Sie, dass die Antivirus-Prüfung standardmäßig DEAKTIVIERT ist. # Wenn Sie sie aktivieren möchten, kommentieren Sie die folgenden Zeilen aus: @bypass_virus_checks_maps = ( \\%bypass_virus_checks, \\@bypass_virus_checks_acl, \\$bypass_virus_checks_re); # # Standard-SPAM-Prüfmodus # Bitte beachten Sie, dass die SPAM-Prüfung standardmäßig DEAKTIVIERT ist. # Wenn Sie sie aktivieren möchten, kommentieren Sie die folgenden Zeilen aus: @bypass_spam_checks_maps = ( \\%bypass_spam_checks, \\@bypass_spam_checks_acl, \\$bypass_spam_checks_re); 1; # sicherstellen, dass eine definierte Rückgabe vorhanden ist |

Und dann sollten Sie sich die Spam-Einstellungen und die Aktionen für Spam-/Virus-E-Mails in /etc/amavis/conf.d/20-debian_defaults ansehen. Es ist nicht nötig, etwas zu ändern, wenn die Standardeinstellungen für Sie in Ordnung sind. Die Datei enthält viele Erklärungen, sodass es nicht nötig ist, die Einstellungen hier zu erklären:

vi /etc/amavis/conf.d/20-debian_defaults

| [...] $QUARANTINEDIR = "$MYHOME/virusmails"; $quarantine_subdir_levels = 1; # Quarantäneverzeichnis-Hashing aktivieren $log_recip_templ = undef; # deaktivieren Sie die Protokollierung auf Empfängerebene 0 $DO_SYSLOG = 1; # protokollieren Sie über syslogd (bevorzugt) $syslog_ident = 'amavis'; # syslog-Identifikations-Tag, der allen Nachrichten vorangestellt wird $syslog_facility = 'mail'; $syslog_priority = 'debug'; # wechseln Sie zu info, um Debug-Ausgaben zu reduzieren usw. $enable_db = 1; # aktivieren Sie die Verwendung von BerkeleyDB/libdb (SNMP und nanny) $enable_global_cache = 1; # aktivieren Sie die Verwendung des libdb-basierten Caches, wenn $enable_db=1 $inet_socket_port = 10024; # Standard-Listening-Socket $sa_spam_subject_tag = '*SPAM* '; $sa_tag_level_deflt = 2.0; # fügen Sie Spam-Info-Header hinzu, wenn auf oder über diesem Niveau $sa_tag2_level_deflt = 6.31; # fügen Sie 'Spam erkannt'-Header auf diesem Niveau hinzu $sa_kill_level_deflt = 6.31; # löst Spam-abweisende Maßnahmen aus $sa_dsn_cutoff_level = 10; # Spam-Niveau, über dem kein DSN gesendet wird [...] $final_virus_destiny = D_DISCARD; # (Daten gehen nicht verloren, siehe Virusquarantäne) $final_banned_destiny = D_BOUNCE; # D_REJECT, wenn Frontend-MTA $final_spam_destiny = D_BOUNCE; $final_bad_header_destiny = D_PASS; # Falsch-positiv-prone (für Spam) [...] |

Schließlich bearbeiten Sie /etc/amavis/conf.d/50-user und fügen Sie die Zeile $pax=’pax’; in die Mitte ein:

vi /etc/amavis/conf.d/50-user

| use strict; # # Platzieren Sie hier Ihre Konfigurationsanweisungen. Sie überschreiben die in # früheren Dateien. # # Siehe /usr/share/doc/amavisd-new/ für Dokumentation und Beispiele von # den Anweisungen, die Sie in dieser Datei verwenden können # $pax='pax'; #------------ Ändern Sie nichts unter dieser Zeile ------------- 1; # sicherstellen, dass eine definierte Rückgabe vorhanden ist |

Führen Sie danach diese Befehle aus, um den clamav-Benutzer zur amavis-Gruppe hinzuzufügen und amavisd-new und ClamAV neu zu starten:

adduser clamav amavis  
/etc/init.d/amavis restart  
/etc/init.d/clamav-freshclam restart  
/etc/init.d/clamav-daemon restart

Jetzt müssen wir Postfix so konfigurieren, dass eingehende E-Mails über amavisd-new geleitet werden:

postconf -e 'content_filter = amavis:[127.0.0.1]:10024'  
postconf -e 'receive_override_options = no_address_mappings'

Fügen Sie anschließend die folgenden Zeilen zu /etc/postfix/master.cf hinzu:

vi /etc/postfix/master.cf

| [...] amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 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_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks |

Starten Sie dann Postfix neu:

/etc/init.d/postfix restart

Führen Sie jetzt aus

netstat -tap

und Sie sollten sehen, dass Postfix (master) auf Port 25 (smtp) und 10025 und amavisd-new auf Port 10024 hört:

root@server1:/etc/courier# netstat -tap  
Aktive Internetverbindungen (Server und etablierte)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 *:http                  *:*                     LISTEN      6134/apache2  
tcp        0      0 *:ssh                   *:*                     LISTEN      610/sshd  
tcp        0      0 *:smtp                  *:*                     LISTEN      23128/master  
tcp        0      0 localhost.localdo:10024 *:*                     LISTEN      21937/amavisd-new (  
tcp        0      0 localhost.localdo:10025 *:*                     LISTEN      23128/master  
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      4308/mysqld  
tcp        0      52 server1.example.com:ssh 192.168.0.206:57597     ESTABLISHED 976/0  
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      610/sshd  
tcp6       0      0 [::]:smtp               [::]:*                  LISTEN      23128/master  
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN      18191/couriertcpd  
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN      18259/couriertcpd  
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN      18222/couriertcpd  
tcp6       0      0 [::]:imap2              [::]:*                  LISTEN      18154/couriertcpd  
root@server1:/etc/courier#
 

10 Installieren Sie Razor, Pyzor und DCC und konfigurieren Sie SpamAssassin

Razor, Pyzor und DCC sind Spamfilter, die ein kollaboratives Filternetzwerk verwenden. Um Razor und Pyzor zu installieren, führen Sie aus

apt-get install razor pyzor

DCC ist in den Ubuntu 13.10-Repositories nicht verfügbar, also installieren wir es wie folgt:

cd /tmp  
wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z   
tar xzvf dcc-dccproc.tar.Z  
cd dcc-dccproc-1.3.1.154  
./configure --with-uid=amavis  
make  
make install  
chown -R amavis:amavis /var/dcc  
ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd

Jetzt müssen wir SpamAssassin mitteilen, dass es diese drei Programme verwenden soll. Bearbeiten Sie /etc/spamassassin/local.cf und fügen Sie die folgenden Zeilen hinzu:

vi /etc/spamassassin/local.cf

| [...] #dcc use_dcc 1 dcc_path /usr/local/bin/dccproc #pyzor use_pyzor 1 pyzor_path /usr/bin/pyzor #razor use_razor2 1 razor_config /etc/razor/razor-agent.conf #bayes use_bayes 1 use_bayes_rules 1 bayes_auto_learn 1 |

Dann müssen wir das DCC-Plugin in SpamAssassin aktivieren. Öffnen Sie /etc/spamassassin/v310.pre und kommentieren Sie die Zeile loadplugin Mail::SpamAssassin::Plugin::DCC aus:

vi /etc/spamassassin/v310.pre

| [...] # DCC - führen Sie DCC-Nachrichtenprüfungen durch. # # DCC ist hier deaktiviert, da es nicht Open Source ist. Siehe die DCC # Lizenz für weitere Details. # loadplugin Mail::SpamAssassin::Plugin::DCC [...] |

Sie können Ihre SpamAssassin-Konfiguration überprüfen, indem Sie ausführen:

spamassassin --lint

Es sollten keine Fehler angezeigt werden.

Starten Sie danach amavisd-new neu:

/etc/init.d/amavis restart

Jetzt aktualisieren wir unsere SpamAssassin-Regelsätze wie folgt:

sa-update --no-gpg

Wir erstellen einen Cron-Job, damit die Regelsätze regelmäßig aktualisiert werden. Führen Sie aus

crontab -e

um den Cron-Job-Editor zu öffnen. Erstellen Sie den folgenden Cron-Job:

| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.