Bonsailinse
  • Home
  • Impressum
  • Kontakt

Projekt: Neuer Server – Postfix + Dovecot

Keine Kommentare Kategorie: Technisches | Tags: Projekte, Server | 12. Januar 2012

Projekt: Neuer Server

Teil 1: Einleitung
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:

Postfix um Mails aus dem Internet zu ziehen und den ganzen Basiskram zu erledigen
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.

Achtung: Hier wird ein FQDN (Fully Qualified Domain Name) benötigt.
Der Hostname eures Servers sollte hoffentlich aus so einem bestehen.
Dies ist nicht einfach nur eure Domain, sondern, salopp gesagt, inklusive einer Subdomain. Typischerweise bietet sich server.bonsailinse.net oder ähnliches an. Überprüfen könnt ihr das übrigens mit ‘hostname -f‘

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
Achtung: Ich verwende für die Anzeige von MySQL-Queries das Präfix ‘>‘, um zu verdeutlichen, dass wir uns in der Datenbank befinden (wie sonst die Raute ‘#‘ für die Eingabe in der Shell).
Bitte kopiert das Zeichen nicht mit, es gehört nicht zu dem Query!
> 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 email 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
Vorsicht! Achtet darauf, dass die zweite Zeile eingerückt sein muss! Außerdem gehört das nach dem $ noch ein die zweite Zeile, die Zeile ist einfach nur zu lang für mein Blog.
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
An dieser Stelle habe ich persönlich meinen Server neugestartet.
Nach so vielen neu installierten Programmen und geänderten Konfigurationen ist das gar keine so schlechte Idee, um sicherzustellen, dass alles von jedem angenommen wurde. Außerdem sieht man in den Logfiles des Servers, ob alles einwandfrei gestartet werden konnte.

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
Ich persönlich nutze für die eMail-Adresse des Serveradmins IMAPs, SMTP läuft bei mir weiterhin unverschlüsselt, da ich dort immer wieder auf Probleme mit diversen Mailprogrammen stoße.
Solltet ihr dort also Probleme bekommen, kann ich euch leider nicht helfen.
IMAPs und POP3s sollten aber einwandfrei funktionieren.
Twitter das!
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 ...

Das könnte dich auch interessieren

  • Bash: Eine schönere History
    Bash: Eine schönere History14. Januar 2012
  • Projekt: Neuer Server – MySQL + phpMyAdmin
    Projekt: Neuer Server – MySQL + phpMyAdmin7. Januar 2012
  • Projekt: Neuer Server – nginx + php-fpm
    Projekt: Neuer Server – nginx + php-fpm6. Januar 2012
← Projekt: Neuer Server – MySQL + phpMyAdmin
Bash: Eine schönere History →

Eine Antwort schreiben

Hier klicken, um die Antwort abzubrechen.

Connect with Facebook


Kommentar schreiben

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

Beliebte Posts

  • StarCraft II Beta-Key zu vergeben [Update]
    StarCraft II Beta-Key zu vergeben [Update] 6. Mai 2010
  • Humble Bundle [Gewinnspiel] [2x Update]
    Humble Bundle [Gewinnspiel] [2x Update] 18. August 2011
  • Blog. Neu. Freakin Design. Penis.
    Blog. Neu. Freakin Design. Penis. 8. Juni 2011

Tag-Wolke

#fail #followerpower 10 Dinge Age of Empire III App Arkham Horror asuROCKS Auto-Update Autobahn Backup BBB Blinse Blog BlogBlume Blogroll Blondinen bueltge.de Canabalt Conway Cthulhu Cutiepies Life Daheim Design Döner Feiertag Gewinnspiel Humphrey iPhone Katzen Performance PieEmpire Pink Fluffy Polizei Projekte Redesign Sasha Schnee Server Silvester Trigami Twitter Umzug Webhosting Weihnachten Winter

Beliebte Artikel

  • StarCraft II Beta-Key zu vergeben [Update]
    StarCraft II Beta-Key zu vergeben [Update] 6. Mai 2010
  • Humble Bundle [Gewinnspiel] [2x Update]
    Humble Bundle [Gewinnspiel] [2x Update] 18. August 2011
  • Blog. Neu. Freakin Design. Penis.
    Blog. Neu. Freakin Design. Penis. 8. Juni 2011
  • KKK: Kreative Kredit-Karte
    KKK: Kreative Kredit-Karte 7. Januar 2010

Blogroll

  • asuROCKS Art, Gal Style and Uber Cute Stuff!
  • Beetlebum Eine autobiografische Online Graphic Novel von Johannes Kretzschmar.
  • BlogBlume Ricarda berichtet von ihrem ganz normalen Chaos, und dem Versuch, es zu sortieren.
  • bueltge.de [by:ltge.de] Frank Bültge gibt exzellente Tips, was man so aus WordPress herausholen kann.
  • Cutiepies Life CutiePie über sich und ihr neugewonnenes Einwandererleben als Exil-Österreicherin.
  • Freak Desu Elizra über ihren Alltag, ihre Vorliebe für alles Japanische und ihre sonstigen Hobbies.
  • Oldschool Herr $oldschool berichtet über Kundenlust und -Frust im Elektronikladen.
  • Outer Heaven EvilPie und das Leben eines Kuchens.
  • PinkFluffy Pink Fluffy berichtet in ihrem Blog über ihren pinken Alltag.
  • Stephness Die Katzenmafia schlägt zurück!
  • UARRR Marcel übt sich in gekonnter Selbstprofilierung. Sonst nichts. Jawoll.
© 2011 Bonsailinse.net.