Virtuelle Benutzer und Domains Mit Postfix, Courier Und MySQL (Ubuntu 7.10)

Version 1.0
Author: Falko Timme


Diese Anleitung ist urheberrechtlich geschützt (Copyright (c) 2007 by Falko Timme). Sie stammt von einer Anleitung von Christoph Haas, die Du auf folgender Seite finden kannst http://workaround.org. Du kannst diese Anleitung unter der Creative Commons License 2.5 oder jeder anderen späteren Version verwenden.

Diese Anleitung beschreibt wie man einen Postfix Mail Server installiert, der auf virtuellen Benutzern und Domains basiert, das heißt Benutzer und Domains, die in einer MySQL Datenbank sind. Weiterhin werde ich die Installation und Konfiguration von Courier (Courier-POP3, Courier-IMAP) veranschaulichen, damit sich Courier gegenüber der gleichen MySQL Datenbank, die Postfix verwendet, autentifizieren kann.

Der daraus resultierende Postfix Server ist geeignet für SMTP-AUTH und TLS sowie quota (quota ist nicht standardmäßig in Postfix enthalten, ich werde aufzeigen, wie man Postfix sachgerecht patscht). Passwörter werden in den Datenbanken verschlüsselt abgelegt (die meisten Dokumente, die ich gefunden habe, haben sich mit einfachen Text-Passwörtern befasst, was ziemlich riskant ist). Weiterhin deckt diese Anleitung auch die Installation von Amavisd, SpamAssassin und ClamAV ab, sodass E-Mails auf Spam und Viren überprüft werden.

Der Vorteil eines solchen “virtuellen” Setups (virtuelle Benutzer und Domains in einer MySQL Datenbank) ist, dass es weitaus leistungsfähiger als ein Setup, das auf “realen” Systembenutzern basiert. Mit diesem virtuellen Setup kann Dein Mail Server Tausende von Domains und Benutzern bedienen. Davon abgesehen, ist es einfacher zu verwalten, da man sich nur mit der MySQL Datenbank beschäftigen muss, wenn man neue Benutzer/Domains hinzufügt oder bereits vorhandene bearbeitet. Keine postmap Befehle mehr um db Dateien zu erstellen, kein Neuladen von Postfix, etc. Zur Administration der MySQL Datenbank kannst Du web-basierte Tools wie phpMyAdmin verwenden, die auch in dieser Anleitung installiert werden. Der dritte Vorteil ist, dass die Benutzer eine E-mail Adresse als Benutzernamen haben (anstelle eines Benutzernamens + E-mai Adresse), was einfacher zu verstehen ist und man kann es sich besser merken.

Diese Anleitung ist ein praktischer Leitfaden und deckt kein theoretisches Hintergrundwissen ab. Dies wird in anderen Dokumenten im Web abgehandelt.

Diese Anleitung ist ohne jegliche Gewähr! Allerdings möchte ich an dieser Stelle darauf hinweisen, dass dies hier nicht der einzige Weg ist, ein solches System zu installieren. Es gibt viele Möglichkeiten - ich selbst habe mich für diese entschieden. Ich kann aber nicht garantieren, dass diese Lösung bei jedem funktioniert bzw. für jeden die richtige ist!

1 Vorbemerkung

Diese Anleitung basiert auf dem Ubuntu 7.10 Server (Gutsy Gibbon), also solltest Du ersteinmal eine Ubuntu 7.10 Server Gundinstallation vornehmen, bevor Du mit dieser Anleitung weiter machst (z.B. wie auf den Seiten 1 - 3 der Anleitung: Der Perfekte Server - Ubuntu Gutsy Gibbon (Ubuntu 7.10) gezeigt wird). Das System sollte eine statische IP Adresse haben. Ich verwende 192.168.0.100 als meine IP address und server1.example.com als den Hostnamen.

Vergewissere Dich, dass Du als Root Benutzer angemeldet bist (gib ein

sudo su

um Root Benutzer zu werden), da wir alle Schritte dieser Anleitung als Root Benutzer durchführen müssen.

