Virtuelle Benutzer und Domains mit Postfix, Courier und MySQL (Debian Etch)
Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Diese Anleitung unterliegt dem Copyright (c) 2007 von Falko Timme. Sie stammt von einem Tutorial von Christoph Haas, welches Du auf http://workaround.org findest. Du kannst diese Anleitung unter der Creative Commons Lizenz 2.5 oder jeder späteren Version verwenden.
Diese Anleitung veranschaulicht, wie man einen Mail Server (basierend auf Postfix) installiert, der auf virtuellen Benutzern und Domains basiert, d.h. Benutzer und Domains, die sich in einer MySQL Datenbank befinden. Weiterhin werde ich die Installation und Konfiguration von Courier (Courier-POP3, Courier-IMAP) aufzeigen, damit sich Courier gegenüber der gleichen MySQL Datenbank authentifizieren kann, die Postfix verwendet.
Der daraus resultierende Postfix Server unterstützt SMTP-AUTH und TLS sowie Quota (Quota ist in Postfix standardmäßig nicht enthalten, ich werde zeigen, wie Du Dein Postfix entsprechend patchen kannst). Passwörter werden in der Datenbank in verschlüsselter Form gespeichert (die meisten Dokumente arbeiten mit normalen Textpasswörtern, das ist ein Sicherheitsrisiko). Zusätzlich behandelt diese Anleitung die Installation von Amavisd, SpamAssassin und ClamAV, damit E-Mails auf Spam und Viren gescannt werden.
Der Vorteil eines solchen „virtuellen“ Setups (virtuelle Benutzer und Domains in einer MySQL Datenbank) besteht darin, dass es weitaus leistungsfähiger als ein Setup ist, das auf „realen“ Systembenutzern basiert. Mit diesem virtuellen Setup kann Dein Mail Server Tausende von Domains und Benutzern bewältigen. Außerdem ist es einfacher zu verwalten, da Du nur mit der MySQL Datenbank zu tun hast, wenn Du neue Benutzer/Domains hinzufügst oder vorhandene bearbeitest. Keine postmap Befehle mehr zum Erstellen von db Dateien, kein Neuladen von Postfix mehr, etc. Zur Administration der MySQL Datenbank kannst Du web-basierte Tools wie phpMyAdmin verwenden, die auch in dieser Anleitung installiert werden. Der dritte Vorteil besteht darin, dass Benutzer eine E-Mail Adresse als Benutzernamen haben (anstelle eines Benutzernamens und einer E-Mail Adresse), was einfacher zu verstehen und zu behalten ist.
Diese Anleitung ist ein praktischer Leitfaden; theoretisches Hintergrundwissen wird nicht abgedeckt. Dies wird in zahlreichen anderen Dokumenten im Web behandelt.
Diese Anleitung ist ohne jegliche Gewähr! Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen – dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!
1 Vorbemerkung
Diese Anleitung basiert auf Debian Etch. Du solltest also eine Debian Etch Basisinstallation aufsetzen, bevor Du mit dieser Anleitung weiter machst. Das System sollte eine statische IP Adresse haben. In dieser Anleitung verwende ich 192.168.0.100 als meine Adresse und server1.example.com als den Hostnamen.
2 Installation von 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 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql
Dir werden ein paar Fragen gestellt:
Create directories for web-based administration ? <– No
General type of configuration? <– Internet Site
Mail name? <– server1.example.com
SSL certificate required <– Ok
3 Anbringen des Quota Patchs in Postfix
Wir müssen die Postfix Quellen beziehen, sie mit dem Quota Patch patchen, ein neues Postfix .deb Paket bauen und diese .deb Pakete installieren:
apt-get install build-essential dpkg-dev fakeroot debhelper libgdbm-dev libldap2-dev libpcre3-dev libssl-dev libsasl2-dev postgresql-dev po-debconf dpatch libdb4.3-dev libmysqlclient15-dev lsb-release libcdb-dev
cd /usr/src
apt-get source postfix
(Vergewissere Dich, dass Du die richtige Postfix Version in den folgenden Befehlen verwendest. Ich habe Postfix 2.3.8 installiert. Du bringst Deine Postfix Version in Erfahrung, indem Du dies ausführst
postconf -d | grep mail_version
Die Ausgabe sollte wie folgt aussehen:
server1:~# postconf -d | grep mail_version
mail_version = 2.3.8
milter_macro_v = $mail_name $mail_version
)
wget http://vda.sourceforge.net/VDA/postfix-2.3.8-vda.patch.gz
gunzip postfix-2.3.8-vda.patch.gz
cd postfix-2.3.8
patch -p1 < ../postfix-2.3.8-vda.patch
dpkg-buildpackage
Es kann sein, dass Du eine ähnliche Warnung wie diese am Ende des dpkg-buildpackage Befehls siehst:
(WARNING: Failed to sign .dsc and .changes file)
Du kannst diese Nachricht ignorieren.
Um unser neues Postfix Paket zu installieren, führen wir dies aus
cd ..
dpkg -i postfix_2.3.8-2_i386.deb
dpkg -i postfix-mysql_2.3.8-2_i386.deb
4 Erstelle die MySQL Datenbank für Postfix/Courier
MySQL wird standardmäßig ohne Root Passwort installiert, was wir sofort ändern (ersetze yourrootsqlpassword mit einem Passwort Deiner Wahl):
mysqladmin -u root password yourrootsqlpassword
Nun erstellen wir eine Datenbank mit der Bezeichnung 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 es mit Deinem eigenen Passwort), der SELECT,INSERT,UPDATE,DELETE Privilegien in der mail Datenbank hat. Dieser Benutzer wird von Postfix und Courier verwendet, um sich mit der Mail Datenbank verbinden zu können:
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 erstellen wir die 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 Dir vielleicht aufgefallen ist, haben wir mit dem quit; Befehl die MySQL Kommandozeile verlassen und befinden uns wieder in der Linux Kommandozeile.
Die domains Tabelle speichert jede virtuelle Domain, für die Postfix E-Mails erhalten soll (z.B. example.com).
domain |
example.com |
Die forwardings Tabelle ist für das Aliasing einer E-Mail Adresse mit der anderen zustänidg, z.B. leitet E-Mails für info@example.com an sales@example.com weiter.
source | destination |
info@example.com | sales@example.com |
Die users Tabelle speichert alle virtuellen Benutzer (das heißt E-Mail Adressen, da die Adressen und der Benutzername das Gleiche ist) und Passwörter (in verschlüsselter Form!) sowie einen Quota-Wert für jede Mail Box (in diesem Beispiel ist der Standardwert 10485760 bytes, das heißt 10MB).
password | quota | |
sales@example.com | No9.E4skNvGa. („secret“ in encrypted form) | 10485760 |
Die 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 gehe davon aus, dass die IP Adresse Deines Mail Server System 192.168.0.100 ist) kannst Du auf phpMyAdmin über http://192.168.0.100/phpmyadmin/ in einem Browser zugreifen und Dich als mail_admin anmelden. Dann kannst Du Dir die Datenbank ansehen. Späer kannst Du phpMyAdmin verwenden, um Deinen Mail Server zu verwalten.
5 Konfiguration von Postfix
Nun müssen wir Postfix mitteilen, wo es alle Informationen in der Datenbank finden kann. Dafür müssen wir sechs Textdateien 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 verwende, 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 /etc/mysql/my.cnf folgende Zeilen enthält:
vi /etc/mysql/my.cnf
[...] bind-address = 127.0.0.1 [...] |
Wenn Du /etc/mysql/my.cnf modifizieren musstest, starte MySQL jetzt bitte neu:
/etc/init.d/mysql restart
Führe dies aus
netstat -tap
um sicher zu gehen, dass MySQL auf 127.0.0.1 hört (localhost.localdomain):
server1:/usr/src# 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:mysql *:* LISTEN 3003/mysqld
tcp 0 0 *:sunrpc *:* LISTEN 1684/portmap
tcp 0 0 *:auth *:* LISTEN 2036/inetd
tcp 0 0 *:1522 *:* LISTEN 2077/rpc.statd
tcp 0 0 *:smtp *:* LISTEN 12053/master
tcp6 0 0 *:imaps *:* LISTEN 3839/couriertcpd
tcp6 0 0 *:pop3s *:* LISTEN 3629/couriertcpd
tcp6 0 0 *:pop3 *:* LISTEN 3572/couriertcpd
tcp6 0 0 *:imap2 *:* LISTEN 3792/couriertcpd
tcp6 0 0 *:www *:* LISTEN 3712/apache2
tcp6 0 0 *:ssh *:* LISTEN 2058/sshd
tcp6 0 148 server1.example.com:ssh ::ffff:192.168.0.2:4515 ESTABLISHED2139/0
Lass uns nun unsere sechs Textdateien 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 Berechtigunen 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 mit der Bezeichnung vmail mit dem Home Verzeichnis /home/vmail. Dort werden alle Mail Boxes abgelegt.
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m
Als Nächstes konfigurieren wir Postfix ein wenig. Pass auf, dass Du server1.example.com mit einem gültigen FQDN ersetzt, sonst funktioniert Dein Postfix 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_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‘