Teaser
The more I see, the more I know
The more I know, the less I understand
clear

Gentoo Postfix Howto

Version 0.1: 2.01.2009 : initial Release

ToDo: SMTP SSL, Amavisd local Domains lookup




1) Einstieg

Für Linux Systeme und so auch Gentoo stehen mindestens vier Email Server (MTAs) zur Verfügung:

  • Postfix
  • Exim
  • Qmail
  • Sendmail


Nachdem ich lange Zeit Qmail verwendet hatte, sah ich mich leider aufgrund der schleppenden Weiterentwicklung gezwungen, meine Mail Systeme auf einen anderen Email Server umzustellen. Ich habe mich hier für Postfix entschieden, da es eine große Community gibt und viele Dokumentation im Netz gibt.

Im diesem Howto erfahrt Ihr wie man Postfix mit einer mysql Verwaltung, ClamAV, Spamasassin sowie Courier als IMAP/Pop3 Server aufsetzt.



2) System Vorbereitung

Ich gehe einmal davon aus, das ein aktuelles Gentoo System mit Apache, PHP und mysql existiert. Grundkenntnisse, wie z.B. unter mysql User angelegt werden etc, setze ich ebenfalls als gegegen voraus.

Useflags anpassen:
in /etc/portage/package.use folgendes eintragen:

mail-mta/postfix ssl mysql sasl
www-apps/postfixadmin  mysql
net-libs/courier-authlib mysql -berkdb -crypt -gdbm -pam
mail-filter/amavisd-new spamassassin mysql


in /etc/portage/package.keywords folgendes eintragen:

www-apps/postfixadmin ~amd64 (hier ggf. natürlich die Umgebung anpassen)

 
In diesem Beispiel ist der Hostname testserver und die Domain gewaltphantasien.de. Ja, das lässt tief blicken ;-)


3) Postfix Pakete installieren

Sollten beim emerge Konflikte mit ssmtp oder einem anderen Email Server auftreten, so sollte dieser vorher deinstalliert werden.

z..B. emerge --unmerge ssmtp


Nun werden zunächst einmal postix und die Weboberfläche installiert:

testsystem ~ # emerge -pv postfix postfixadmin
These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ] net-mail/mailbase-1  USE="pam" 0 kB
[ebuild  NS   ] sys-devel/automake-1.7.9-r1 [1.10.1] 565 kB
[ebuild  N    ] dev-libs/cyrus-sasl-2.1.22-r2  USE="berkdb crypt gdbm pam ssl -authdaemond -java -kerberos -ldap -mysql -ntlm_unsupported_patch -postgres -sample -srp -urandom" 1,572 kB
[ebuild  N    ] mail-mta/postfix-2.5.5  USE="mysql pam sasl ssl -cdb -dovecot-sasl -hardened -ipv6 -ldap -mailwrapper -mbox -nis -postgres (-selinux) -vda" 3,084 kB
[ebuild  N    ] www-apps/postfixadmin-2.2.1.1  USE="mysql -postgres -vhosts" 944 kB

Total: 5 packages (4 new, 1 in new slot), Size of downloads: 6,164 kB

 


4) Postfix Admin einrichten

Fangen wir zunächst einmal an, Postfix Admin einzurichten. Hierzu benötigen wir einen mysql Datanbank (z.B. "postfix", sowie passenden MySQL User). In meinem Beispiel heisst die Datenbank "postfix", der User "postfix" und das Passwort "postfixpass".

Je nachdem wie man sein Gentoo WebApp eingerichtet hat, kann die Stelle der Webdateien anders ausfallen:

Die Datei "config.inc.php" im Webverzeichnis von Postfix Admin (z.B. /var/www/localhost/htdocs/config.inc.php) anpassen:

$CONF['configured'] = true;  (war vorher 'false')
$CONF['postfix_admin_url'] = 'http://www.gewaltphantasien.de/postfixadmin';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixpass';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';

// Default Aliases
// The default aliases that need to be created for all domains.
$CONF['default_aliases'] = array (
    'abuse' => 'postmaster@gewaltphantasien.de',
    'hostmaster' => 'postmaster@gewaltphantasien.de',
    'postmaster' => 'postmaster@gewaltphantasien.de',
    'webmaster' =>  'postmaster@gewaltphantasien.de'


(hier kann man natürlich auch andere Email Adressen eintragen, die man ggf. öfters abfragt)

// Mailboxes
// If you want to store the mailboxes per domain set this to 'YES'.
// Examples:
//   YES: /usr/local/virtual/domain.tld/username@domain.tld
//   NO:  /usr/local/virtual/username@domain.tld
$CONF['domain_path'] = 'YES';


(muss man nicht, wenn man aber viele Domains hat, wird es sonst schnell unübersichtlich).

Die anderen Optionen sollte man sich einmal anschauen und ggf. an seine Bedürfnisse anpassen.

Im Webbrowser nun folgendes ausrufen:
www.gewaltphantasien.de/postfixadmin/setup.php

Nun sollte eine Statusseite angezeigt werden. Sollten hier noch Fehler auftauchen, diese bitte dementsprechend fixen. Sollte alles stimmen, so kann man unten einen SuperUser anlegen. Mit diesem kann man später die virtuellen Domains und User anlegen. Anschließend die setup.php löschen!

rm /var/www/localhost/htdocs/postfixadmin/setup.php


Nun kann mit www.gewaltphantasien.de/postfixadmin/ PostfixAdmin im Browser aufrufen und mit dem soeben angelegten Superuser anmelden. Nun kann man über "Domain Liste --> Neue Domain" eine neue Domain anlegen und über "Virtual Liste --> Mailbox hinzufügen" einen neuen User anlegen. Ich habe testweise die Domain "gewaltphantasien.de" und den User "test" genannt. Zu diesem Zeitpunkt sollte natürlich zumindest der MX Record der Domain auf den Server verweisen.


5) Postfix anpassen

5.1) Konfigurationsdateien für den mysql Zugriff erstellen
Da ja Postfix auf die mysql Daten zugreifen soll, erstellen wir zunächst einmal einige Dateien, die die Abfragen durchführen. Die Dateien kann man auch hier runterladen - das anpassen aber nicht vergessen.


/etc/postfix/virtual-relay-domains.cf

user            = postfix
password        = xxxxxxx
dbname          = postfix
hosts           = localhost
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = true

 

/etc/postfix/virtual-alias-maps.cf

user             = postfix
password         = xxxxxxxx
dbname           = postfix
hosts            = localhost
query = SELECT goto FROM alias WHERE address='%s' AND active = true



/etc/postfix/virtual-domains.cf

user        = postfix
password    = xxxxxxxx
dbname      = postfix
hosts       = localhost
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = false AND active = true



/etc/postfix/virtual-mailbox-limit-maps.cf

user = postfix
password = xxxxxxx
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username = '%s'



/etc/postfix/virtual-mailbox-maps.cf

user      = postfix
password  = xxxxxxxx
dbname    = postfix
hosts     = localhost
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = true



5.2) Gruppe und User anlegen
Die Mailverzeichnisse für die virtuellen Domains werden unter einem besonderen User- und Gruppenaccount angelegt. Wie man die  nennt bleibt jedem selber überlassen.

testsystem ~ # groupadd vmail
testsystem ~ # useradd -g vmail  -d /var/mail/domains -m -s /bin/false vmail


Die Gruppen ID (GID) und User ID (UID) brauchen wir für spätere Zwecke:

testsystem ~ # grep vmail /etc/passwd
vmail:x:1001:410::/var/mail/domains:/bin/false


In meinem Fall ist also die UID 1001 sowie die GID 410. Diese Werte merken wir uns als Referenz. In diesem Beispiel nehmen wir also "/var/mail/domains" als Verzeichnis für unsere virtuellen Email Accounts. Dieser Wert kann natürlich frei angepasst werden, man muss dann natürlich den Wert in der Postfix Config dementsprechen anpassen


5.3) Postfix Config anpassen
Nun passen wir die Postfix config (main.cf) an.

/etc/postfix/main.cf

Zeile 77: myhostname  = testserver.gewaltphantasien.de
Zeile 85: mydomain = gewaltphantasien.de
Zeile 249: mynetworks_style = host
Zeile 654: home_mailbox = maildir/


Am Ende der Datei nun folgendes eintragen:

# Platz für die virtuellen Accounts
virtual_mailbox_base = /var/mail/domains

# Domains
virtual_mailbox_domains = proxy:mysql:/etc/postfix/virtual-domains.cf

# Mailbox Location. Hier werden nun die UID und GID des Users "vmail" eingetragen.
virtual_mailbox_maps = proxy:mysql:/etc/postfix/virtual-mailbox-maps.cf
virtual_uid_maps = static:1001
virtual_gid_maps = static:410

# Aliase
virtual_alias_maps = proxy:mysql:/etc/postfix/virtual-alias-maps.cf

# Relay Domains
relay_domains = proxy:mysql:/etc/postfix/virtual-relay-domains.cf

local_transport = virtual
local_recipient_maps = $virtual_mailbox_maps

# SMTP Auth Support
smtpd_sasl_authenticated_header = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, check_relay_domains


Die letzte Zeile gibt an, welche Voraussetzungen für den SMTP Zugang erfüllt werden müssen. Zu einem späteren Zeitpunkt werden wir hier noch weitere Parameter setzen, um möglichen Spam bereits beim SMTP Prozess rauszufiltern.


5.4) SASL anpassen
SASL (Simple Authentication and Security Layer) wird für die SMTP Auth Anmeldung benötigt. Da Postfix keine direkte Abfrage der virtuellen User ermöglicht, gehen wir hier den Umweg über die IMAP Authentifizierung. Es wird also bei einem SMTP Login zunächst ein IMAP Login durchgeführt: ist dieser erfolgreich, dann gilt SMTP Auth als bestanden. Es würde auch einen Umweg über PAM und mysql gehen, aber ich finde den Weg über Imap eleganter.

/etc/sasl2/smtpd.conf

mech_list: PLAIN LOGIN
pwcheck_method: saslauthd

 

/etc/conf.d/saslauthd

# SASLAUTHD_OPTS="${SASLAUTHD_OPTS} -a pam" (diese Zeile auskommentieren und  darunter zusätzlich)
SASLAUTHD_OPTS="${SASLAUTH_MECH} -a rimap -r"
SASLAUTHD_OPTS="${SASLAUTHD_OPTS} -O localhost"

 

 


6.0) Courier installieren

Courier besteht aus zwei Teilen. Einmal courier-authlib, was die Anmeldung übernimmt und courier, den eigentlichen POP3 und IMAP Server.

testsystem mail # emerge -pv courier-imap courier-authlib

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ] net-libs/courier-authlib-0.60.6  USE="mysql -berkdb -crypt -debug -gdbm -ldap -pam -postgres -vpopmail" 2,123 kB
[ebuild  N    ] net-mail/courier-imap-4.0.6-r3  USE="berkdb gdbm nls -debug -fam -ipv6 (-selinux)" 3,084 kB


6.1) Courier anpassen
Zunächst einmal courier-authlib anpassen an die mysql Datenbank:

/etc/courier/authlib/authmysqlrc

MYSQL_SERVER            localhost
MYSQL_USERNAME          postfix
MYSQL_PASSWORD          xxxxxxx

Zeile 68:
MYSQL_DATABASE          postfix

Zeile 83 und folgende:
MYSQL_USER_TABLE        mailbox
MYSQL_CRYPT_PWFIELD     password
MYSQL_UID_FIELD         '1001' (hier natürlich EURE UID)
MYSQL_GID_FIELD         '410'  (hier natürlich EURE GID)
MYSQL_LOGIN_FIELD       username
MYSQL_HOME_FIELD        '/var/mail/domains'
MYSQL_NAME_FIELD        name
MYSQL_MAILDIR_FIELD     maildir
MYSQL_QUOTA_FIELD     quota



in /etc/courier-imap/imapd passen wir noch die maximale Anzahl der Verbindungen an. Thunderbird baut z.B. pro (!) User 5 Verbindungen auf. Das Standard Limit liegt pro IP jedoch bei 4, weshalb man kaum nachzuvollziehende Fehler erhält:

/etc/courier-imap/imapd

Zeile 60:
MAXPERIP=40


6.2) SSL Zertifikate für IMAP und POP3 erstellen

/etc/courier-imap/imapd.cnf und /etc/courier-imap/pop3d.cnf anpassen und anschließend die Schlüssel erstellen:

testsystem mail # mkimapdcert
Generating a 2048 bit RSA private key
....

und...

testsystem mail # mkimapdcert
Generating a 2048 bit RSA private key
....


7) Dienste hinzufügen und starten

Nun können wir die Dienste einmal starten und den Runlevels zufügen:

testsystem mail # /etc/init.d/saslauthd start
testsystem mail # /etc/init.d/postfix start
testsystem mail # /etc/init.d/courier-authlib start
testsystem mail # /etc/init.d/courier-imapd start
testsystem mail # /etc/init.d/courier-imapd-ssl start
testsystem mail # /etc/init.d/courier-pop3d start
testsystem mail # /etc/init.d/courier-pop3d-ssl start

testsystem mail # rc-update add saslauthd default
testsystem mail # rc-update add postfix default
testsystem mail # rc-update add courier-authlib default
testsystem mail # rc-update add courier-imapd default
testsystem mail # rc-update add courier-imapd-ssl  default
testsystem mail # rc-update add courier-pop3d  default
testsystem mail # rc-update add courier-pop3d-ssl  default


8) erster Test

So, nun kann man einen ersten Test machen, ob das System ohne Probleme funktioniert. Ggf. noch eine Domain und User anlegen, daran denken, daß der MX Record der Domain auf den Server verweist und nun kann man einmal Emails empfangen und versenden sowie ggf. die IMAP Funktionen testen.

Zum Testen der SMTP Session eignet sich auch hervoragend eine Telnet Verbindung auf Port 25 sowie ein Test an echo@tu-berlin.de, der die Email nach wenigen Sekunden als Kopie zurückschicken sollte.

Sollten jetzt Probleme auftauchen, so kann man auch /etc/postfix/master.cf die Option "-v " der SMTP Zeile anfügen, Postfix dann neu starten. In /var/log/mail (je nachdem welchen Syslogger man installiert) kann man dann das Verhalten von Postfix und Courier nachvollziehen. Auch die Courier Configdateien bietet noch Log Möglichkeiten an.

smtp      inet  n       -       n       -       -       smtpd -v


9) Spam, Virus

So, nachdem alles funktioniert, können wir uns nun mit Viren und Spamkontrolle auseinander setzen.

testsystem ~ # emerge -pv amavisd-new clamav spamassassin

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ] app-antivirus/clamav-0.94.2  USE="bzip2 crypt iconv nls -ipv6 -mailwrapper -milter (-selinux)" 21,590 kB
[ebuild  N    ] mail-filter/spamassassin-3.2.1-r1  USE="berkdb ssl -doc -ipv6 -ldap -mysql -postgres -qmail -sqlite -tools" 959 kB
[ebuild  N    ] mail-filter/amavisd-new-2.6.1-r1  USE="mysql spamassassin -courier -dkim -ldap -milter  -postgres -qmail -razor" 891 kB

 

 


Nun passen wir amavis und clamav an:

 

/etc/amavisd.conf

Zeile 70:
$mydomain = 'gewaltphantasien.de';      # (no useful default)
$myhostname = 'testsystem.gewaltphantasien.de';  # fqdn of this host, default by unam

Zeile 115:
$forward_method = 'smtp:[127.0.0.1]:10025';  # where to forward checked mail
$notify_method = $forward_method;            # where to submit notifications