2 Installiere Postfix, Courier, Saslauthd, MySQL, phpMyAdmin

Um Postfix, Courier, Saslauthd, MySQL, und phpMyAdmin zu installieren, führen wir einfach Folgendes 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 postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql

Ein paar Fragen werden Dir gestellt werden:

New password for the MySQL "root" user: <-- yourrootsqlpassword
Create directories for web-based administration ? <-- No
General type of mail configuration: <-- Internet Site
System mail name: <-- server1.example.com
SSL certificate required <-- Ok
Web server to reconfigure automatically: <-- apache2

3 Anbringen von Quota Patch in Postfix

Wir müssen den Postfix Quelltext beziehen, patche ihn mit dem Quota Patch, erstelle neue Postfix .deb Pakete und installiere diese .deb Pakete:

apt-get install build-essential dpkg-dev fakeroot debhelper libgdbm-dev libldap2-dev libpcre3-dev libssl-dev libsasl2-dev postgresql-server-dev-8.2 po-debconf dpatch libmysqlclient15-dev lsb-release libcdb-dev libdb4.5-dev


cd /usr/src
apt-get source postfix

(Vergewissere Dich, dass Du die richtige Postfix Version bei folgenden Befehlen verwendest. Ich habe Postfix 2.4.5 installiert. Um Deine Postfix Version herauszufinden, kannst Du Folgendes laufen lassen

postconf -d | grep mail_version

Die Ausgabe solle so aussehen:

root@server1:~# postconf -d | grep mail_version
mail_version = 2.4.5
milter_macro_v = $mail_name $mail_version
root@server1:~#

)

wget http://vda.sourceforge.net/VDA/postfix-2.4.5-vda-ng.patch.gz
gunzip postfix-2.4.5-vda-ng.patch.gz
cd postfix-2.4.5
patch -p1 < ../postfix-2.4.5-vda-ng.patch
dpkg-buildpackage

Es kann sein, dass Du eine solche Warnung am Ende des dpkg-buildpackage Befehls siehst:

(WARNING: Failed to sign .dsc and .changes file)

Du kannst diese Mitteilung ignorieren.

Jetzt gehen wir ein Verzeichnis hoch, dort wurden die neuen .deb Pakete erstellt:

cd ..

Der Befehl

ls -l

zeigt Dir Pakete, die verfügbar sind:

root@server1:/usr/src# ls -l
total 5424
drwxr-xr-x 19 root src 4096 2007-11-16 14:33 postfix-2.4.5
-rw-r--r-- 1 root src 222693 2007-11-16 14:30 postfix_2.4.5-3ubuntu1.diff.gz
-rw-r--r-- 1 root src 663 2007-11-16 14:30 postfix_2.4.5-3ubuntu1.dsc
-rw-r--r-- 1 root src 1783 2007-11-16 14:33 postfix_2.4.5-3ubuntu1_i386.changes
-rw-r--r-- 1 root src 1123668 2007-11-16 14:33 postfix_2.4.5-3ubuntu1_i386.deb
-rw-r--r-- 1 root src 2934634 2007-08-03 19:53 postfix_2.4.5.orig.tar.gz
-rw-r--r-- 1 root src 57055 2007-08-02 01:13 postfix-2.4.5-vda-ng.patch
-rw-r--r-- 1 root src 38078 2007-11-16 14:33 postfix-cdb_2.4.5-3ubuntu1_i386.deb
-rw-r--r-- 1 root src 133642 2007-11-16 14:33 postfix-dev_2.4.5-3ubuntu1_all.deb
-rw-r--r-- 1 root src 826202 2007-11-16 14:33 postfix-doc_2.4.5-3ubuntu1_all.deb
-rw-r--r-- 1 root src 44340 2007-11-16 14:33 postfix-ldap_2.4.5-3ubuntu1_i386.deb
-rw-r--r-- 1 root src 40118 2007-11-16 14:33 postfix-mysql_2.4.5-3ubuntu1_i386.deb
-rw-r--r-- 1 root src 39956 2007-11-16 14:33 postfix-pcre_2.4.5-3ubuntu1_i386.deb
-rw-r--r-- 1 root src 40190 2007-11-16 14:33 postfix-pgsql_2.4.5-3ubuntu1_i386.deb
root@server1:/usr/src#

Wähle das postfix und postfix-mysql Paket und installiere sie wie folgt:

dpkg -i postfix_2.4.5-3ubuntu1_i386.deb
dpkg -i postfix-mysql_2.4.5-3ubuntu1_i386.deb

4 Erstelle die MySQL Datenbank Für Postfix/Courier

Nun erstellen wir eine Datenbank mit dem Namen mail:

mysqladmin -u root -p create mail

Als Nächstes gehen wir zur MySQL Kommandozeile:

mysql -u root -p

In der MySQL Kommandozeile erstellen wir den Benutzer mail_admin mit dem Passwort mail_admin_password (ersetze dies mit Deinem eigenen Passwort), der SELECT,INSERT,UPDATE,DELETE Privilegien in der mail Datenbank hat. Diesen Benutzer verwenden Postfix und Courier 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 Kommandozeile, wir erstellen Tabellen, die Postfix und Courier benötigen:

USE mail;


CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

Wie Du vielleicht festgestellt hast, haben wir mit dem quit Befehl die MySQL Kommandozeile verlassen und sind zurück in der Linux Kommandozeile.

Die domains Tabelle wird jede virtuelle Domain speichern, für die Postfix E-Mails erhalten solle (z.B. example.com).
domain
example.comDie forwardings Tabelle ist für das Aliasing einer E-Mail Adresse mit der anderen zuständig, z.B. leite E-Mails für info@example.com an sales@example.com weiter.
source destination
info@example.com sales@example.comDie users Tabelle speichert alle virtuell Benutzer (das heißt E-Mail Adressen, da die E-Mail Adresse und der Benutzername das gleiche sind) und Passwörter (in verschlüsselter Form!) sowie einen Quota-Wert für jede Mail Box (in diesem Beispiel ist der Standardwert 10485760 Bytes, was 10MB bedeutet).
email password quota
sales@example.com No9.E4skNvGa. ("secret" in encrypted form) 10485760Die transport Tabelle ist optional, sie ist für fortgeschrittene Benutzer. Sie erlaubt, Mails an einzelne Benutzer, ganze Domains oder alle Mails an einen anderen Server weiterzuleiten. Zum Beispiel würde,
domain transport
example.com smtp:[1.2.3.4]alle E-Mails für example.com via smtp Protokoll an den Server mit der IP Adresse 1.2.3.4 weiterleiten (die eckigen Klammern [] bedeuten "schlage den MX DNS Record nicht nach" (was für IP Adressen Sinn macht...). Wenn Du stattdessen einen Fully Qualified Domain Name (FQDN) nutzt, verwendest Du die eckigen Klammern nicht).

Übrigens (Ich nehem an, die IP Adresse Deines Mail Server Systems 192.168.0.100 ist) kannst Du auf phpMyAdmin über http://192.168.0.100/phpmyadmin/ in einbem Browser zugreifen und Dich als mail_admin anmelden. Dann kannst Du Dir die Datenbank einmal ansehen. Später kannst Du phpMyAdmin verwenden um Deinen Mail Server zu verwalten.

5 Konfiguriere Postfix

Jetzt müssen wir Postfix mitteilen, wo es alle Informationen in der Datenbank finden kann. Dafür müssen wir sechs Text-Dateien erstellen. Du wirst feststellen, dass ich Postfix mitteile, sich mit MySQL auf der IP Adresse 127.0.0.1 anstatt sich mit localhost zu verbinden. Postfix läuft in einem Chroot Gefängnis und hat keinen Zugriff auf den MySQL Socket, welchen er versuchen würde zu verbinden, wenn ich Postfix mitgeteilt hätte localhost zu verwenden. Wenn ich 127.0.0.1 verwenden, nutzt Postfix den TCP Netzwerkbetrieb um sich mit MySQL zu verbinden, was auch im Chroot Gefängnis kein Problem darstellt (die Alternative wäre den MySQL Socket in ein Chroot Gefängnis zu verschieben, was wieder andere Probleme verursacht).

