Benutzer:Duese/Postfix

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen

Nachfolgend ein HowTo zur Einrichtung eines Mailservers mit Postfix, Dovecot und Postfixadmin.

Voraussetzungen

Dieses Howto setzt die folgenden Programmversionen voraus. Versionsbedingte Abweichungen selber beachten.

  • Debian Squeeze
  • Postfix 2.7.1-1
  • Dovecot 1:1.2.15-4
  • Postfixadmin 2.3.3
  • installierter MySQL-Server
  • installierter Webserver mit PHP (hier ein Apache)

Einführung

Postfix ist ein MTA, welcher als leicht konfigurierbar und dennoch reich an Features gilt. Er bietet Unterstützung für Virtual Domains, so dass kein Benutzeraccount auf dem Server eingerichtet werden muss, damit auf eine entsprechende Mailbox zugegriffen werden kann.

Postfix kann die Benutzerdaten aus unterschiedlichen Quellen verwenden, darunter aus einem MySQL-Server. Die entsprechenden Queries werden Postfix in entsprechenden Dateien mitgeteilt. Auf diese Weise kann die Datenbank entweder selbst zusammensgestöpselt werden oder man übernimmt ein fertiges Layout.

Das IPSmail-Tutorial unter http://workaround.org/ispmail/lenny, an welchem sich dieses HowTo stark orientiert, verwendet zur Erläuterung ein einfaches Datenbankschema. Im Gegensatz dazu, verwendet dieses HowTo die Datenbank von Postfixadmin.

Postfixadmin stellt eine fortschrittliche, aber dennoch einfache und aufgeräumte Oberfläche bereit um Benutzer und Domains zu verwalten.

postfixadmin

Postfixadmin benötigt eine Datenbank, in der es schalten und walten kann. Es kann auch so konfiguriert werden, dass es in einer bestehenden DB nur Tabellen mit einem bestimmten Prefix verwendet. Wir erzeugen eine separate Datenbank namens "postfix" sowie einen gleichnamigen Benutzer mit dem Passwort "postabc123":

CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postabc123';
GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';

Man lade nun von Sourceforge das Tar "postfixadmin-2.3.3.tar.gz" herunter, entpacke es nach /usr/local/share/postfixadmin-2.3.3 und läßt Apache auf das entsprechende Verzeichnis zeigen:

Alias /postfixadmin /usr/local/share/postfixadmin-2.3.3
<Directory /usr/local/share/postfixadmin-2.3.3>
    DirectoryIndex index.php
</Directory>

Der Webserver muss nicht schreibend auf die Dateien zugreifen können. Daher reichen Lese- und Ausführrechte für /usr/local/share/postfixadmin-2.3.3:

chown -R www-data:www-data /usr/local/share/postfixadmin-2.3.3
chmod -R u=rx,g=r,o= /usr/local/share/postfixadmin-2.3.3

Man editiere nun die Datei config.inc.php und ändere zunächst die Zeile

$CONF['configured'] = false;

auf

$CONF['configured'] = true;

anschließend geben man die Daten zur Datenbank an:

$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postabc123';
$CONF['database_name'] = 'postfix';

Man merke sich noch das Verschlüsselungsverfahren für Benutzerpasswörter. Es wird später bei der Konfiguration von Dovecot benötigt:

$CONF['encrypt'] = 'md5crypt';

Wir wollen dass die Mailboxen später unter

/var/vmail/example.com/user@example.com/Maildir

abgelegt werden, daher müssen noch folgende Zeilen auf YES gestellt werden:

$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';

Jetzt gehe man auf die im Apache konfigurierte URL:

http://www.example.com/postfixadmin/setup.php

Man folge den dortigen Anweisungen. Die Datenbank wird nun mit Inhalt befüllt. Es muss ein Setup-Passwort eingegeben werden und der daraus erzeugte Hash wird unter

$CONF['setup_password'] = 'hierderfurchtbarlangehash';

abgelegt. Anschließend kann der erste Administrative Benutzer angelegt werden.

postfix

Kommen wir nun zur Installation von Postfix. Man beginne damit Postfix für MySQL zu installieren:

aptitude install postfix-mysql

Notwendige Abhängigkeiten sollten automatisch installiert werden. Bei der Installation wähle bei der Abfrage der Konfigurationsart "Internet-Site" aus.

