Mailserver mit Postfix und dovecot VORSICHT!!! Dieser Beitrag ist ein BETA-Howto!!! Vorwort Dieses Howto führt durch ein Basic Setup eines virtuellen Mailservers mit Postfix (SMTP), PostfixAdmin (Webadministration) und Dovecot (pop3 und IMAP). Es beschäftigt sich NICHT mit dem Absichern des Netzes, oder mit Secure Connections (SSL/TLS), Mailinglisten und/oder Anti-Virus oder Spam Filterung!!! Ganz wichtig ist dass Deine Domian über einen MX 1 Eintrag verfügt, ansonsten wird es nicht möglich sein Mails zu empfangen bzw. korrekt zu verschicken!!! Vorraussetzungen Das Howto setzt einen bereits installierten und laufenden Apache2 Server sowie eine mysql Installation voraus. Informationen Hostname = example.org (Wann immer dieser Name erscheint, muss er mit dem Domainnamen Deines Servers ausgetauscht werden!!) user = mail (8), dovecot (97, postfix (207) gruppen = mail (12) Um PostfixAdmin zu installieren nutzen wir webapp-admin!!! Vorarbeiten Damit die Software mit den richtigen USE-Flags installiert wird, müssen wir einige Einträge in der Datei /etc/portage/package.use machen. nano /etc/portage/package.use und dann folgendes darin eintragen: mail-mta/postfix dovecot-sasl mysql -pam sasl net-mail/dovecot mysql -pam pop3d www-apps/postfixadmin mysql vhosts Installation Nun können wir mit der Installation beginnen. Wir emergen alle relevanten Pakete mit emerge -av sasl postfix postfixadmin dovecot Nachdem die Installation fertig ist, starten und stoppen wir einmal Postfix, damit Postfix alle von uns benötigten Dateien erstellt. /etc/init.d/postfix start /etc/init.d/postfix stop Als nächstes konfigurieren wir den virtual Host mit postfixadmin in der Version 2.6.5 (Die Versionsnummer in der nächsten Befehlszeile muss dann evtl. angepasst werden). webapp-config --install --host=mailadmin.example.org postfixadmin 2.6.5 Achte bitte genau auf die Hinweise die nach dem ausführen des Befehls angezeigt werden und folge den Anweisungen!!! Als nächstes müssen wir die Domain für unseren PostfixAdmin im Apache einrichten. Wir legen uns also eine Datei im Verzeichnis /etc/apache2/vhosts.d/ z.B mit dem Namen 99_default_host.conf an (Der Name muss an Dein Setup vom Apache angepasst werden) und füllen sie mit folgendem Inhalt (Achte darauf das die Domainnamen noch von Dir angepasst werden müssen!!!) <VirtualHost *:80> ServerName mailadmin.example.org DocumentRoot "/var/www/mailadmin.example.org/htdocs" <Directory "/var/www/mailadmin.example.org/htdocs"> # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.2/mod/core.html#options # for more information. Options Indexes FollowSymLinks # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit AllowOverride All # Controls who can get stuff from this server. Order allow,deny Allow from all </Directory> <IfModule alias_module> # Alias: Maps web paths into filesystem paths and is used to # access content that does not live under the DocumentRoot. # Example: # Alias /webpath /full/filesystem/path # # If you include a trailing / on /webpath then the server will # require it to be present in the URL. You will also likely # need to provide a section to allow access to # the filesystem path. # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the target directory are treated as applications and # run by the server when requested rather than as documents sent to the # client. The same rules about trailing "/" apply to ScriptAlias # directives as to Alias. ScriptAlias /cgi-bin/ "/var/www/mailadmin.example.org/cgi-bin/" </IfModule> <Directory "/var/www/mailadmin.example.org/cgibin"> AllowOverride None Options None Order allow,deny Allow from all </Directory> <IfModule mpm_peruser_module> ServerEnvironment apache apache </IfModule> </VirtualHost> # vim: ts=4 filetype=apache Anschliessend muss der Apache neu gestartet werden. /etc/init.d/apache2 restart Nun richten wir unsere MySQL Datenbank ein. Am einfachsten geht das mit phpmyadmin. Wie das genau geht beschreibe ich hier nicht. Als erstes müssen wir eine Datenbank erstellen in denen wir unsere Mail Accounts und die Details speichern können. Wir benutzen als Namen für die Datenbank „postfixadmin“. Es müssen 2 MySQL User angelegt werden. Der erste ist der User postfixadmin und dieser muss folgende Rechte in der „postfixadmin“ Datenbank haben. SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX Den User „postfixadmin“ benötigen wir um die Mail Accounts zu administrieren. Der zweite User, den wir anlegen müssen, ist der User mailauth. Dieser User benötigt nur das Recht SELECT für die postfix-Datenbank. Der User wird später von Postfix und Dovecot genutzt. Als nächsten wollen wir PostfixAdmin konfigurieren. Wir öffenen dazu die Datei /var/www/mail.example.org/htdocs/postfixadmin/config.inc.php (nicht vergessen mail.example.org gegen Deine Domain auszutauschen!!) und ändern die folgenden Zeilen ab. Du kannst die Zeilen nicht einfach kopieren!!! #$CONF['configured'] = false; $CONF['postfix_admin_url'] = 'http://mailadmin.example.org/'; $CONF['default_language'] = 'de'; $CONF['database_type'] = 'mysqli'; $CONF['database_host'] = 'localhost'; $CONF['database_user'] = 'postfixadmin'; $CONF['database_password'] = 'password'; (Das Passwort muss natürlich das gleiche sein wie bei Deinem User postfixadmin) $CONF['database_name'] = 'postfixadmin'; $CONF['database_prefix'] = ; $CONF['admin_email'] = '[email protected]'; (Diese Adresse wird als FROM Adresse genutzt. Evtl. möchtest Du sie anpassen) $CONF['domain_path'] = 'YES'; $CONF['domain_in_mailbox'] = 'NO'; $CONF['user_footer_link'] = "http://example.org/"; $CONF['show_footer_text'] = 'YES'; $CONF['footer_text'] = 'Example Webhosting'; $CONF['footer_link'] = 'http://example.org/'; $CONF['welcome_text'] = <<<EOM Hi, Welcome to your new account. EOM; Du solltest nun in der Lage sein dein Setup mit PostfixAdmin zu beenden. http://mailadmin.example.org/setup.php Folge den Anweisungen von PostfixAdmin zu den weiteren Schritte. Bitte lege zum derzeitigen Zeitpunkt noch keine Mailadressen, Domains usw. in PostfixAdmin an, da weder Postfix noch Dovecot eingerichtet sind!!! Wir wollen nun Dovecot für SQL einrichten. Öffne dazu die Datei /etc/dovecot/dovecot-sql.conf Als erstes wollen wir die Datenbankverbindung einrichten. driver = mysql connect = host=/var/run/mysqld/mysqld.sock user=mailauth password=password dbname=postfixadmin Das Passwort muss mit dem Passwort von dem User mailauth übereinstimmen!!! PostfixAdmin legt die Passwörter md5-crypt ab, so dass wir auch Dovecot dieses mitteilen müssen. Das machen wir in dieser Zeile der Datei. default_pass_scheme = MD5-CRYPT Nun noch den password_query für die Authentifizierung konfigurieren. Die Zeile an das Dateiende anfügen password_query = SELECT CONCAT('/var/mail/', maildir) AS userdb_home, username as user, password, CONCAT('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = 1 Wir kommen nun zu den Haupteinstellungen von Dovecot. Diese finden wir in der Datei /etc/dovecot/dovecot.conf. Die folgende Zeile bestimmt, für welche Protokolle Dovecot zuständig ist. protocols = pop3 imap By default Dovecot only listens on IPv6 interfaces. Many people are still using IPv4, so you probably want to listen on IPv4 interfaces too. To do so, change the listen line to: Von Hause aus hört Dovecot nur auf IPv6 Interface, aber viele nutzen immer noch IPv4. Damit das funktioniert ändere die Zeile so ab. listen = * By default Dovecot disables plain text authentication on unencrypted (non-SSL/TLS) connections. It is highly recommended that you investigate setting up SSL/TLS connections, but for the purposes of this setup you can enable plain text authentication by setting: Von Hause aus disabled Dovecot die plain text authentification von nichtverschlüsselten Verbindungen (non-SSL/TLS). (Es wird ausdrücklich empfohlen sich mit diesen SSL/TLS Verbindungen auseinander zusetzen und diese entsprechende einzurichten.) disable_plaintext_auth = no Der mail_location Parameter teilt Dovecot mit, wo sich die Mailboxen befinden und in welchem Format sie gespeichert sind. Dieses Howto nutzt das Maildir (Qmail style) Format. mail_location = maildir:/var/mail/%d/%n/Maildir/:INDEX=/var/mail/%d/%n /indexes Der nächste Parameter spezifiziert den User und die Gruppe mit der die Mails gespeichert werden. Hier kann man eine numerische oder die Namen eintragen. Um die User ID zu bekommen gibt man einfach auf der shell id mail ein. mail_uid = mail mail_gid = mail Die nächsten Einstellungen legen die User ID und die Gruppen ID fest, die für Mail-Prozesse von Dovecot erlaubt sind. Die ID’s sollten sehr genau geprüft werden. first_valid_uid = 8 last_valid_uid = 12 first_valid_gid = 12 last_valid_gid = 12 Es folgen nun die IMAP Settings protocol imap { } und die POP3 Settings protocol pop3 { } dann noch die LDA Settings (Local Delivery Agents) protocol lda { postmaster_address = [email protected] } Auch die Authentifizierungseinstellungen müssen wir noch vornehmen. auth default { mechanisms = plain login #passdb pam { #} ... #userdb passwd { #} #userdb passwd { #} passdb sql { args = /etc/dovecot/dovecot-sql.conf } Wir nutzen den Dovecot LDA, also müssen wir auch den User query für die Mailzustellung einbinden. userdb sql { args = /etc/dovecot/dovecot-sql.conf } Wir nutzen die prefetch Methode um eine zusätzliche Überprüfung nach der Datenbank Authentifikation zu haben. Es müssen dazu keine Werte eingetragen werden, da alle Informationen von passdb kommen. userdb prefetch { } Authentifizierungs User setzen user = nobody Jetzt spezifizieren wir die sockets, die wir für den Authentifizierungsmechanismus erlauben wollen. In diesem Setup nutzen wir einen Master Socket für den Dovecot LDA und einen Client Socket für Postfix. socket listen { master { path = /var/run/dovecot/auth-master mode = 0600 user = mail group = mail } client { # If you change the postfix queue_directory, you must also change this. path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } } Als nächstes nehmen wir uns die mail-aliase vor. Die Datei dafür finden wir in /etc/mail/aliases # Basic system aliases -- these MUST be present. MAILER-DAEMON: postmaster postmaster: root # General redirections for pseudo accounts. adm: root bin: root daemon: root exim: root lp: root mail: root named: root nobody: root postfix: root # Well-known aliases -- these should be filled in! root: [email protected] operator: [email protected] # Standard RFC2142 aliases abuse: postmaster ftp: root hostmaster: root news: usenet noc: root security: root usenet: root uucp: root webmaster: root www: webmaster # trap decode to catch security attacks # decode: /dev/null Anschliessend wollen wir die Änderungen der mail-aliase unserem System mitteilen. newaliases Damit Postfix die aliase besser finden kann, setzen wir einen Symlink für die Postfix Konfiguration. ln -s /etc/mail/aliases /etc/postfix/ ln -s /etc/mail/aliases.db /etc/postfix/ Dovecot Integration – LDA Als erstes informieren wir Postfix darüber, dass Dovecot unser LDA ist. Dies machen wir, indem wir die folgenden Zeilen am Dateiende der Datei /etc/postfix/master.cf einfügen. dovecot unix n n pipe flags=DRhu user=mail:mail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient} Ausserdem ändern wir noch die folgende Zeile so ab. smtp smtpd -v inet n - n - - Damit Postfix auch unsere Einstellungen zum zustellen nutzt, fügen wir am Dateiende von der /etc/postfix/main.cf folgendes ein: dovecot_destination_recipient_limit = 1 virtual_transport = dovecot Wir fügen für die Dovecot Integration in Postfix noch diese Zeilen in die Datei /etc/postfix/main.cf ein. smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth Die folgenden Dateien haben enthalten Zugangsdaten die Postfix nutzt wird, um verschiedene Details in der PostfixAdmin Datenbank nutzen zu können. Erstelle die Datei /etc/postfix/mysql_virtual_alias_maps.cf mit folgendem Inhalt. user = mailauth password = password hosts = localhost dbname = postfixadmin query = SELECT goto FROM alias WHERE address='%s' AND active = '1' (bei password = muss das Passwort für den User mailauth hin!!!) Erstelle die Datei /etc/postfix/mysql_virtual_domain_maps.cf mit folgendem Inhalt. user = mailauth password = password hosts = localhost dbname = postfixadmin query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1' (bei password = muss das Passwort für den User mailauth hin!!!) Erstelle die Datei /etc/postfix/mysql_virtual_mailbox_maps.cf mit folgendem Inhalt. user = mailauth password = password hosts = localhost dbname = postfixadmin query = SELECT CONCAT(maildir, 'Maildir/') AS maildir FROM mailbox WHERE username='%s' AND active = '1' (bei password = muss das Passwort für den User mailauth hin!!!) Füge das folgende an das Dateiende der Datei /etc/postfix/main.cf an virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domain_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf Füge noch folgende Restriktionen in die Datei /etc/postfix/main.cf ein, die Postix bei Mails anwenden soll. smtpd_sender_restrictions= reject_non_fqdn_sender smtpd_reject_unlisted_sender = yes smtpd_recipient_restrictions= permit_mynetworks, reject_non_fqdn_recipient, permit_sasl_authenticated, reject_unauth_destination Optional Um Spam vorzubeugen sollte noch folgende Zielen eingefügt werden. (Bitte lese dazu auch die Vereinbarungen auf der Spamhaus Webseite.) reject_rbl_client = zen.spamhaus.org reject_rbl_client = dnsbl.sorbs.net reject_rbl_client = list.dsbl.org Nun wollen wir noch Einstellungen in der Datei /etc/sasl2/smtpd.conf machen. Wir fügen folgendes ein. pwcheck_method:saslauthd log_level:3 mech_list: PLAIN LOGIN authdaemond_path:/var/lib/sasl2/mux und achten darauf das der Eintrag pwcheck_method:pam auskommentiert ist. #pwcheck_method:pam Konfiguration überprüfen und starten des Mailservers postfix check Sollte keine fehlermeldung bringen. Lediglich diese Zeile könnte erscheinen. postfix/postfix-script: warning: not owned by postfix: /var/lib/postfix/./.keep_mail-mta_postfix-0 Wenn alles gut gelaufen ist starten wir unseren Mailserver und die dazugehörigen Dienste. /etc/init.d/dovecot start /etc/init.d/saslauthd start /etc/init.d/postfix start Mailboxen können nun mit PostfixAdmin eingerichtet werden. Damit unser Mailserver auch bei einem Reboot des Systems automatisch gestartet wird, geben wir noch folgendes ein. rc-update add dovecot default rc-update add saslauthd default rc-update add postfix default Ich hoffe ich habe nichts vergessen und wünsche Euch viel Erfolg. Hinweis: Ich habe feststellen müssen, dass bei einigen Systemen die log-Datei von Dovecot in /var/log/ nicht mit den richtigen Rechten versehen wird. Warum das von System zu System so ist, konnte ich bisher nicht herausfinden. Das Problem der falschen Rechte bewirkt, das keine LogEinträge erstellt werden und das damit auch keine Mails abgeholt werden können.