Postfix
Dieses Buch steht im Regal EDV.
Zusammenfassung des Projekts
[Bearbeiten]- Zielgruppe:
- Lernziele:
- Buchpatenschaft/Ansprechperson: Zur Zeit niemand, das Buch darf gerne übernommen werden.
- Sind Co-Autoren gegenwärtig erwünscht? ja, sehr gerne.
Postfix
[Bearbeiten]Vorbemerkungen
[Bearbeiten]Dieses Buch erklärt beispielhaft die Einrichtung eines Postfix-Mailservers auf Basis von Debian Linux in der Version 3.1 (Sarge) aus dem Jahre 2005. Dies resultiert aus der starken Verbreitung von Debian sowie aus der Aktualität der verwendeten Version beim Erstellen dieses Buches.
Die Installation sowie einige Konfigurationsschritte können bei anderen Distributionen abweichen und müssen entsprechend angepasst werden.
Allgemeines
[Bearbeiten]Sofern Sie beabsichtigen einen Mailserver nur für sich zu betreiben, dann haben Sie die Wahl zwischen Postfix, Qmail oder einem der anderen unzähligen Mailserver, die es derzeit gibt. Sollten Sie aber beabsichtigen einen Mailserver mit Web-Oberfläche z.B. für ihren Fußballverein oder ihre Firma anzubieten, dann werden Sie recht schnell mit den traditionellen Methode an ihre Grenzen stoßen. Hier ist eine schnelle, sichere Einrichtung eines Mailservers geboten, der obendrein noch gut zu warten ist und bei dem jederzeit „neue“ Module wie Virenscanner oder Spam-Filter nachinstalliert werden können.
In diesem Projekt werden wir einen Postfix-Mailserver erstellen, der seine gesamte Verwaltungsinformationen für Benutzer, Domains und Weiterleitungen in einer MySQL-Datenbank ablegt, die zudem noch gut zu pflegen ist und den höchsten Ansprüchen der Zeitersparnis genügt.
Ziel
[Bearbeiten]Sofern Sie beabsichtigen für eine größere Anzahl von Usern E-Mail-Accounts einzurichten, dann haben Sie sich bestimmt schon gefragt, wie große E-Mail-Provider mit der Flut an Kundendaten ruhig und gewissenhaft umgehen können. Um uns diese Erkenntnis im Umgang mit E-Mail auch zu ermöglichen, greifen wir auf Postfix zurück. Zusätzlich bietet Postfix nicht nur die Möglichkeit die Daten der User in einem Textfile abzulegen sondern auch die Userdaten in einer Datenbank zu speichern. Wir werden hierfür die bereits bekannte und hier vorgestellte MySQL-Datenbank verwenden. Außerdem wollen wir unseren Usern noch die folgenden Funktionen für deren E-Mail-Postfächer zur Verfügung stellen:
- Die Möglichkeit mit dem bisher bestehenden Client (Kmail oder Outlook) die E-Mails via POP3/IMAP abzuholen
- Die einfache Möglichkeit sich die E-Mail über einen Webzugang im Web-Browser anzeigen zu lassen
- Die E-Mails vor der Zustellung in die Postfächer nach Viren zu scannen
- Und Last but not Least: die E-Mails ebenfalls vor dem Zustellen in die Postfächer noch einem SPAM-Filter vorzulegen, der ggf. bekannte SPAM-Mails herausfiltert.
Erforderliche Vorbereitungen
[Bearbeiten]- Eine SQL-Datenbank: Hier bietet sich die freie Datenbank MySQL oder PostgreSQL an.
- SMTP-, POP3-, IMAP-Dienste: Hierfür bietet sich Postfix und die Courier-Paketfamilie an
- Postfix
Schritt für Schritt zum eigenen Mailserver
[Bearbeiten]Schritt 1
[Bearbeiten]Installation der erforderlichen Debian-Pakete mit dem apt-get-Befehl.
Die Installation der Postfix-Binary-Pakete mit apt-get sollte eigentlich nicht schwer sein. Hierzu gibt es je nach Distribution fertige Pakete, die Sie mit einem einfachen Befehl über das Paketmanagement installieren. Es könnte sein, dass Sie in ihrer Distribution noch die Quellen für Postfix in der Version 1.xx haben. Sollten Sie den Postfix in der neueren Version installieren wollen, dann fügen Sie die folgenden Zeilen ihrer sourceslist hinzu.
# vi /etc/apt/sources.list deb http://www.backports.org/debian sarge-backports main contrib non-free
# apt-get update
Updated: 03.10.2006 APT-Pinning ( http://www.backports.org/dokuwiki/doku.php?id=instructions )
# vi /etc/apt/preferences
Package: PAKETNAME (z.B. postfix) Pin: release a=sarge-backports Pin-Priority: 999
Bei unserem Debian-Server ist es der Befehl:
# apt-get install postfix Reading Package Lists... Done Building Dependency Tree... Done Suggested packages: postfix-mysql postfix-pgsql postfix-ldap postfix-pcre The following NEW packages will be installed: postfix 0 upgraded, 1 newly installed, 0 to remove and 32 not upgraded. Need to get 0B/611kB of archives. After unpacking 1688kB of additional disk space will be used. Preconfiguring packages ... Selecting previously deselected package postfix. (Reading database ... 76108 files and directories currently installed.) Unpacking postfix (from .../postfix_2.0.16-4_i386.deb) ... Adding `diversion of /usr/share/man/man8/smtpd.8.gz to /usr/share/man/man8/smtpd.real.8.gz by postfix' Setting up postfix (2.0.16-4) ... Postfix was not set up. Start with cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf If you need to make changes, edit /etc/postfix/main.cf (and others) as needed. To view Postfix configuration values, see postconf(1). After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.
Oben wird auch das Paket Postfix für PostgreSQL-, LDAP- und PCRE-Unterstützung installiert. Falls Sie dies nicht wünschen, lassen Sie diese Pakete weg.
Installieren Sie mit dem gleichen Befehl auch noch folgende Pakete:
- Postfix-mysql, Postfix-doc
- Mysql-client, Mysql-Server (sofern noch nicht auf dem System vorhanden)
- Courier-Authdaemon (courier-authlib-mysql), Courier-authmysql, Courier-POP, Courier-POP-ssl, Courier-imap, Courier-imap-ssl
- Postfix-TLS, Libasl-modules-plain, sasl-bin, libpam-mysql, openssl
- Spamkiller und Virenscanner
- sqwebmail
- phpmyadmin (optional)
Postfix ist nun installiert, aber noch nicht konfiguriert. Debian hat außerdem die Pakete postfix-mysql, postfix-pgsql, postfix-ldap und postfix-pcre installiert. Bitte beachten Sie an dieser Stelle, dass Sie alle anderen MTA (Mail Transport Agents) stoppen, damit diese nicht in irgendeiner Form dazwischen funken.
Außerdem hat Debian für Sie schon die folgenden Daten angelegt:
Das Verzeichnis /etc/postfix - Hier befinden sich die Konfigurationsdateien von Postfix, insbesondere ist hier die master.cf zu erwähnen. Außerdem sind dort noch die folgenden Files untergebracht.
access master.cf postfix-files relocated canonical pcre_table postfix-script transport dynamicmaps.cf post-install regexp_table virtual
Auf diese werden wir im weiteren Verlauf noch eingehen.
Die Datei /etc/init.d/postfix – Die Startdatei, um Postfix zu starten
Das Verzeichnis /usr/lib/postfix – Hier findet man die Module von Postfix, sowie die erforderlichen Unterprogramme
bounce error local pickup qmgr smtp trivial-rewrite cleanup flush master pipe qmqpd smtpd virtual dict_tcp.so lmtp nqmgr proxymap showq spawn
/usr/sbin/postfix – In diesem Verzeichnis finden Sie das Postfix Master Programm
/etc/rc2.d/ - Dort befindet sich das Start Skript (S20postfix), welches Postfix beim Erreichen des Level2 startet. Es handelt sich hierbei um ein Skript, das von S20postfix auf ../init.d/postfix verweist.
Also wenn wir unserem System trauen, dann startet unser Server den MTA Postfix auf Level2 und beendet den MTA beim herunterfahren auf Level1.
Der Start schlägt jedoch fehl, solange in /etc/postfix/ die main.cf fehlt. Diese können wir uns von der Beispielkonfiguration kopieren.
cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
Alternativ nutzt man den Befehl dpkg-reconfigure postfix, der uns mittels eines Dialog-Menüs die initiale Konfiguration für uns erstellt.
Schritt 2
[Bearbeiten]Bild
Schritt 3
[Bearbeiten]Bild
Schritt 4
[Bearbeiten]Bild
Schritt 5
[Bearbeiten]Bild
Das Ergebnis können Sie sich in der /etc/postfix/main.cf anschauen: Betrachten Sie auch das File /usr/share/postfix/main.cf.dist , eine auführlich dokumentierte Version:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h
myhostname = localhost alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = mobil, localhost, localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = +
Die Datenbank mit den Verwaltungs- & Userdaten erstellen
[Bearbeiten]Verbinden Sie sich zur Datenbank (MySQL) oder benutzen Sie PhpMyAdmin um die nachfolgenden Datenbanken anzulegen und die nachfolgenden Daten einzugeben.
$ mysql -u Peter -h localhost -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 7 to server version: 4.0.18-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database mail -> ; Query OK, 1 row affected (0.06 sec)
mysql> use mail; Database changed
Zuerst legen Sie mit dem Befehl CREATE DATABASE [Datenbankname] eine Datenbank an, in der die Daten gespeichert werden können.
mysql> create table maildomains( -> domain varchar (75) NOT NULL, -> PRIMARY KEY (domain), -> UNIQUE KEY domain (domain)) -> TYPE=MyISAM;
Danach legen Sie die Tabelle Maildomains in der soeben erstellten Datenbank mail an.
mysql>CREATE TABLE users ( -> email varchar (80) NOT NULL, -> password varchar (20) NOT NULL, -> UNIQUE KEY email (email)) -> TYPE=myISAM;
In der soeben erstellten Tabelle Users sollen später dann die Informationen über E-Mail-Adresse und Passwort der Benutzer abgelegt werden. Diese werden wir später mit Leben füllen.
Da Sie natürlich auch User haben werden, die die E-Mails an einen anderen Account weitergeleitet bekommen wollen, sollten Sie diese ebenfalls berücksichtigen. Hierzu legen Sie am besten eine zusätzliche Tabelle an.
mysql> CREATE TABLE weiterleitung ( -> qaccount varchar (80) NOT NULL, -> zaccount BLOB NOT NULL, -> PRIMARY KEY (qaccount) ) -> TYPE=MYISAM;
Postfix mitteilen, wo er Userinformationen finden kann
[Bearbeiten]/etc/postfix# touch mysql-virtual_weiterleitung.cf mysql-virtual_mailboxes.cf mysql_virtual_email2email.cf mysql_virtual_catchall.cf
Der User Mailsystem – als Pseudo-User
[Bearbeiten]Sollten Sie viele User anlegen müssen, dann haben Sie auch entsprechend viele Postfächer zu verwalten. Mit einem virtuellen User-Mailsystem können Sie es sich ersparen, für jedes Postfach eine eindeutige UserID erstellen zu müssen.
mobil:/etc/postfix# groupadd -g 5000 mailsystem mobil:/etc/postfix# useradd -g mailsystem -u 5000 mailsystem -d /home/mailsystem -s /bin/false -m
Postfix konfigurieren
[Bearbeiten]Nun sollten Sie die Postfix-Konfigurationsdatei im Verzeichnis /etc/postfix/main.cf an ihre Bedürfnisse anpassen:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no relay_domains = $mydestination, # Pfad, der vor die Mailbox des User gestellt wird virtual_mailbox_base=/home/mailsystem #Die NutzerId zum Abspeichern der Mails virtual_uid_maps=static:5000 virtual_gid_maps=static:5000 #virtual_uid_maps=hash:/etc/postfix/ids.mysql #virtual_gid_maps=hash:/etc/postfix/ids.mysql # Pfad zu maildir virtual_mailbox_maps=mysql:/etc/postfix/mysql-virtual_mailboxes.cf virtual_alias_maps=mysql:/etc/postfix/mysql-virtual_weiterleitung.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf virtual_mailbox_domains=mysql:/etc/postfix/mysql-virtual_maildomains.cf #minimale uid, die zum Postholen erlaubt ist virtual_minimum_uid = 5000 #appending .domain is the MUA's job. append_dot_mydomain = no #uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h myhostname = mobil.homelinux.org alias_maps = hash:/etc/aliases.db alias_database = hash:/etc/aliases.db mydestination = mobil.homelinux.org, localhost, localhost.localdomain, localhost.localhost relayhost = mynetworks = 127.0.0.0/8, 192.168.0.0/24 mail_owner = postfix mailbox_command = procmail -a "$EXTENSION" mailbox_size_limit = 0 recipient_delimiter = #### SMTP Einträge ### smtp_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_recipient_restrictions=permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_use_tls = yes smtpd_tls_cert_file = /etc/postfix/sasl/smtpd.cert smtpd_tls_key_file = /etc/postfix/sasl/smtpd.key
7.Schritt: SMTP-Authentifizierung konfigurieren
Zunächst erstellen Sie für die Konfigurationsdatei smtp.conf ein Verzeichnis unterhalb des /etc/postfix Verzeichnisses. Erstellen Sie nun in diesem Verzeichnis die smtpd.conf Datei mit folgendem Inhalt:
pwcheck_method: auxprop auxprop_plugin: sql mech_list: plain login cram-md5 digest-md5 sql_engine: mysql sql_hostname: localhost sql_user: Peter sql_passwd: test sql_database: mail sql_select: select password from users where email='%u@%r'
#cd /etc/postfix/sasl/ #openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 265 -x509
Mit diesem Befehl erstellen Sie das Zertifikat, welches zuvor in der main.cf angegeben wurde.
Generating a 2048 bit RSA private key .................+++ ...................+++ writing new private key to 'smtpd.key' -----
Beim Erstellen des Zertifikats werden Sie aufgefordert, einige Angaben zu machen, die dann in das Zertifikat gespeichert werden. Sie werden aufgefordert einen DN ("Distinguished Name") sowie weitere Angaben zu machen, von denen Sie jedoch einige leer lassen können. Es gibt für einige Felder einen Standardwert. Wenn Sie ein Feld leer lassen wollen, so geben Sie einen '.' ein.
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:RheinlandPfalz
Locality Name (eg, city) []:Koblenz
Organization Name (eg, company) [Internet Widgits Pty Ltd]: example.com
Organizational Unit Name (eg, section) []:Bucherstellung
Common Name (eg, YOUR name) []:Peter Example
Email Address []: sample@example.org
Danach sollten sich in dem neu erstellten Verzeichnis die folgenden Dateien befinden:
smtpd.cert smtpd.conf smtpd.key
8.Schritt: Konfiguration des POP3/IMAP Dienstes
Die Standard Einträge sind zum leichteren Auffinden mit einem > gekennzeichnet. In Ihrer Datei hingegen sind die Werte aus den mit < gekennzeichneten Zeilen einzutragen.
mobil:/etc/courier# vi authdaemonrc 27,29c27 < #authmodulelist="authpam" < authmodulelist="authmysql" < --- > authmodulelist="authpam"
Danach /etc/courier/authmysqlrc
27,28c27,28 < MYSQL_USERNAME Peter < MYSQL_PASSWORD test --- > MYSQL_USERNAME admin > MYSQL_PASSWORD admin 54c54 < MYSQL_DATABASE maildomains --- > MYSQL_DATABASE mysql 61c61 < MYSQL_USER_TABLE users --- > MYSQL_USER_TABLE passwd 70c70 MYSQL_PORT 0 < #MYSQL_CRYPT_PWFIELD crypt --- > MYSQL_CRYPT_PWFIELD crypt 7 5c75 < MYSQL_CLEAR_PWFIELD password 91c91 < MYSQL_UID_FIELD 5000 --- > MYSQL_UID_FIELD uid 97c97 < MYSQL_GID_FIELD 5000 --- > MYSQL_GID_FIELD gid 106c106 < MYSQL_LOGIN_FIELD email --- > MYSQL_LOGIN_FIELD id 111c111 < MYSQL_HOME_FIELD "/home/mailsystem" --- > MYSQL_HOME_FIELD home 128c128 < MYSQL_MAILDIR_FIELD concat(email,'/') --- > # MYSQL_MAILDIR_FIELD maildir
Danach starten Sie den courier-authdaemon neu. mobil:/etc/courier# /etc/init.d/courier-authdaemon restart Stopping Courier authdaemon: done. Starting Courier authdaemon: done.
9.Schritt: Testphase
Postfix
User Postfix suchen:
cat /etc/passwd [...] saned:x:106:106::/home/saned:/bin/false aptproxy:x:103:65534::/var/cache/apt-proxy:/bin/false postfix:x:104:107::/var/spool/postfix:/bin/false mysql:x:105:109:MySQL Server,,,:/var/lib/mysql:/bin/false snort:x:107:110:Snort IDS:/var/log/snort:/bin/false [...]
Die Gruppe Postfix finden:
Syntax: groupadd [-g gid [-o]] Gruppe mobil:/etc# groupadd postfix groupadd : Gruppe postfix bereits vorhanden mobil:/etc# groupadd postdrop groupadd : Gruppe postdrop bereits vorhanden
...
Postfix unterstützt die folgenden Module:
mobil:/etc/postfix# postconf -m static cidr nis dbm regexp environ proxy btree unix hash tcp
Die Module Mysql und LDAP noch hinzufügen
In unserem fall einfach die erforderlichen Pakete installieren
apt-get install postfix-mysql apt-get install postfix-ldap
Danach können wir den Postfix-Dienst neu starten.
mobil:/etc/postfix# postfix stop postfix/postfix-script: stopping the Postfix mail system
make upgrade Postfix Version:mobil:
/etc/postfix# postconf mail_version mail_version = 2.1.3
Wieder starten
mobil:/etc/postfix# postfix start postfix/postfix-script: starting the Postfix mail system
Testen, ob der Mailserver funktioniert
mobil:/etc/postfix# tail -f /var/log/mail.log Jul 23 14:26:09 localhost postfix/qmgr[2399]: D41BB1503C: removed Jul 23 14:26:21 localhost postfix/pickup[2398]: 3B8C81503C: uid=0 from=<root> Jul 23 14:26:21 localhost postfix/cleanup[2970]: 3B8C81503C: message-id=<20040723122621.3B8C81503C@localhost> Jul 23 14:26:21 localhost postfix/qmgr[2399]: 3B8C81503C: from=<root@localhost>, size=622, nrcpt=1 (queue active) Jul 23 14:26:21 localhost postfix/local[2974]: 3B8C81503C: to=<Peter@localhost>, orig_to=<root>, relay=local, delay=0, status=sent (delivered to command: procmail -a "$EXTENSION") Jul 23 14:26:21 localhost postfix/qmgr[2399]: 3B8C81503C: removed Jul 23 14:47:20 localhost postfix/postfix-script: stopping the Postfix mail system Jul 23 14:47:21 localhost postfix/master[2395]: terminating on signal 15 Jul 23 14:49:51 localhost postfix/postfix-script: starting the Postfix mail system Jul 23 14:49:51 localhost postfix/master[3262]: daemon started -- version 2.1.3 Jul 23 14:50:45 localhost postfix/smtpd[3274]: connect from localhost[127.0.0.1]
Danach öffnen Sie eine Telnetsession auf
Peter@mobil:~$ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 localhost ESMTP Postfix (Debian/GNU)
Legen Sie bitte die folgende Datei ... unter /etc/postfix an:
user=postfix password=test dbname=mailbase table=mailbase select_field=uid where_id=id host=localhost
Weiter geht's dann mit.... Bitte legen Sie ebenfalls die Datei mailbox.mysql im Verzeichnis /etc/postfix an
user=postfix password=test dbname=mailbase table=mailbase select_field=maildir where_field=id host=localhost
See /usr/share/postfix/main.cf.dist for a commented, more complete version
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no relay_domains = $mydestination, # Pfad der vor die Mailbox des User gehängt wird virtual_mailbox_base=/var/spool/maildirs #Die NutzerId zu abspeichern der Mails #virtual_uid_maps=mysql:/etc/postfix/ids.mysql #virtual_gid_maps=mysql:/etc/postfix/ids.mysql virtual_uid_maps=hash:/etc/postfix/ids.mysql virtual_gid_maps=hash:/etc/postfix/ids.mysql # Pfad zu maildir virtual_mailbox_maps=hash:/etc/postfix/mailbox.mysql #minimale uid die zum Postholen erlaubt ist virtual_minimum_uid = 5000 # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h myhostname = localhost alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = mobil, localhost, localhost.localdomain, localhost relayhost = mynetworks = 127.0.0.0/8 [...]
...
$ mobil:/etc/postfix# vi transport localhost virtual:
$ mobil:/etc/postfix# postmap transport # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - - - - smtpd #submission inet n - - - - smtpd # -o smtpd_etrn_restrictions=reject #628 inet n - - - - qmqpd pickup fifo n - - 60 1 pickup cleanup unix n - - - 0 cleanup qmgr fifo n - - 300 1 qmgr #qmgr fifo n - - 300 1 oqmgr rewrite unix - - - - - trivial-rewrite bounce unix - - - - 0 bounce defer unix - - - - 0 bounce trace unix - - - - 0 bounce verify unix - - - - 1 verify flush unix n - - 1000? 0 flush proxymap unix - - n - - proxymap smtp unix - - - - - smtp relay unix - - - - - smtp # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n - - - - showq error unix - - - - - error local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - n - - lmtp anvil unix - - n - 1 anvil #
$ mobil:/etc/postfix# useradd -u 5001 -d /var/spool/postfix/ -s /bin/false mailsystem $ mobil:/etc/postfix# groupadd -g 5001 mailsystem
INSERT INTO `mailbase` ( `id` , `maildir` , `uid` , `gid` , `passwort` , `home` ) VALUES ( 'testuser@localhost', 'localhost/maildirs/', '5001', '5001', , '/home/mailsystem' );
Verweise:
[Bearbeiten]Bücher:
[Bearbeiten]- Peer Heinlein: Das Postfix-Buch (2004), ISBN 393751404X
- Kyle D. Dent: Postfix (2004), ISBN 3897213729
- Ralf Hildebrandt and Patrick Koetter: The Book of Postfix: State-of-the-Art Message Transport (2005), ISBN 1-59327-001-1
- Ralf Hildebrandt, Patrick Ben Koetter: Postfix: Einrichtung, Betrieb und Wartung (2005), ISBN 3-89864-350-6