Bitte vergewissere Dich, dass die Datei /etc/mysql/my.cnf folgende Zeile beinhaltet:

vi /etc/mysql/my.cnf


[...]
bind-address = 127.0.0.1 [...]
Wenn Du die Datei /etc/mysql/my.cnf bearbeiten musstest, starte MySQL jetzt neu:

/etc/init.d/mysql restart

Lass Folgendes laufen

netstat -tap | grep mysql

um sicher zu gehen, dass MySQL auf 127.0.0.1 (localhost.localdomain) hört:

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

Lass uns nun unsere sechs Text-Dateien erstellen.

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
Ändere dann die Berechtigung und die Gruppe dieser Dateien:

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

Nun erstellen wir einen Benutzer und eine Gruppe namens vmail mit dem Home Verzeichnis /home/vmail. Dort werden alle Mail Boxes gespeichert werden.

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

Als Nächstes nehmen wir eine Postfix Konfiguration vor. Stelle sicher, dass Du server1.example.com mit einem gültigen FQDN ersetzt, sonst kann es sein, dass Dein Postfix nicht richtig funktioniert!

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_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_create_maildirsize = yes'
postconf -e 'virtual_mailbox_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 = "The user you are trying to reach is over quota."'
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'

Danach erstellen wir das SSL Zertifikat, das für TLS gebraucht wird:

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

Country Name (2 letter code) [AU]: <-- Gib Dein Land ein (z.B. "DE").
State or Province Name (full name) [Some-State]: <-- Gib Deine Bundesland oder die Region ein.
Locality Name (eg, city) []: <-- Gib Deine Stadt ein.
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Gib den Namen Deiner Organisation ein (z.B. den Namen Deiner Firma).
Organizational Unit Name (eg, section) []: <-- Gib den Namen Deiner Abteilung ein (z.B. "IT Department").
Common Name (eg, YOUR name) []: <-- Gib den Fully Qualified Domain Name des Systems ein (e.g. "server1.example.com").
Email Address []: <-- Gib Deine E-Mail Adresse ein.

Ändere dann die Berechtigung von smtpd.key:

chmod o= /etc/postfix/smtpd.key


6 Konfiguriere Saslauthd

Führe folgendes aus

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

Bearbeite dann /etc/default/saslauthd. Stelle START to yes ein und ändere die Zeile OPTIONS="-c" zu OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r":

vi /etc/default/saslauthd


#
# Settings for saslauthd daemon # # Should saslauthd run automatically on startup? (default: no) START=yes # Which authentication mechanisms should saslauthd use? (default: pam) # # Available options in this Debian package: # getpwent -- use the getpwent() library function # kerberos5 -- use Kerberos 5 # pam -- use PAM # rimap -- use a remote IMAP server # shadow -- use the local shadow password file # sasldb -- use the local sasldb database file # ldap -- use LDAP (configuration is in /etc/saslauthd.conf) # # Only one option may be used at a time. See the saslauthd man page # for more information. # # Example: MECHANISMS="pam" MECHANISMS="pam" # Additional options for this mechanism. (default: none) # See the saslauthd man page for information about mech-specific options. MECH_OPTIONS="" # How many saslauthd processes should we run? (default: 5) # A value of 0 will fork a new process for each connection. THREADS=5 # Other options (default: -c) # See the saslauthd man page for information about these options. # # Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd" # Note: See /usr/share/doc/sasl2-bin/README.Debian OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
Bearbeite dann die Datei /etc/pam.d/smtp. Sie sollte nur folgende zwei Zeilen beinhalten (vergewissere Dich, dass Du Deine korrekten Datenbankdetails eingibst):

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
Als Nächstes erstellen wir die Datei /etc/postfix/sasl/smtpd.conf. So solle sie aussehen:

