Projekt: Neuer Server – Postfix + Dovecot
Projekt: Neuer Server
Teil 2: Erste Schritte
Teil 3: nginx + php-fpm
Teil 4: MySQL + phpMyAdmin
Teil 5: Postfix + Dovecot
Teil 6: [in Planung]
Teil 7: [in Planung]
Teil 8: Der Abschluss
Zuerst: Backup erneuern. Damit heißt meines nun 2012.01.10_02:26 und ist 512.76 MB groß.
Inzwischen haben wir einen funktionierenden Webserver, der mit allen grundlegenden Dingen umgehen kann. PHP in Verbindung mit MySQL kann also nun ohne Probleme genutzt werden.
Im Prinzip könnten wir jetzt unsere vHosts anlegen und beginnen, unsere Webprojekte hochzuladen, das werde ich jedoch noch nicht tun, da ich das Einpflegen von Daten (außer für Funktionalitätstests) erst ganz am Ende durchführe, um eine gewisse Routine zu entwickeln.
Immerhin möchte ich nicht jetzt vHosts anlegen, dann erstmal wieder was installieren, dann für die entsprechenden vHosts die Mailadressen anlegen… alles in einem Rutsch gefällt mir da doch besser.
Außerdem kann ich mir dann sogar vielleicht noch ein paar Skripte schreiben, um mir die Arbeit in Zukunft noch etwas zu vereinfachen.
Nun wollen wir unserem Server erstmal beibringen, mit eMails umzugehen. Der Plan sieht so aus:
Dovecot um Mails auf dem Server zu speichern und sie dem User via Pop3 / IMAP zugänglich zu machen
MySQL um Domains, Useraccounts und Forwarding-Regeln zu verwalten
AMaViS zum Scannen eingehender Mails mit Hilfe von ClamAV und SpamAssassin
Clam Antivirus für einen Virus-Check
SpamAssassin für die Einordnung von Spam
evtl. Roundcube als Webmail-Lösung, falls es nötig werden sollte.
Los geht’s.
Wir installieren alle erforderlichen Pakete:
# apt-get install postfix postfix-mysql
Wählt im Assistenten zunächst ‘Internet-Site‘ aus, danach gebt den FQDN eures Servers an.
Sollte euer Debian nicht ganz so minimal sein wie ihr dachtet, hat es vielleicht standardmäßig exim4 als Mailservice installiert. Ihr solltet zur Vorsicht einfach den Befehl hier durchlaufen lassen, um es zu deinstallieren, sollte es vorhanden sein:
# apt-get --purge remove 'exim4*'
Installieren von Dovecot und, testweise, Roundcube. Dann noch den Shell-IMAP-Client mutt, den wir später gut zum testen nutzen können.
# apt-get install dovecot-pop3d dovecot-imapd # apt-get install roundcube # apt-get install mutt
Dann fangen wir mal an unsere Datenbank vorzubereiten. Wer will, kann dies in phpMyAdmin machen, muss dafür meine Konsolenbefehle entsprechen anpassen. Ich werde der Einfachheit halber sämtliche SQL-Queries in der Shell durchführen.
Wir erstellen zu Anfang die Datenbank, die ich hier einfach mal ‘mailserver‘ nenne. Wir werden nach dem root-Kennwort gefragt, welches wir bei der Installation von MySQL angegeben haben:
# mysqladmin -p create mailserver
Nun loggen wir uns in die Datenbank ein und erstellen einen neuen Benutzer. Postfix benötigt definitiv keinen root-Zugriff auf unsere Datenbanken
Ich wähle als Benutzer hier ‘mailuser‘ und als Kennwort ‘mailpass‘. Bitte wählt euer Kennwort sorgfältiger aus:
# mysql -p mailserver
> GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailpass';
Nun haben wir einen User für Postfix, der ausschließlich Leserechte für unsere Mail-Datenbank besitzt.
Möchten wir später Datensätze anlegen oder ändern, müssen wir uns einen weiteren User mit Schreibrechten anlegen oder den root-User nutzen.
Nun erstellen wir unsere Tabellen für virtuelle Domains, virtuelle User und virtuelle Aliases. Alles, was man eben so benötigt, um später vernünftig mit Mails umgehen zu können:
> CREATE TABLE `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
> CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(32) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
> CREATE TABLE `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Damit wir nicht ganz dumm sterben zeige ich euch mal anhand von ein paar Testdaten die Struktur unserer Tabellen:
virtual_domains:
| id | name | ||
|---|---|---|---|
| 1 | example.com | ||
| 2 | example.net |
virtual_users:
| id | domain_id | password | |
|---|---|---|---|
| 1 | 1 | user1@example.com | hd7wo93n64 |
| 2 | 1 | user2@example.com | j3bh1n0d74 |
| 3 | 2 | user3@example.net | o30bq4lh5z |
virtual_aliases:
| id | domain_id | source | destination |
|---|---|---|---|
| 1 | 1 | user2@example.com | user2@web.de |
| 2 | 2 | user3@example.net | user3@gmx.net |
| 3 | 2 | user3@example.net | user3@gmail.com |
Durch die virtual_aliases Werden nun alle Mails an user2@example.com an user2@web.de weitergeleitet.
Analog jede Mail, die an user3@example.net geht an user3@gmx.net sowie user3@gmail.com.
Hierfür werden zwei Einträge in die Datenbanktabelle eingetragen.
Nun füttern wir unsere Datenbank mit den ersten Einträgen, damit wir später testen können, ob unsere Konfigurationen auch funktionieren.
In meinem Beispiel füge ich die Domain ‘bonsailinse.net‘ ein, einen User ‘mail@bonsailinse.net‘ mit Kennwort ‘vollgeheim‘ und zusätzlich noch eine Weiterleitung aller Mails an ‘admin@bonsailinse.net‘ nach ‘mail@bonsailinse.net‘:
> INSERT INTO `mailserver`.`virtual_domains` ( `id` , `name` ) VALUES ( '1', 'bonsailinse.net' );
> INSERT INTO `mailserver`.`virtual_users` ( `id` , `domain_id` , `password` , `email` ) VALUES ( '1', '1', MD5( 'vollgeheim' ) , 'mail@bonsailinse.net' );
> INSERT INTO `mailserver`.`virtual_aliases` ( `id`, `domain_id`, `source`, `destination` ) VALUES ( '1', '1', 'admin@bonsailinse.net', 'mail@bonsailinse.net' );
Nun beenden wir MySQL und dann bringen wir Postfix bei, wo in unseren Datenbanken es unsere virtuellen Domains, User und Aliase finden kann:
> exit # nano /etc/postfix/mysql-virtual-mailbox-domains.cf
user = mailuser
password = mailpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
Damit Postfix Bescheid weiß, kriegt er die Config eingelesen:
# postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Das Ganze wird dann fix getestet, bei einem geglückten Mapping sollte eine ‘1‘ als Rückmeldung kommen:
# postmap -q bonsailinse.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
Das selbe Spiel nochmal für das Mapping der Mailboxen und der Aliase:
# nano /etc/postfix/mysql-virtual-mailbox-maps.cf
user = mailuser
password = mailpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
# postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Testen:
# postmap -q mail@bonsailinse.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
# nano /etc/postfix/mysql-virtual-alias-maps.cf
user = mailuser
password = mailpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'
# postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Testen, diesmal müsste ‘mail@bonsailinse.net‘ als Zieladresse ausgegeben werden:
# postmap -q admin@bonsailinse.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Phew. Kurze Verschnaufpause.
Jetzt sehen wir zu, dass nur die User ‘root’ und ‘postfix’ auf unsere Konfigurationfiles zugreifen können:
# chgrp postfix /etc/postfix/mysql-*.cf # chmod u=rw,g=r,o= /etc/postfix/mysql-*.cf
Für die Konfiguration von Dovecot erstellen wir zunächst einen neuen Systemuser, der in Zukunft für den ganzen Mailkram zuständig sein wird. Ich wähle hier den User ‘vmail‘ mit der User-ID 5000 und die Gruppe ‘vmail‘ mit der Gruppen-ID 5000. Achtet darauf, dass die IDs noch nicht anderweitig belegt sind. Ihr könnt jede ID zwischen 1000 und 65000 nutzen, solange sie noch nicht verwendet wird (siehe ‘cat /etc/passwd‘).
Dann noch die Rechte für unser zukünftiges Mail-Verzeichnis setzen:
# groupadd -g 5000 vmail # useradd -g vmail -u 5000 vmail -d /var/vmail -m # chown -R vmail:vmail /var/vmail # chmod u+w /var/vmail
Dann fangen wir mal an Dovecot zu konfigurieren:
# nano /etc/dovecot/dovecot.conf
Die erste Zeile definiert die Protokolle, die gestartet werden sollen. Hier könnt ihr bei Bedarf bspw. die unsicheren Varianten ohne ‘s‘ rauslöschen oder ausschließlich IMAP aktivieren.
Die zweite Zeile steht standardmäßig auf ‘yes‘, was sicherheitstechnisch auch super ist, allerdings kann es passieren, dass ihr unter der Verwendung diverser Mailprogramme diese Einstellung auf ‘no‘ setzen müsst:
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = no
Mit folgender Zeile teilen wir Dovecot mit, wo die Mailboxen unserer User liegen.
Mit der folgenden Konfiguration befinden sie sich stets unter /var/vmail/DOMAIN/USER/Maildir und liegen im maildir Format vor:
mail_location = maildir:/var/vmail/%d/%n/Maildir
In der Sektion ‘auth default‘ sollten wir dem Part ‘mechanisms‘ die Methode ‘login‘ hinzufügen:
mechanisms = plain login
Damit Dovecot weiß, wo sich die Zugangsdaten der User befinden, suchen wir die Sektionen ‘passdb sql‘ und ‘userdb static‘ und sehen zu, dass sie folgendermaßen ausschauen:
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb static {
args = uid=5000 gid=5000 home=/var/vmail/%d/%n/Maildir allow_all_users=yes
}
Achja, wir sollten vielleicht noch die Sektion ‘passdb pam‘ auskommentieren (achtet auf die abschließende, geschwungene Klammer!), da Dovecot sonst auch nach lokalen Usern Ausschau hält, was uns nur unsere Logfiles mit Fehlern zumüllt.
Wir suchen die Sektion ‘socket listen‘ und bearbeiten sie wie folgt:
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
Ähnliches Spiel mit der Sektion ‘protocol lda‘, wobei ihr hier eine Mail-Adresse eintragen solltet, unter der ihr als Admin des Servers erreichbar seid:
protocol lda {
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = admin@bonsailinse.net
mail_plugins = sieve
log_path =
}
Wenn ihr den log_path leer lasst, landen eure Logs zusammen mit anderen eMail-relevanten Logs in /var/log/mail.log. Definiert ihr hier einen anderen Pfad könnt ihr eventuell falsch konfigurierten Filtern oder ähnlichem auf die Schliche kommen.
Wir schließen die Datei und kümmern uns um die nächste Config:
# nano /etc/dovecot/dovecot-sql.conf
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailpass
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Dovecot neustarten und noch schnell die Rechte vernünftig setzen:
# /etc/init.d/dovecot restart chgrp vmail /etc/dovecot/dovecot.conf chmod g+r /etc/dovecot/dovecot.conf chown root:root /etc/dovecot/dovecot-sql.conf chmod go= /etc/dovecot/dovecot-sql.conf
Wir müssen Postfix dazu bringen mit Dovecot zu sprechen und fügen folgende Zeilen der Konfiguration von Postfix hinzu:
# nano /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
Dann Postfix neustarten und die Konfiguration einlesen lassen:
# postfix reload # postconf -e virtual_transport=dovecot # postconf -e dovecot_destination_recipient_limit=1
Dann testen wir mal, ob Mails auf dem Server ankommen.
Folgende Zeilen geben uns zuerst einen Überblick, ob der Speicherort der zukünftigen Mails erreichbar ist (das Verzeichnis sollte zunächst nahezu leer sein), dann senden wir eine Testmail und überprüfen im Anschluss, ob sich eine Verzeichnisstruktur aufgebaut hat:
# find /var/vmail # echo test | mail mail@bonsailinse.net # find /var/vmail
Sollte etwas schiefgegangen sein lohnt sich ein Blick in ‘/var/log/mail.log‘.
Ein weiterer Test stellt fest, ob bspw. IMAP funktioniert. Evtl. werdet ihr aufgefordert, einer Erstellung des Verzeichnisses /root/Mail zuzustimmen und etwaige SSL-Zertifikate zu akzeptieren. Einfach zustimmen. Wenn ihr eure Testmail einsehen könnt ist das schonmal ein sehr gutes Zeichen. Mit ‘q‘ beendet ihr Mutt:
# mutt -f imap://mail@bonsailinse.net@localhost
Dann stellen wir mal fix unseren SMTP so ein, dass er nur eMails von authentifizierten Usern annimmt. Dies ist schön einfach, da Postfix die Logindaten von den in Dovecot hinterlegten Usern mit nutzen kann:
# postconf -e smtpd_sasl_type=dovecot # postconf -e smtpd_sasl_path=private/auth # postconf -e smtpd_sasl_auth_enable=yes # postconf -e smtpd_recipient_restrictions="permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
An dieser Stelle erstelle ich mir SSL-Zertifikate, die natürlich nicht als “vertrauenswürdig” eingestuft werden. Wenn ihr Zertifikate zum Beispiel bei StartSSL erstellt habt oder gar eines gekauft habt, wisst ihr sicherlich auch, wie ihr sie einfügt.
Ansonsten hier die Vorgehensweise für selbst signierte Zertifikate.
Wichtig ist, dass ihr bei der Erstellung bei ‘common name‘ exakt die Domain eingebt, mit der sich die User einloggen sollen. Soll dies also ‘mail.example.com‘ sein, gehört genau dies dort rein.
# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.pem # chmod o= /etc/ssl/private/dovecot.pem # /etc/init.d/dovecot restart # openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem # chmod o= /etc/ssl/private/postfix.pem # postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem # postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem
