Gentoo Postfix HowtoVersion 0.1: 2.01.2009 : initial Release
ToDo: SMTP SSL, Amavisd local Domains lookup 


1) EinstiegFür Linux Systeme und so auch Gentoo stehen mindestens vier Email Server (MTAs) zur Verfügung:
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 VorbereitungIch 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 installierenSollten 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 einrichtenFangen 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 anpassen5.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 installierenCourier 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 startenNun 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 TestSo, 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, VirusSo, 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 anpassenNun 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

|