vi /etc/postfix/sasl/smtpd.conf


pwcheck_method: saslauthd
mech_list: plain login allow_plaintext: true auxprop_plugin: 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'
Dann starten wir Postfix und Saslauthd neu:

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

7 Konfiguriere Courier

Nun müssen wir Courier mitteilen, dass es sich gegenüber unserer MySQL Datenbank autentifizieren soll. Bearbeite zunächst /etc/courier/authdaemonrc und ändere den Wert von authmodulelist sodass es heißt:

vi /etc/courier/authdaemonrc


[...]
authmodulelist="authmysql" [...]
Sichere dann /etc/courier/authmysqlrc und leere die alte Datei:

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

Öffne dann /etc/courier/authmysqlrc und füge folgende 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
Starte Courier dann 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

Indem Du Folgendes laufen lässt

telnet localhost pop3

kannst Du feststellen, ob Dein POP3 Server richtig funktioniert. Es sollte +OK Hello there zurück geben. (Gib quit ein um wieder zur Linux Kommandozeile zu gelangen)

root@server1:/etc/postfix# telnet localhost pop3
Trying 127.0.0.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/postfix#

8 Bearbeite /etc/aliases

Nun sollten wir /etc/aliases öffnen. Vergewissere Dich, dass postmaster auf root zeigt und root auf Deinen eigenen Benutzernamen oder Deine E-Mail Adresse, z.B. wie folgt:

vi /etc/aliases


[...]
postmaster: root root: postmaster@yourdomain.tld [...]
oder wie das (wenn administrator Dein eigener Benutzername ist):
[...]
postmaster: root root: administrator [...]
Wann immer Du /etc/aliases bearbeitest, musst Du danach Folgendes laufen lassen

newaliases

und Postfix neu starten:

/etc/init.d/postfix restart


9 Installiere amavisd-new, SpamAssassin, Und ClamAV

Um amavisd-new, spamassassin und clamav zu installieren, lass folgenden Befehl laufen:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 unzoo 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 aufgesplittet, die sich im /etc/amavis/conf.d Verzeichnis befinden. Sieh Dir jede einzelne an um Dich mit der Konfiguration vertraut zu machen. Die meisten Einstellungen sind in Ordnung, jedoch müssen wir drei Dateien bearbeiten:

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

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

Die Datei sollte wie folgt aussehen:
use strict;
# You can modify this file to re-enable SPAM checking through spamassassin # and to re-enable antivirus checking. # # Default antivirus checking mode # Uncomment the two lines below to enable it back # @bypass_virus_checks_maps = ( %bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re); # # Default SPAM checking mode # Uncomment the two lines below to enable it back # @bypass_spam_checks_maps = ( %bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re); 1; # insure a defined return
Dann solltest Du Dir die Spam Einstellungen und die Vorgänge für Spam-/Virus-Mails in /etc/amavis/conf.d/20-debian_defaults ansehen. Es gibt keinen Grund etwas zu ändern wenn Dir die Standardeinstellungen zusagen. Die Datei beinhaltet viele Erklärungen, es besteht kein Anlass die Einstellungen hier zu erklären:

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


[...]
$QUARANTINEDIR = "$MYHOME/virusmails"; $log_recip_templ = undef; # disable by-recipient level-0 log entries $DO_SYSLOG = 1; # log via syslogd (preferred) $syslog_ident = 'amavis'; # syslog ident tag, prepended to all messages $syslog_facility = 'mail'; $syslog_priority = 'debug'; # switch to info to drop debug output, etc $enable_db = 1; # enable use of BerkeleyDB/libdb (SNMP and nanny) $enable_global_cache = 1; # enable use of libdb-based cache if $enable_db=1 $inet_socket_port = 10024; # default listenting socket $sa_spam_subject_tag = '***SPAM*** '; $sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level $sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level $sa_kill_level_deflt = 6.31; # triggers spam evasive actions $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent $sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger $sa_local_tests_only = 0; # only tests which do not require internet access? [...] $final_virus_destiny = D_DISCARD; # (data not lost, see virus quarantine) $final_banned_destiny = D_BOUNCE; # D_REJECT when front-end MTA $final_spam_destiny = D_BOUNCE; $final_bad_header_destiny = D_PASS; # False-positive prone (for spam) [...]
Bearbeite schließlich die Datei /etc/amavis/conf.d/50-user und füge die Zeile $pax='pax'; in der Mitte hinzu:

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