Zeile 160:
# Net::Server pre-forking settings
# The $max_servers should match the width of your MTA pipe
# feeding amavisd, e.g. with Postfix the 'Max procs' field in the
# master.cf file, like the '2' in the:  smtp-amavis unix - - n - 2 smtp
#
$max_servers = 10;     # Dieser Wert muss mit dem Wert in der master.cf von Postfix übereinstimmen
$max_requests = 20;   # retire a child after that many accepts (default 20)

Zeile 219:
$insert_received_line = 1;       # behave like MTA

Zeile 502:
$final_virus_destiny      = D_DISCARD; # (defaults to D_DISCARD)
$final_banned_destiny     = D_BOUNCE;  # (defaults to D_BOUNCE)
$final_spam_destiny       = D_DISCARD;  # (defaults to D_BOUNCE)
$final_bad_header_destiny = D_PASS;    # (defaults to D_PASS


Damit Amavisd mit Clamav richtig zusammen spielt, müssen noch eine Änderungen durchgeführt werden:

Zeile 1942:
Die Clam Selection entkommentieren. Anschließend den User Clamav der Gruppe Amavis zufügen. Die Einstellung "AllowSupplementaryGroups" in der clamd.conf anschließend überprüfen: sollte auf yes stehen

testsystem ~ # usermod -a -G amavis clamav


Außerdem:
Die Socket Angaben in clamd.conf (LocalSocket) und  amavis.de (Zeile 1944, nach "CONTSCAN" suchen) müssen übereinstimmen:

clamd.conf:

LocalSocket /var/run/clamav/clamd.sock


amavisd.conf: 

Clamav Sektion entkommentieren und anpassen:
  \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],

Nun amavis und die anderen Dienste starten und dem runlevel hinzufügen

/etc/init.d/amavisd start
rc-update add amavisd default

/etc/init.d/clamd start
rc-update add clamd default

/etc/init.d/spamd start
rc-update add spamd default

(Anmerkung von Torsten S: unter Gentoo wird "clamd" und nicht "clamav" gestartet. Geändert am 29. Mai 2010)

Nun können wir wieder einmal mit Telnet den Amavis Dienst auf Port 10024 testen:

testsystem ~ # telnet localhost 10024
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 [127.0.0.1] ESMTP amavisd-new service ready


10) Postfix anpassen

Nun müssen wir zum schluss die Postix Dateien noch an Amavis anpassen. Amavis kümmert sich dann um die Viren- und Spamtests.

/etc/postfix/master.cf:

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp       inet    n       -       n       -       -       smtpd

amavisfeed unix    -       -       n       -      10       smtp
     -o smtp_data_done_timeout=1200
     -o smtp_send_xforward_command=yes
     -o smtp_tls_note_starttls_offer=no

127.0.0.1:10025 inet n    -        n       -       -       smtpd
     -o content_filter=
     -o smtpd_delay_reject=no
     -o smtpd_client_restrictions=permit_mynetworks,reject
     -o smtpd_helo_restrictions=
     -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o smtpd_data_restrictions=reject_unauth_pipelining
     -o smtpd_end_of_data_restrictions=
     -o smtpd_restriction_classes=
     -o mynetworks=127.0.0.0/8
     -o smtpd_error_sleep_time=0
     -o smtpd_soft_error_limit=1001
     -o smtpd_hard_error_limit=1000
     -o smtpd_client_connection_count_limit=0
     -o smtpd_client_connection_rate_limit=0
     -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
     -o local_header_rewrite_clients=
     -o smtpd_milters=
     -o local_recipient_maps=
     -o relay_recipient_maps

 

am Ende der main.cf folgende Zeile anfügen:

/etc/postfix/main.cf

# AMAVIS
content_filter=amavisfeed:[127.0.0.1]:10024


Und nun passen wir zum Schluss die smtpd_recipient_restriction Zeile noch an.

/etc/postfix/main.cf

smtpd_recipient_restrictions =
   permit_sasl_authenticated,
   permit_mynetworks,
   reject_non_fqdn_sender,
   reject_non_fqdn_recipient,
   reject_unknown_sender_domain,
   reject_unknown_recipient_domain,
   reject_unauth_destination,
   reject_unauth_pipelining,
   reject_invalid_hostname


11) Referenzen