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 suum 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 dashVerwenden 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-utils2 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-smbpassSie 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 postfixcd /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_versionDie 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-buildpackageJetzt gehen wir ein Verzeichnis nach oben, dort wurden die neuen .deb-Pakete erstellt:
cd ..Der Befehl
ls -lzeigt 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.gzWä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.deb4 Erstellen Sie die MySQL-Datenbank für Postfix/Courier
Jetzt erstellen wir eine Datenbank namens mail:
mysqladmin -u root -p create mailSie werden nach dieser Frage gefragt:
Passwort eingeben: <– yourrootsqlpassword
Als Nächstes gehen wir zur MySQL-Shell:
mysql -u root -pIn 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.
| source | destination |
| [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).
| password | quota | |
| [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,
| domain | transport |
| example.com | smtp:[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 restartFühren Sie aus
netstat -tap | grep mysqlum 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_*.cfJetzt 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 -mAls 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 -x509Landname (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.key6 Konfigurieren Sie Saslauthd
Zuerst führen Sie aus
mkdir -p /var/spool/postfix/var/run/saslauthdBearbeiten 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 saslStarten Sie dann Postfix und Saslauthd neu:
/etc/init.d/postfix restart
/etc/init.d/saslauthd restart7 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 restartDurch Ausführen von
telnet localhost pop3kö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
newaliasesausführen und Postfix neu starten:
/etc/init.d/postfix restart9 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 paxDanach 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_modeDie 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 restartJetzt 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 restartFühren Sie jetzt aus
netstat -tapund 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 pyzorDCC 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/dccifdJetzt 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 --lintEs sollten keine Fehler angezeigt werden.
Starten Sie danach amavisd-new neu:
/etc/init.d/amavis restartJetzt aktualisieren wir unsere SpamAssassin-Regelsätze wie folgt:
sa-update --no-gpgWir erstellen einen Cron-Job, damit die Regelsätze regelmäßig aktualisiert werden. Führen Sie aus
crontab -eum den Cron-Job-Editor zu öffnen. Erstellen Sie den folgenden Cron-Job:
| 23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null |
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.