use strict;
# # Place your configuration directives here. They will override those in # earlier files. # # See /usr/share/doc/amavisd-new/ for documentation and examples of # the directives you can use in this file # $pax='pax'; #------------ Do not modify anything below this line ------------- 1; # insure a defined return
Starte danach diese Befehle, um den clamav Benutzer der amavis Gruppe hinzuzufügen und amavisd-new und ClamAV neu zu starten:

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

Nun müssen wir Postfix konfigurieren um eingehende E-Mails durch amavisd-new zu leiten:

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

Füge danach folgende Zeile zu /etc/postfix/master.cf:

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 -o smtpd_bind_address=127.0.0.1
Starte Postfix dann neu:

/etc/init.d/postfix restart

Führe nun Folgendes aus

netstat -tap

und Du müsstest sehen, dass Postfix (master) auf Port 25 (smtp) und 10025 hört, und amavisd-new auf Port 10024:

root@server1:/etc/postfix# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 localhost.localdo:10024 *:* LISTEN 14770/amavisd (mast
tcp 0 0 localhost.localdo:10025 *:* LISTEN 15800/master
tcp 0 0 localhost.localdo:mysql *:* LISTEN 5742/mysqld
tcp 0 0 *:smtp *:* LISTEN 15800/master
tcp6 0 0 *:imaps *:* LISTEN 13290/couriertcpd
tcp6 0 0 *:pop3s *:* LISTEN 13359/couriertcpd
tcp6 0 0 *:pop3 *:* LISTEN 13320/couriertcpd
tcp6 0 0 *:imap2 *:* LISTEN 13253/couriertcpd
tcp6 0 0 *:www *:* LISTEN 4961/apache2
tcp6 0 0 *:ssh *:* LISTEN 3725/sshd
tcp6 0 0 server1.example.com:ssh ::ffff:192.168.0.2:4670 ESTABLISHED3783/0
root@server1:/etc/postfix#

10 Installiere Razor, Pyzor Und DCC Und Konfiguriere SpamAssassin

Razor, Pyzor und DCC sind Spamfilter, die ein gemeinschaftliches Filternetzwerk verwenden. Um sie zu installieren, lass Folgendes laufen

apt-get install razor pyzor dcc-client

Nun müssen wir SpamAssassin mitteilen, diese drei Programme zu verwenden. Bearbeite /etc/spamassassin/local.cf und füge folgende Zeilen hinzu:

vi /etc/spamassassin/local.cf


[...]
#dcc use_dcc 1 dcc_path /usr/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 den DCC plugin in SpamAssassin freischalten. Öffne /etc/spamassassin/v310.pre und aktiviere die loadplugin Mail::SpamAssassin::Plugin::DCC Zeile:

vi /etc/spamassassin/v310.pre