Postfix benötigt einige Angaben, wo es welche Informationen finden kann. Die Angaben werden in verschiedenen Dateien konfiguriert. Die Dateien können prinzipiell überall liegen, solange der Benutzer postfix darauf zugreifen kann. Der Übersichtlichkeithalber installieren wir die Dateien in einem separaten Ordner namens mysql. die für MySQL notwendigen Dateien sauber getrennt zu halten, lege man das Verzeichnis /etc/postfix/mysql an. Darin werden folgende Dateien angelegt:

##### Datei: /etc/postfix/mysql/virtual_alias_domain_catchall_maps.cf
# handles catch-all settings of target-domain
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

##### Datei: /etc/postfix/mysql/virtual_alias_domain_mailbox_maps.cf
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'

##### Datei: /etc/postfix/mysql/virtual_alias_domain_maps.cf
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'

##### Datei: /etc/postfix/mysql/virtual_alias_maps.cf
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1' 
#expansion_limit = 100

##### Datei: /etc/postfix/mysql/virtual_domains_maps.cf
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query          = SELECT domain FROM domain WHERE domain='%s' AND active = '1' 
#query          = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query           = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
#expansion_limit = 100

##### Datei: /etc/postfix/mysql/virtual_mailbox_limit_maps.cf
# For quota support
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'

##### Datei: /etc/postfix/mysql/virtual_mailbox_maps.cf
user = postfix
password = postabc123
hosts = localhost
dbname = postfix
query           = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
#expansion_limit = 100

Postfix muss auf die Dateien zugreifen können, daher müssen die Rechte noch sinnvoll vergeben werden:

chgrp -R postfix /etc/postfix/mysql
chmod u=rw,g=r,o= /etc/postfix/mysql/*

Damit Postfix auch was von den Dateien weiß, mache man sie ihm bekannt und hänge folgende Zeilen in die Datei /etc/postfix/main.cf an:

# Mapping to database given by postfixadmin
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf,proxy:mysql:/etc/postfix/mysql/virtual_alias_domain_mailbox_maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/virtual_alias_maps.cf,proxy:mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf,proxy:mysql:/etc/postfix/mysql/virtual_alias_domain_catchall_maps.cf

dovecot

Dovecot ist ein MDA. Er gilt als schnell und ist flexibler als der in Postfix eingebaute Delivery Agent. Ausserdem bietet Dovecot Unterstützung für Quotas, Spamfilter uvm.

Damit Postfix Mails an den Dovecot LDA weiterreicht machen wir die beiden miteinander bekannt und hängen nachfolgende Zeilen an die Datei /etc/postfix/master.cf an:

dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Wichtig ist hierbei, dass die zweite Zeile mit Leerzeichen eingerückt ist, damit Postfix weiß, dass die Zeile noch zur vorhergehenden gehört.

Damit Postfix Dovecot auch benutzt ergänze man /etc/postfix/main.cf um folgende Zeilen:

virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

Um die virtuellen Mailboxen in einem separatem Verzeichnis und getrennt von anderen Benutzern des Systems zu halten wird ein neuer Systemuser und eine neue -gruppe namens vmail angelegt.

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail -m

Die Kommandos legen dem Benutzer ein neues Homeverzeichnis /var/vmail an.

Die weiteren Konfigurationsdateien von Dovecot liegen unter /etc/dovecot.

In der Datei /etc/dovecot/dovecot.conf werden folgende Einstellungen benötigt:

protocols = imap imaps pop3 pop3s

Dies erlaubt den Zugriff via IMAP und POP3, sowie den zugehörigen verschlüsselten Varianten.

Im Tutorial auf workaround.org wird empfohlen die Option disable_plaintext_auth = no zu setzen um Clients wie bspw. Outlook den Zugriff zu gewähren. Man informiere sich dazu an anderen Stellen.

Wie schon oben angekündigt, sollen die Mails nach einen bestimmten Schema abgelegt werden:

mail_location = maildir:/var/vmail/%d/%n/Maildir

%d steht für die Domain, %n für den Benutzernamen mit Domain.

Im Abschnitt auth default können die erlaubten Authentifizierungsmechanismen festgelegt werden:

mechanisms = plain login

Darin findet sich auch die Sektion passdb sql:

 passdb sql {
   args = /etc/dovecot/dovecot-sql.conf
 }

Sie teilt Dovecot mit, dass Passwörter in einer SQL-Datenbank abgelegt sind. Damit Dovecot die Benutzer richtig auf die Mailboxen mappt, muss der nachfolgende Abschnitt so lauten:

 userdb sql {
   args = /etc/dovecot/dovecot-sql.conf
 }

Damit Dovecot Systembenutzer ignoriert, muss der Abschnitt passdb pam einkommentiert werden.

Im Abschnitt socket listen werden folgende Einstellungen benötigt:

 socket listen {
   master {
     path = /var/run/dovecot/auth-master
     mode = 0600
     user = vmail
     #group = 
   }
   client {
     path = /var/spool/postfix/private/auth
     mode = 0660
     user = postfix
     group = postfix
   }
 }

Der Abschnitt sorgt dafür, dass entsprechende Sockets von anderen Programmen dazu verwendet werden können, den Authentifizierungsmechanismus von Dovecot zu benutzen.

Zum Schluß muss noch der Abschnitt "protocol lda" angepasst werden:

protocol lda {
   log_path = /var/log/dovecot.log
   auth_socket_path = /var/run/dovecot/auth-master
   postmaster_address = postmaster@example.com
}

Jetzt machen wir Dovecot mit der Datenbank von postfixadmin vertraut und editieren die Datei /etc/dovecot/dovecot-sql.conf:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postabc123
default_pass_scheme = MD5-CRYPT
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT CONCAT('maildir:/var/vmail/',maildir) AS mail, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active='1'

Da Postfix den LDA mit den Berechtigungen des Benutzers vmail startet, muss die Datei dovecot.conf noch für den Benutzer zugänglich gemacht werden:

chgrp vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

Wir sind nun mit der Konfiguration von Postifx und Dovecot fertig. Nach einem Neustart kann man das Senden und Empfangen von Mails testen.

/etc/init.d/postfix reload
/etc/init.d/dovecot restart

Test: Senden einer E-Mail mittels Telnet

Nach einem Neustart von postfix und dovecot kann man das Senden einer E-Mail mit Telnet simulieren.

telnet localhost smtp

Dies baut eine Verbindung zum Server über den SMTP-Port (25) auf.

Der Server antwortet wie folgt:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailtest ESMTP Postfix (Debian/GNU)

Wir sagen dem Server Hallo:

ehlo example.com

Er antwortet dann mit:

250-my-new-mailserver
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Anna will Berta eine E-Mail schicken:

mail from:<anna@example.com>
250 2.1.0 Ok

Für Postfix scheint das OK zu sein, also machen wir mit dem Empfänger weiter:

rcpt to:<berta@example.com>
250 2.1.5 Ok

Auch hier wieder alles OK. Dann können wir Daten an die E-Mail anhängen:

data

Postfix sagt uns, was wir nun zu tun haben:

354 End data with <CR><LF>.<CR><LF>

Dann machen wir es so:

Hallo Berta,

alles Gute,
Anna
.
250 2.0.0 Ok: queued as 4BF932DA068

Die Antwort sagt uns, dass Postfix die Mail angenommen und ins Queue gepackt hat. Dann wollen wir uns verabschieden:

quit

Die Mail taucht dann im Log auf:

mailserver postfix/smtpd[15840]: connect from localhost[127.0.0.1]
mailserver postfix/smtpd[15840]: 4BF932DA068: client=localhost[127.0.0.1]
mailserver postfix/cleanup[15844]: 4BF932DA068: message-id=<...>
mailserver postfix/qmgr[15838]: 4BF932DA068: from=<anna@example.com>, size=348, nrcpt=1 (queue active)
mailserver postfix/pipe[15845]: 4BF932DA068: to=<berta@example.com>, relay=dovecot, delay=21, delays=21/0.01/0/0.01, dsn=2.0.0, status=sent (delivered via dovecot service)
mailserver postfix/qmgr[15838]: 4BF932DA068: removed
mailserver postfix/smtpd[15840]: disconnect from localhost[127.0.0.1]

Die Mail ist dann jetzt auch in der Mailbox gelandet:

cd /var/vmail/example.com/berta@example.com/
find


Support für Quota

Um das Support für Quotas zu aktivieren müssen einige Stellen modifiziert werden. Zu beachten ist, dass die Konfigurationen von Postfixadmin und die Standard-Debian-Konfigurationskommentar nicht sehr zielführend sind.

In der Datei /etc/postfix/main.cf:

virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql/virtual_mailbox_limit_maps.cf


Troubleshooting

Logs finden sich unter:

  • /var/log/mail.log
  • /var/vmail/dovecot-deliver.log

Weiterführende Links