Mailserver
Mailserver
- Autor: Tim Pommerening
- Verwendete Distribution : Mandrake Linux 9.1
- Verwendeter Kern: 2.4.21-0.13mdk
Dieses Howto zeigt das Beispiel eines Mailserver-Aufbaus. Es wurde Mandrake Linux 9.1 verwendet. Bei der Konfiguration wurden allerdings keine Mandrake eigenen Konfigurationswerkzeuge benutzt, so dass das Howto für sämtliche Linux Distributionen nutzbar sein sollte.
Folgende Komponenten wurden verwendet:
- Postfix (MTA)
- CourierIMAP (IMAP und POP3 Server)
- Procmail (Mailfilter)
- Fetchmail (Abruf externer Mails)
- Spamassassin (Spamfilter)
Sämtliche hier aufgeführte Software ist Bestandteil der Mandrake Linux Distributionen und muss daher nicht unbedingt von den oben angegebenen Seiten bezogen werden.
Postifx
Postfix ist unser Mail-Transport-Agent und somit das Herzstück des Mailservers. Neben Postfix existieren auch andere bekannte MTAs, wie Sendmail oder Exim. Ich habe mich für Postfix entschieden, da es wohl einfacher zu konfigurieren, als der Dinosauerier Sendmail und ohnehin Teil der Mandrake-Distribution ist. Sämtliche Konfigurationsdateien für Postfix befinden sich unter /etc/postfix/.
-
Die Datei main.cf
Dies ist die Hauptkonfigurationsdatei für Postfix. Ein möglichst simpler und funktionierender Aufbau dieser Datei findet sich hier: ##### hier liegen die Postfix-Module
daemon_directory = /usr/lib/postfix
##### Besitzer der Prozesse, zwischengespeicherten Mails; nicht root verwenden
mail_owner = postfix
##### wie heisst unser Mailserver; evtl. habt ihr auf eurem DNS-Server ein Alias erstellt (e.g mail.domain)
myhostname = tyranus.de
##### die domain in der sicher der Mailserver befindet bzw. fuer welche er zustaendig ist
mydomain = tyranus.de
##### hostname bei der erzeugung neuer mails
myorigin = $mydomain
##### Interface, auf dem der Mailserver Mails entgegennimmt. Da er nicht im Internet steht:all
inet_interfaces = all
##### gibt an, an welche domain mails lokal ausgeliefert werden darf und wann sie den Rechner verlaesst
mydestination = $myhostname, localhost.$mydomain $mydomain
##### unser Netzwerk: Rechner aus diesem IP-Adressbereich duerfen den Mailserver nutzen
mynetworks = 10.0.0.0/16, 127.0.0.0/8
##### Domains fuer die, bzw von denen Postfix E-Mails relayed
##### Mailaliase
#alias_maps = hash:/etc/aliases
#:TIP: Disable NIS Lookups
alias_maps = $alias_database
##### Damit leiten wir eigenden und von Postfix abgearbeitete E-Mails an unser Procmail-Script weiter
mailbox_command = /usr/bin/procmail /home/imap/.procmailrc
##### der Name unseres Mailserver: erscheint im Header der E-Mail
mail_name = mailerdaemon(postfix)
Es gibt sicherlich fünf mal mehr Einstellungen, die man in der main.conf vornehmen kann. Der obige Ausschnitt erhält also nur die grundlegenden Einstellungen für Postfix mit denen ein Betrieb möglich ist.Falls die Datei /etc/aliases nicht existiert kann die Datei /etc/postfix/aliases dort hinkopiert werden. # newaliases Für Postfix gibt es nun folgene Befehle, um die Konfiguration zu überprüfen. Der erste prüft, ob die /etc/postfix/main.cf syntaktisch richtig ist. Der zweite gibt einfach die aktuelle Postfix Konfiguration aus. # postfix check # postconf Erhält man nach dem ersten Befehl eine ähnliche Fehlermeldung:
postfix/postfix-script: warning: /var/spool/postfix/etc/hosts and /etc/hosts differ,
so kommt das daher, dass Postfix aus Sicherheitsgründenchrooted läuft. Das heißt, Postfix wird in einem Gefängnis unter /var/spool/postfix ausgeführt. Das ist für Postfix das Root-Verzeichnis und es kann in kein Verzeichnis weiter oben wechseln. Man muss nun, um die Warnung abzustellen, die beiden Dateien, aus der Warnung entsprechend synchronisieren. Das heißt die ältere mit der neueren überschreiben, damit beide gleich sind. -
Die Datei master.cf
Diese Datei ist normalerweise auch bereits vorhanden und braucht erst einmal nicht verändert zu werden. Sollte die vorhandene Datei von der folgenden abweichen, so sollte man sie zuert einmal ungeändert lassen. # =============================================================
# service type priv unpriv chroot wakeup maxproc cmd + args
# (yes) (yes) (yes) (never) (100)
# =============================================================
smtp inet n - y - - smtpd
#smtps inet n - n - - smtpd
#628 inet n - n - - qmqpd
pickup fifo n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
#qmgr fifo n - n 300 1 qmgr
qmgr fifo n - y 300 1 nqmgr
#tlsmgr fifo - - n 300 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
# :TIP: Für SEHR genaues Logging verwenden wir wärend der Konfiguration die Option -v
smtp unix - - y - - smtp -v
relay unix - - y - - smtp
showq unix n - y - - showq
error unix - - y - - error
local unix - n n - - local
virtual unix - n y - - virtual
lmtp unix - - y - - lmtp
#localhost:smtp-backdoor inet n - n - - smtpd -o content_filter=
#
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# maildrop. See the Postfix MAILDROP_README file for details.
#
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
#
# The Cyrus deliver program has changed incompatibly, multiple times.
#
old-cyrus unix - n n - - pipe
flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
# Cyrus 2.1.5 (Amos Gouaux)
cyrus unix - n n - - pipe
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
Es ist nun noch wichtig, dass alle Email-Adressen, wenn sie denn über einen Provider verteilt werden sollen, einen gültigen Namen besitzen. Linux verwendet normalerweise als Absenderadresse, Adressen nach dem folgenden Schema. <username>@<hostname> Ist man als Benutzer user angemeldet auf dem Rechner Mars ergibt sich die Adresse user@mars, mit der ein externer Mailanbieter nichts anfangen kann. Es ist nun möglich, dass Postfix die Absendernamen in bekannte Nanem umwandelt. Dazu editiert man die Datei /etc/postfix/canonical und gibt vorne die lokale Adresse und dahinter die globale Adresse an: This e-mail address is being protected from spambots. You need JavaScript enabled to view it. This e-mail address is being protected from spambots. You need JavaScript enabled to view it. Nach dem Editieren wandeln wir die Datei ins Hashformat um, was man übrigens mit jeder Konfigurationsdatei für Postfix, die in der main.cf mit hash: beginnt, nach allen Änderungen machen muss. # postmap /etc/postfix/canonical Nun werden alle Mails, die als root über das Internet verschickt werden in eine Adresse umgewandelt, die dem Provider bekannt ist. -
SMTP mit Authentifikation
Da immer mehr Mail-Anbieter SMTP nur noch mit Authentifikation erlauben, ist es sinnvoll, diese auch zu betreiben.
Dafür wird die libasl7 Bibliothek benötigt, die normalerweise bereits installiert sein sollte. Allerdings ist es z.B. für SMTP-Auth bei dem Anbieter 1&1 notwendig, zusätlich ein Plugin zu installieren, welches Klartext-Authentifikation erlaubt. Dieses Plugin ist auch bestandteil der Mandrake Distribution. Der Paketname lautet libasl7-plug-plain.
Dieses Plugin kann z.B. über urpmi als RPM-Paket nachinstalliert werden. # urpmi libasl7-plug-plain Sollte man Probleme mit SMTP-AUTH haben und dies zuerst einmal weglassen wollen, so sollte man im nächsten Kapitel weiterlesen. Wer SMTP-AUTH verwenden möchte, muss zuerst in der Datei /etc/postfix/main.cf folgende Zeilen einfügen: ######################################################
# :TIP: SMTP AUTH
################################################
# IMMER ein EHLO senden
smtp_always_send_ehlo = yes
# SMTP mit SASL-Authentifikation verwenden
smtp_sasl_auth_enable = yes
# Die Paßwörter stehen in der Datei /etc/postfix/smtp_auth
smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth
# Zusatz-Optione: Keine anonyme Anmeldung verwenden
smtp_sasl_security_options = noanonymous
# Den Relayhost (bei 1&1 z.B.: auth.mail.onlinehome.de)
relayhost = auth.mail.onlinehome.de
Unter smtp_sasl_password_maps haben wir nun die Datei eingetragen, in der die Authentifikationsdaten stehen. Wir schreiben also unsere SMPT-Serverdaten in die Datei /etc/postfix/smtp_auth nach dem Muster: <auth-smtp-server-url> <benutzername>:<passwort> Nach dem speichern der Datei, geben wir ihr nur Lese- und Schreibrechte für root, da sie ja sensible Daten enthält. # chmod 600 /etc/postfix/smtp_auth Anschließend wandeln wir auch diese Datei ins Hashformat um. # postmap /etc/postfix/smtp_authFür weitergehende Informationen und Hilfen bezüglich SMTP-AUTH ist folgene Quelle sehr interessant und hilfreich: Postfix mit SMTP Auth absichern
-
Testlauf
Nun werden wir sehen, ob wir Postfix nicht zum Laufen bekommen. Es empfiehlt sich für alle weiteren Schritte, immer die Logfiles im Auge zu behalten. $ tail -f /var/log/syslog $ tail -f /var/log/maillog Bei meiner Distribution gibt es letzteres Logfile nicht für Postfix. Dafür gibt es aber die 3 Dateien. /var/log/mail/errors, /var/log/mail/info und /var/log/mail/warnings. Diese kann man auch zugleich abfragen. $ tail -f /var/log/mail/errors /var/log/mail/info \
/var/log/mail/warningsZuerst starten wir Postfix: # /etc/init.d/postfix start Anschließend versuchen wir eine E-Mail zu verschicken: $ mail <Eigene.Adresse@Eigene.Domain>
Subject: Testmail
Das ist eine Testmail
.
Dabei sollte man auf die Logfiles achten. Wenn alles geklappt hat, kommt die Mail nach kurzer Zeit an.
Courier IMAP
Courier IMAP ist die Komponente, die später im Mailclient als IMAP Server dient. Courier IMAP unterstützt auch das POP3 Protokoll, jedoch wird hier nur auf das in meinen Augen praktischere IMAP Protokoll eingegangen, dass es erlaubt, die Mails auf dem Server liegen zu lassen und mit verschiedenen Clients abzugleichen. Das Paket kann entweder über die Mandrake-Distribution mit urpmi oder direkt als .tgz Paket compiliert werden.
-
SSL-Zertifikat
Nach der Installation muss ein SSL-Zertifikat erzeugt werden, sofern das die Installationsroutine nicht selbst aufruft, gibt man folgenden Befehl ein: # /usr/lib/courier/imapd-ssl.rc Anschließend wechseln wir nach /etc/courier. Dort liegen die Konfigurationsdateien. Für uns wichtig sind authdeamonrc, imapd und imapd-ssl.
-
Die Datei authdeamonrc
Diese Konfigurationsdatei steuert die Kommunikation zwischen SMTP-Server und dem Auth-Deamon. Dieser gewährt oder verbietet den Mailversand über den SMTP-Server aufgrund von festlegbaren Regelkriterien. Die Konfigurationsdatei sollte folgendermaßen aussehen: #authmodulelist="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
authmodulelist="authuserdb"
#authmodulelistorig="authcustom authcram authuserdb authldap authpgsql authmysql authpam"
authmodulelistorig="authuserdb"
#Anzahl der laufenden Authentifizierungsdienste. Bei weniger als 20 Mailboxen sollte 1 ausreichen.
daemons=1
#Gibt es unterschiedliche authd-Versionen, kann man diese angeben. "" verwendet die erstbeste.
version=""
#Diese Variable sollte nicht verändert werden, da sie von mehreren Prozessen verwendet wird.
authdaemonvar=/var/run/authdaemon.courier-imap
Mehr Informationen zum auth-Deamon gibt es hier. -
Die Datei imapd
Wie üblich enthält diese Datei eine Fülle von Optionen. Ich gebe hier nur wieder die wichtigen an. Nachdem alles läuft kann man durch Verändern anderer Optionen sicher noch einiges optimieren. # Adresse, auf der CourierIMAP läuft. Standard ist 0.
ADDRESS = 0
# Port auf dem CourierIMAP lauscht. Standard ist 143.
PORT = 143
# Maximale Anzahl der zu startenden Server.
MAXDEMOINS = 20
# Maximale Verbindungen zur gleichen IP.
MAXPERIP = 20
Die letzten beiden Variablen müssen an jedes System angepasst werden. Je mehr Accounts man besitzt, desto mehr Verbindungen sollte man auch zu einer IP-Adresse hin zulassen. Die Anzahl der Demons kann bei mehr Postfächern (dazu zählen auch Unterordner) erhöht werden, um zwischen diesen schneller wechseln zu können. Das belegt natürlich entsprechend Ressourcen auf dem Server. Im Normalfall sollte dort ein Wert von 5 ausreichend sein. -
Die Datei imapd-ssl
Diese Konfigurationsdatei wird benötigt, wenn die Mails über SSL-Verschlüsselung abgerufen werden sollen. Auch hier gibt es wieder einiges an Einstellungsmöglichkeiten. Ich zeige nur die lebenswichtigen auf: # Der Port, auf dem IMPS über SSL lauscht. Standard ist 993.
SSLPORT = 993
# Die Adresse, auf der CourierIMAP in der SSL Version läuft. Standard ist 0.
SSLADDRESS = 0
-
Anlegen der IMAP-User und Accounts
Nun ist wieder Konsolen-Arbeit angesagt. Wir müssen nun die Umgebung für die Mails, also die Postfächer und Zugriffsrechte darauf anlegen. CourierIMAP verwendet das Prinzip der UserDB. Dabei erhält unser Imap Server ein eigenes Heimatverzeichnis, in dem sämtliche Postfächer abgelegt werden. Ein Postfach besteht standardmäßig aus folgenden 5 Verzeichnissen: cur, new, tmp, .Trash, .Sent. Später können wir auch über unseren Email-Client noch beliebige Ordner hinzufügen.
Fangen wir also an und erzeugen einen neuen User. # useradd -m -d /home/imap -s /bin/bash -p < \
testpasswort> imap Wir legen nun eine neue Datei namens /etc/userdb an und geben volle Rechte für ihren Besitzer. # touch /etc/userdb
# chmod 700 /etc/userdb
Nun rufen wir das Skript pw2userdb auf und konvertieren damit die Datei /etc/passwd in das userdb-Format. Den Inhalt schreiben wir in die /etc/userdb. # pw2userdb > /etc/userdb Nun öffnen wir /etc/userdb und entfernen alle Zeilen bis auf die, mit imap beginnt und die Folgezeile.
Dies sehen etwa folgendermaßen aus: imap uid=734|gid=734|home=/home/imap|shell=/bin/bash|systempw= \
$1$CZ8098x837$6iIo83TGlirCgAsvfDY0|gecos=IMAP Mailaccounts
734= imap
Wir vergewissern uns, ob auch nach dem Schreiben die /etc/userdb noch die Rechte 700 besitzt.
Nun erstellen wir die Postfächer. Als Beispielpostfach erstellen wir das Postfach tim. Für die Erstellung der Postfächer gibt es auf vielen Distributionen das Skript maildirmake oder maildirmake++. Sollte dieses nicht vorhanden sein, kann man es auch selbst schreiben. Hier ist der Code: #! /bin/sh
# maildirmake: Creates a maildir!
mkdir -p $1/new $1/cur $1/tmp && chmod -R 700 $1
Nun legen wir die Verzeichnisse an. $ su imap
$ cd
$ maildirmake tim
$ exit
Wir benötigen nun ein weiters Skript, welches ich auf meiner Distribution nicht gefunden habe. Daher auch hier der Code. #! /bin/sh
# maildiruser: Creats a mail-useraccount and sets the password
/usr/sbin/userdb "$1" set home=/home/imap mail=/home/imap/$1 uid=734 gid=734
/usr/sbin/userdbpw -md5 | /usr/sbin/userdb "$1" set imappw
/usr/sbin/makeuserdb
Die User-ID (hier 734) muss mit der User-ID des Benutzers imap übereinstimmen.
Nun wird das Script als root gestartet. # maildiruser tim Man wird dann aufgefordert, ein Passwort einzugeben. Dieses Passwort ist das spätere Passwort, welches man im E-mail Client eingeben muss, um seine Mails abrufen zu können. Daher sollte man es sich gut merken. Wenn alles geklappt hat, so steht in der Datei /etc/userdb eine neue Zeile, die mit tim beginnt. -
Testen von CourierIMAP
Nun sind wir bereit, um CourierIMAP zu starten. Sollte das Verzeichnis /var/run/courier-imap nicht existieren, muss es angelegt werden. Außerdem muss vor dem Start von CourierIMAP der Auth-Deamon bereits laufen. Nach einem Neustart kann es sein, dass das Verzeichnis erneut angelegt werden muss. # /etc/init.d/authd start
# /etc/init.d/courier-imap start