# This is the right place to customize your installation of SpamAssassin.
# # See 'perldoc Mail::SpamAssassin::Conf' for details of what can be # tweaked. # # This file was installed during the installation of SpamAssassin 3.1.0, # and contains plugin loading commands for the new plugins added in that # release. It will not be overwritten during future SpamAssassin installs, # so you can modify it to enable some disabled-by-default plugins below, # if you so wish. # # There are now multiple files read to enable plugins in the # /etc/mail/spamassassin directory; previously only one, "init.pre" was # read. Now both "init.pre", "v310.pre", and any other files ending in # ".pre" will be read. As future releases are made, new plugins will be # added to new files, named according to the release they're added in. ########################################################################### # DCC - perform DCC message checks. # # DCC is disabled here because it is not open source. See the DCC # license for more details. # loadplugin Mail::SpamAssassin::Plugin::DCC # Pyzor - perform Pyzor message checks. # loadplugin Mail::SpamAssassin::Plugin::Pyzor # Razor2 - perform Razor2 message checks. # loadplugin Mail::SpamAssassin::Plugin::Razor2 # SpamCop - perform SpamCop message reporting # loadplugin Mail::SpamAssassin::Plugin::SpamCop # AntiVirus - some simple anti-virus checks, this is not a replacement # for an anti-virus filter like Clam AntiVirus # #loadplugin Mail::SpamAssassin::Plugin::AntiVirus # AWL - do auto-whitelist checks # loadplugin Mail::SpamAssassin::Plugin::AWL # AutoLearnThreshold - threshold-based discriminator for Bayes auto-learning # loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold # TextCat - language guesser # #loadplugin Mail::SpamAssassin::Plugin::TextCat # AccessDB - lookup from-addresses in access database # #loadplugin Mail::SpamAssassin::Plugin::AccessDB # WhitelistSubject - Whitelist/Blacklist certain subject regular expressions # loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject ########################################################################### # experimental plugins # DomainKeys - perform DomainKeys verification # # External modules required for use, see INSTALL for more information. # Note that this may be redundant if you also plan to use the DKIM plugin. # #loadplugin Mail::SpamAssassin::Plugin::DomainKeys # MIMEHeader - apply regexp rules against MIME headers in the message # loadplugin Mail::SpamAssassin::Plugin::MIMEHeader # ReplaceTags # loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
Du kannst Deine SpamAssassin Konfiguration überprüfen indem Du Folgendes ausführst:

spamassassin --lint

Es sollte keine Fehler anzeigen.

Starte amavisd-new danach neu:

/etc/init.d/amavis restart


11 Quota Überschreitungsmeldung

Wenn Du Meldungen bezüglich aller E-Mail-Konten erhalten möchtest, die über Quota sind, dann führe Folgendes aus:

cd /usr/local/sbin/
wget http://puuhis.net/vhcs/quota.txt
mv quota.txt quota_notify
chmod 755 quota_notify

Öffne /usr/local/sbin/quota_notify und bearbeite die Variablen am Anfang. Weiter unten in der Datei (gegen Ende hin) gibt es zwei Zeilen, denen Du ein % Zeichen anhängen solltest:

vi /usr/local/sbin/quota_notify


[...]
my $POSTFIX_CF = "/etc/postfix/main.cf"; my $MAILPROG = "/usr/sbin/sendmail -t"; my $WARNPERCENT = 80; my @POSTMASTERS = ('postmaster@yourdomain.tld'); my $CONAME = 'My Company'; my $COADDR = 'postmaster@yourdomain.tld'; my $SUADDR = 'postmaster@yourdomain.tld'; my $MAIL_REPORT = 1; my $MAIL_WARNING = 1; [...] print "Subject: WARNING: Your mailbox is $lusers{$luser}% full.n"; [...] print "Your mailbox: $luser is $lusers{$luser}% full.nn"; [...]
Lass Folgendes laufen

crontab -e

um einen Cron Job für dieses Skript zu erstellen:
0 0 * * * /usr/local/sbin/quota_notify &> /dev/null

12 Teste Postfix

Um zu sehen, ob Postfix bereit für SMTP-AUTH und TLS ist, führe Folgendes aus

telnet localhost 25

Nachdem Du die Verbindung zu Deinem Postfix Mail Server eingerichtet hast, gib dies ein

ehlo localhost

Wenn Du die Zeile

250-STARTTLS

und die Zeile

250-AUTH LOGIN PLAIN

siehst, dann ist alles in bester Ordnung:

root@server1:~# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 server1.example.com ESMTP Postfix (Ubuntu)
ehlo localhost
250-server1.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
root@server1:~#

Gib ein

quit

um zur Kommandozeile des Systmes zurückzukehren.

13 Die Datenbank füllen Und testen

Um die Datenbank zu füllen, kannst Du die MySQL Kommandozeile verwenden:

mysql -u root -p
USE mail;

Du musst wenigstens Einträge in den Tabellen domains und users erstellen:

INSERT INTO `domains` (`domain`) VALUES ('example.com');
INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('sales@example.com', ENCRYPT('secret'), 10485760);

(Bitte pass auf, dass Du den ENCRYPT Syntax im zweiten INSERT Statement verwendest, um das Passwort zu verschlüsseln!)

Wenn Du Einträge in den anderen zwei Tabellen vornehmen möchtest, würde dies so aussehen:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('info@example.com', 'sales@example.com');
INSERT INTO `transport` (`domain`, `transport`) VALUES ('example.com', 'smtp:mail.example.com');

Um die MySQL Kommandozeile zu verlassen, gib ein

quit;

Für die Meisten ist es einfacher wenn sie ein grafisches Front-end zu MySQL haben; daher kannst Du auch phpMyAdmin (in diesem Beispiel unter http://192.168.0.100/phpmyadmin/ oder http://server1.example.com/phpmyadmin/) verwenden die mail Datenbank zu verwalten. Nochmal, wenn Du einen Benutzer einrichtest, vergewissere Dich, dass Du die ENCRYPT Funktion zum Verschlüsseln des Passwortes verwendest:


Ich denke nicht, dass ich die domains und users Tabelle weiter erklären muss.

Die forwardings Tabelle kann Einträge wie die folgenden haben:
source destination  
info@example.com sales@example.com Redirects emails for info@example.com to sales@example.com
@example.com thomas@example.com Creates a Catch-All account for thomas@example.com. All emails to example.com will arrive at thomas@example.com, except those that exist in the users table (i.e., if sales@example.com exists in the users table, mails to sales@example.com will still arrive at sales@example.com).
@example.com @anotherdomain.tld This redirects all emails to example.com to the same user at anotherdomain.tld. E.g., emails to thomas@example.com will be forwarded to thomas@anotherdomain.tld.
info@example.com sales@example.com, billing@anotherdomain.tld Forward emails for info@example.com to two or more email addresses. All listed email addresses under destination receive a copy of the email.Die transporttTabelle kann folgende Einträge haben:
domain transport  
example.com : Delivers emails for example.com locally. This is as if this record would not exist in this table at all.
example.com smtp:mail.anotherdomain.tld Delivers all emails for example.com via smtp to the server mail.anotherdomain.com.
example.com smtp:mail.anotherdomain.tld:2025 Delivers all emails for example.com via smtp to the server mail.anotherdomain.com, but on port 2025, not 25 which is the default port for smtp.
example.com smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld]
The square brackets prevent Postfix from doing lookups of the MX DNS record for the address in square brackets. Makes sense for IP addresses.
.example.com smtp:mail.anotherdomain.tld Mail for any subdomain of example.com is delivered to mail.anotherdomain.tld.
* smtp:mail.anotherdomain.tld All emails are delivered to mail.anotherdomain.tld.
joe@example.com smtp:mail.anotherdomain.tld Emails for joe@example.com are delivered to mail.anotherdomain.tld.Siehe

man transport

für mehr Informationen.

Bitte denke daran, dass die Anordnung der Einträge in der transport Tabelle wichtig ist! Die Einträge schließen sich von oben nach unten an.

Wichtig: Postfix verwendet einen Caching Mechanism für den Transport, daher kann es eine Weile dauern, bis Deine Änderungen in der transport Tabelle übernommen werden. Wenn Du möchtest, dass sie sofort übernommen werden, lass Folgendes laufen

postfix reload

nachdem Du Deine Änderungen in der transport Tabelle vorgenommen hast.

14 References

15 Links