Vorwort zum Mailserver
Schon einige Installationen habe ich auf meinem Linux-Debian 8-vServer gemacht. Aber eines hat da noch gefehlt: der Mailserver.
Die Konfiguration von Mailservern habe ich mir bereits schon mal angeschaut und auch einige Anleitungen durchgelesen. Leider hat sich rausgestellt, dass das Konfigurieren eines (sicheren!) Mailservers keine leichte Aufgabe ist und man sich dafür schon etwas Zeit nehmen sollte.
Das habe ich jetzt getan und möchte meinen Weg zum eigenen Mailserver erläutern.
Wesentlicher Bestandteil für mein Gelingen waren aber zwei hilfreiche Links:
Anleitung auf debinux
Anleitung von Carsten Heine
Vielen Dank für diese zwei sehr gute Artikel.
Da ich auf meinem Server Apache2 verwende, habe ich hier auch als Webserver Apache2 ausgesucht, um auch mir später eine einfachere Konfiguration zu ermöglichen, falls ich nochmals einen Server aufsetzen sollte. Zudem verwende ich den Text-Editor nano . Grundsätzlich könnt ihr aber den Text-Editor eurer Wahl nutzen.
Grundkonfiguration
Einige wenige Grundkonfigurationen an unserem Debian Jessie-System müssen wir vornehmen.
Ich werde in diesem Artikel folgende Beispieldaten verwenden:
- domain.tld (als Domain)
- mail.domain.tld (als FQDN)
- 1.2.3.4 (als IP-Adresse des Host)
Zuerst müssen wir unseren Hostnamen (der bei einem Mailserver wichtig ist) korrekt konfigurieren. Wichtig dabei ist aber auch der sogenannte DNS-Reverse Eintrag. Spam wird sehr häufig daran festgemacht, dass die DNS-Reverse-Prüfung fehlschlägt. Dabei wird zuerst anhand des Hostnamen die IP-Adresse ermittelt. Mithilfe der IP-Adresse wird dann wieder rum der Hostnamen ermittelt (DNS-Reverse). Der dann ermittelte Hostname muss mit dem Hostnamen des Mailservers übereinstimmen. Meistens kann man diesen DNS-Reverse-Eintrag bei seinem Webhoster ändern bzw. prüfen. So kann man sicherstellen, dass nicht jeder größere Mailanbieter die Mails direkt als Spam einstuft.
Außer dem Hostnamen konfigurieren wir auch unsere Zeitzone, in der der Mailserver laufen soll. Die beiden Einstellungen machen wir mit:
1 2 |
timedatectl set-timezone Europe/Berlin hostnamectl set-hostname mail.domain.tld |
Die hosts-Datei unter /etc/hosts sollte also aus mindestens folgenden Einträgen bestehen:
1 2 3 |
127.0.0.1 localhost 1.2.3.4 mail.domain.tld mail # ... |
Im Terminal können wir dann die korrekte Grundkonfiguration testen, indem wir die Ausgabe der folgenden Befehle prüfen:
1 2 3 4 5 6 |
# hostname -a mail # hostname -d domain.tld # hostname -f mail.domain.tld |
Webserver
Wie bereits erwähnt werden wir den Webserver mit folgenden Komponenten aufsetzen:
- Apache2
- PHP
- MySQL
Wer bereits einen Apache2-Webserver installiert hat, kann diesen problemlos nutzen. Wer PHP7 verwendet, den kann ich auch getrost mitteilen: Ich werde Anmerkungen machen, wie man bestimmte Dinge zu ändern hat, damit es auch mit PHP7 läuft. Der Großteil bleibt aber gleich.
Webserver mit oben genannten Komponenten wie folgt installieren und der Installation folgen:
1 |
apt-get -y install apache2 apache2-mpm-prefork libapache2-mod-php5 php-auth-sasl php-http-request php-mail php-mail-mime php-mail-mimedecode php-net-dime php-net-smtp php-net-socket php-net-url php-pear php-soap php5 php5-cli php5-common php5-curl php5-fpm php5-gd php5-imap php-apc php5-intl php5-mcrypt php5-mysql libawl-php php5-xmlrpc mysql-client mysql-server ca-certificates |
Nun erstellen wir ein selbst-signiertes SSL-Zertifikat mit dem wir später die Mails verschlüsseln wollen. Wenn ihr ein eigenes Zertifikat habt, könnt ihr das hier verwenden anstatt ein Neues anzulegen.
1 |
openssl req -new -newkey rsa:4096 -sha256 -days 1095 -nodes -x509 -subj "/C=DE/ST=STATE/L=CITY/O=MAIL/CN=`hostname -f`" -keyout /etc/ssl/`hostname -f`.key -out /etc/ssl/`hostname -f`.crt |
Durch `hostname -f` innerhalb des Kommandos, wird das SSL Zertifikat direkt für eure konfigurierte FQDN erstellt. Das Zertifikat sollte dann mit dem Namen eures FQDN unter /etc/ssl liegen. Nun schützen wir es noch vor fremden Zugriff:
1 |
chmod 600 /etc/ssl/`hostname -f`.key |
Habt ihr ein selbst-signiertes Zertifikat erstellt, dann solltet ihr dies noch registrieren:
1 2 |
cp /etc/ssl/`hostname -f`.crt /usr/local/share/ca-certificates/ update-ca-certificates |
Möglicherweise ist die Zeitzone in der PHP-Konfiguration noch nicht korrekt, deshalb gehen wir auf Nummer sicher und öffnen die PHP-Konfiguration:
1 2 3 4 |
# PHP 5 nano /etc/php5/apache2/php.ini # PHP 7 nano /etc/php/7.0/apache2/php.ini |
In der Datei suchen und ändern wir folgenden Eintrag ab:
1 |
date.timezone = "Europe/Berlin" |
Danach starten wir den Dienst neu:
1 |
systemctl reload php5-fpm.service |
Um die benötigten Module für Apache2 zu aktivieren, führen wir folgende Befehle aus:
1 2 3 4 5 6 7 |
a2enmod ssl a2enmod rewrite a2enmod headers # PHP 5 a2enmod php5 # PHP 7 a2enmod php7.0 |
Einzelne Webseiten des Apache2-Webservers bestehen aus sogenannten vHost-Dateien. Um später unser Webmail (Roundcube) und unsere Mail-Administration (ViMbAdmin) aufrufen zu können brauchen wir eine neue vHost-Datei. Die erstellen wir folgendermaßen:
1 |
nano /etc/apache2/sites-available/mail.domain.tld.conf |
Die Datei muss dann mit folgendem Inhalt befüllt werden. Vergisst nicht wie immer mail.domain.tld mit eurem FQDN zu ersetzen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<VirtualHost *:80> ServerName mail.domain.tld Redirect permanent / https://mail.domain.tld/ </VirtualHost> <VirtualHost *:443> SSLEngine on SSLCertificateFile /etc/ssl/mail.domain.tld.crt SSLCertificateKeyFile /etc/ssl/mail.domain.tld.key # Intermediate Zertifikat # SSLCertificateChainFile /etc/ssl/sub.class1.server.sha2.ca.pem # Root Zertifikat # SSLCACertificateFile /etc/ssl/ca.pem ServerName mail.domain.tld CustomLog ${APACHE_LOG_DIR}/mail.domain.tld_access.log combined ErrorLog ${APACHE_LOG_DIR}/mail.domain.tld_error.log DocumentRoot /var/www/html HostnameLookups Off UseCanonicalName Off ServerSignature Off Header always set Strict-Transport-Security "max-age=10886400" <Directory "/var/www/html"> SSLRequireSSL Options FollowSymLinks AllowOverride FileInfo Indexes Limit Require all granted DirectoryIndex index.php index.html index.htm </Directory> </VirtualHost> |
Im Anschluss müssen noch unsichere Verschlüsselungsverfahren deaktiviert werden. Dies machen wir in der Datei /etc/apache2/mods-enabled/ssl.conf . Dort wird folgender Text vor </IfModule> eingefügt.
1 2 3 |
SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:DES-CBC3-SHA:!ECDHE-RSA-DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS SSLHonorCipherOrder on SSLProtocol ALL -SSLv2 -SSLv3 |
Abschließend wird der vHost aktiviert und Apache2 neu geladen:
1 2 |
a2ensite mail.domain.tld systemctl reload apache2.service |
Eine Sache haben wir für den Webserver jetzt noch zu tun: Die MySQL-Datenbanken. Mit zwei einfachen Befehlen können wir die Datenbanken und pro Datenbank auch einen User anlegen. Der Platzhalter changeme bitte mit einem sicheren Passwort ersetzen und notieren. Am Besten wäre es natürlich wenn die Benutzer unterschiedliche Passwörter bekommen.
1 2 3 4 |
# ViMbAdmin: Datenbankname vimbadmin, Username vimbadmin mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE vimbadmin; GRANT ALL ON vimbadmin.* TO 'vimbadmin'@'localhost' IDENTIFIED BY 'changeme'; FLUSH PRIVILEGES;" # Roundcube: Datenbankname roundcube, Username roundcube mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE roundcube; GRANT ALL ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'changeme'; FLUSH PRIVILEGES;" |
Der Webserver steht nun, aber wir brauchen natürlich auch noch Anwendungen (Webmail, Administration).
Webanwendungen
Als Webanwendungen werden wir zwei Anwendungen installieren:
Roundcube Webmail
Als Webmail-Client, in dem für Mailboxen fröhlich Mails verschickt und empfangen werden können.
ViMbAdmin
Eine Administrationsanwendung, mit der einzelne Domains, Mailboxen, Alias etc. angelegt werden.
Roundcube Webmail
Zuerst müssen wir zwei Pakete installieren, um die Anwendungen runterladen zu können. Git und cURL:
1 |
apt-get install -y git curl |
Nun laden wir Roundcube herunter, entpacken die Dateien und benennen den Ordner um. Achtung: In diesem Artikel war die aktuellste Version 1.3.0 – bitte verwendet immer die aktuellste stabile Version. Diese ist zu finden auf https://roundcube.net/download/
1 2 3 |
cd /var/www/html wget --content-disposition -O - https://github.com/roundcube/roundcubemail/releases/download/1.3.0/roundcubemail-1.3.0-complete.tar.gz | tar xfvz - mv roundcubemail-* webmail |
Die Konfiguration ist nun relativ einfach – Dank des integrierten Installers. Den rufen wir ganz einfach über https://mail.domain.tld/webmail/installer auf. Auf der ersten Seite des Installers werden nun einige Prüfungen durchgeführt, ob Voraussetzungen zur Installation gegeben sind. Nicht alle Punkte müssen auf OK stehen, denn einige sind optional. Deshalb genau schauen, ob bei den Pflichtpunkten ein OK erscheint. Ist das gegeben, so könnt ihr mit einem Klick auf NEXT fortfahren.
Im zweiten Schritt „Create config“ sind nun viele Einstellungen zu sehen. Die meisten müssen nicht geändert werden. Folgende Punkte sollten angepasst werden:
- db_dsnw – Eure Datenbank-Daten eintragen. Hier muss eigentlich nur der Datenbankname und das Passwort des Benutzers eintragen, den wir im Abschnitt Webserver angelegt haben.
- default_host – tls://mail.domain.tld (IMAP Host)
- default_port – 143 (IMAP-Port)
- username_domain – domain.tld (Wenn ihr hier leer lässt, dann müssen Benutzer beim Einloggen die Domain eingeben z.B. mail@domain.tld
- smtp_server – tls://mail.domain.tld
- smtp_port – 587
- smtp_user – %u
- smtp_pass – %p
- language – de_DE
- Plugins – acl, archive, managesieve, zipdownload
Mit einem Klick auf CREATE CONFIG wird die Konfiguration unter /var/www/html/webmail/config/config.inc.php gespeichert. Wer ein selbst-signiertes Zertifikat verwendet, der muss die Konfiguration allerdings mit einem kleinen Code erweitern. Wer ein normales Zertifikat verwendet kann diesen Schritt überspringen. Wir öffnen die Datei mit:
1 |
nano /var/www/html/webmail/config/config.inc.php |
Und fügen ans Ende der Datei folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$config['imap_conn_options'] = array ( 'ssl' => array ( 'allow_self_signed' => true, ), ); $config['smtp_conn_options'] = array ( 'ssl' => array ( 'allow_self_signed' => true, ), ); |
Als nächsten Schritt müssen wir noch die Datenbank-Tabellen anlegen. Auch hier bringt Roundcube bereits eine vorgefertige Datei mit, die wir ganz einfach ausführen:
1 |
mysql --defaults-file=/etc/mysql/debian.cnf roundcube < /var/www/html/webmail/SQL/mysql.initial.sql |
Dass die Webseite nun auch vom Webserver ausgeführt werden kann, müssen wir den Webserver-User als Besitzer definieren:
1 |
chown -R www-data: /var/www/html |
Wenn ihr nun eure Webmail-Seite aufruft (https://mail.domain.tld/webmail) solltet ihr folgendes sehen können:
Bei mir persönlich war es der Fall, dass zuerst ein Internal Server Error (HTTP Error 500) aufgetreten ist. Ist dies bei euch auch der Fall, dann müssen aus der Datei /var/www/html/webmail/.htaccess folgende Codes entfernt werden:
1 |
Options +SymLinksIfOwnerMatch |
und
1 2 3 |
<IfModule mod_autoindex.c> Options -Indexes </ifModule> |
Ansonsten ist die Konfiguration von Roundcube Webmail erfolgreich.
ViMbAdmin
ViMbAdmin installieren wir mithilfe von Composer, einem Paket-Manager (wie z.B. apt) für PHP. Composer müssen wir dafür zuerst herunterladen und in den Ordner /usr/local/bin verschieben um Composer von überall aufrufen zu können.
1 2 |
curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer |
Und nun ViMbAdmin ins Verzeichnis /srv/vimbadmin herunterladen und installieren:
1 |
composer create-project opensolutions/vimbadmin /srv/vimbadmin -s dev -n --keep-vcs |
Unterverzeichnisse des neu angelegten Ordners müssen ebenfalls wie bei Roundcube für den Webserver-User freigegeben werden:
1 |
chown -R www-data: /srv/vimbadmin/{public,var} |
Danach wird noch eine symbolische Verknüpfung erstellt, um später vom Webserver die Anwendung ( http://mail.domain.tld/admin ) aufrufen zu können
1 |
ln -s /srv/vimbadmin/public/ /var/www/html/admin |
Nun muss das Ganze wieder konfiguriert werden. Dafür gibt es bereits eine vorgefertigte Beispielkonfiguration von ViMbAdmin, die wir kopieren und bearbeiten:
1 2 |
cp /srv/vimbadmin/application/configs/application.ini.dist /srv/vimbadmin/application/configs/application.ini nano /srv/vimbadmin/application/configs/application.ini |
Darin sind viele Einstellungsmöglichkeiten. Im folgenden Code sind nur die anzupassenden Schlüssel aufgeführt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
;; Die sontigen MySQL-Parameter wie Datenbankname und Benutzer (vimbadmin) stimmen bereits überein, daher brauche ich nur noch das Kennwort durch das vorab festgelegte zu ersetzen resources.doctrine2.connection.options.password = 'changeme' ;; Entspricht dem späteren vmail-Benutzer, dem stellvertretend alle Mailverzeichnisse "gehören" defaults.mailbox.uid = 5000 defaults.mailbox.gid = 5000 ;; Das Maildir wird im Dovecot-Format festgehalten defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u/Maildir:LAYOUT=fs" defaults.mailbox.homedir = "/var/vmail/%d/%u" ;; Einige Details, der Transport sollte per Standard lmtps sein, mit Zeiger auf den passenden Socket defaults.domain.transport = "lmtps:unix:private/dovecot-lmtp" ;; Erlaubt das endgültige Löschen von Mailboxen vom Dateisystem mailbox_deletion_fs_enabled = true ;; Den stärksten Hash-Algorithmus bietet Dovecot durch "doveadm" defaults.mailbox.password_scheme = "dovecot:SHA512-CRYPT" defaults.mailbox.dovecot_pw_binary = "/usr/bin/doveadm pw" ;; Hierbei handelt es sich um die Informationen der Willkommensmail. ;; "mail.%d" (= "mail.domain.tld") trifft für diesen Artikel zu, sollte dem eigenen Hostnamen nach angepasst werden. server.smtp.host = "mail.%d" server.smtp.port = "587" server.smtp.crypt = "TLS" ;; POP3 wird in diesem Artikel nicht verwendet/konfiguriert server.pop3.enabled = 0 ;; Wieder verwende ich "mail.%d" server.imap.host = "mail.%d" server.imap.port = "143" server.imap.crypt = "TLS" ;; Der Webmailer Roundcube ist unter URL/webmail server.webmail.host = "https://mail.%d/webmail" |
Jetzt brauchen wir noch ein Archiv-Verzeichnis, das wir wie folgt erstellen:
1 |
mkdir /srv/archives |
Auch hier haben wir wieder eine .htaccess Datei, die wir von ViMbAdmin vorgefertigt bekommen:
1 |
cp /srv/vimbadmin/public/.htaccess.dist /srv/vimbadmin/public/.htaccess |
Dann kann die MySQL-Datenbank initialisiert werden. Mit dem folgenden Befehl werden die Datenbanktabellen angelegt:
1 2 |
cd /srv/vimbadmin/ ./bin/doctrine2-cli.php orm:schema-tool:create |
Wurde alles erfolgreich erstellt, so erhalten wir diese Ausgabe:
1 2 3 |
ATTENTION: This operation should not be executed in a production environment. Creating database schema... Database schema created successfully! |
Wenn ihr die Webseite unter https://mail.domain.tld/admin aufruft, solltet ihr eine Installation angezeigt bekommen. Ist dies nicht der Fall und ihr erhaltet evtl. einen Fehler, der ungefähr index.php not found lautet. Muss in der .htaccess-Datei unter /srv/vimbadmin/public/.htaccess die Zeile RewriteRule ^.*$ /vimbadmin/index.php [NC,L] mit RewriteRule ^.*$ index.php [NC,L] ersetzt werden.
Folgt den Installationsanweisungen und erstellt einen administrativen Account für eure Administrationsanwendung.
Ein letzter Schritt muss dann noch getan werden, um die Installation von ViMbAdmin abzuschließen: Die Archivierungs- und Löschfunktion von ViMbAdmin wird mithilfe von Cronjobs automatisiert. Wir bearbeiten die Cronjob-Datei mit:
1 |
crontab -e |
Dort fügen wir an das Ende der Datei folgende Cronjobs hinzu:
1 2 3 4 5 6 7 8 |
# Die 10. Minute jeder 2. Stunde 10 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-archive-pendings # Die 30. Minute jeder 2. Stunde 30 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-restore-pendings # Die 50. Minute jeder 2. Stunde 50 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-delete-pendings # 3:15 AM 15 3 * * * /srv/vimbadmin/bin/vimbtool.php -a mailbox.cli-delete-pending |
Damit ist die Konfiguration der Webanwendungen abgeschlossen.
Mailserver
Als nächstes wird der Mailserver konfiguriert. Wir werden dem Mailserver für das Senden von Mails via SMTP und Abrufen via IMAP konfigurieren. Eine Anleitung, um die Mails per POP3 abrufen zu können wird noch folgen.
Folgende Pakete werden für den Mailserver benötigt:
- Postfix
- Dovecot
- Amavis (Inhaltsfilter)
Zuerst wird Postfix installiert. Dies machen wir natürlich mit apt:
1 |
apt-get install postfix-mysql postfix-pcre postfix |
Während der Paket-Installation wird man ggf. nach einem Server-Configuration-Type gefragt. Da wir im weiteren Verlauf die Konfiguration überschreiben werden, spielt die Auswahl keine Rolle.
Damit Postfix mit ViMbAdmin kommunzieren kann, um die dort konfigurierten Postfächer etc. abfragen zu können, müssen verschiedene Queries angelegt werden. Dafür brauchen wir ein Verzeichnis, das wir unter /etc/postfix/mysql erstellen.
1 |
mkdir /etc/postfix/mysql |
Nun erstellen wir die Query-Dateien. Bitte in jeder Datei den Platzhalter changeme mit dem MySQL-Benutzer-Kennwort des vimbadmin Benutzers ersetzen.
/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf
1 |
nano /etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf |
1 2 3 4 5 |
user = vimbadmin password = changeme hosts = 127.0.0.1 dbname = vimbadmin query = SELECT goto FROM alias WHERE address = '%s' AND active = '1' |
/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf
1 |
nano /etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf |
1 2 3 4 5 |
user = vimbadmin password = changeme hosts = 127.0.0.1 dbname = vimbadmin query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1' |
/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf
1 |
nano /etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf |
1 2 3 4 5 6 7 |
user = vimbadmin password = changeme hosts = 127.0.0.1 dbname = vimbadmin table = mailbox select_field = maildir where_field = username |
/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf
1 |
nano /etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf |
1 2 3 4 5 6 7 8 |
user = vimbadmin password = changeme hosts = 127.0.0.1 dbname = vimbadmin table = domain select_field = transport where_field = domain additional_conditions = and backupmx = '0' and active = '1' |
Da die Dateien sensible Daten beinhalten, werden diese vor fremden Zugriff geschützt:
1 2 3 |
chown -R root:postfix /etc/postfix/mysql chmod 750 /etc/postfix/mysql/ chmod 640 /etc/postfix/mysql/* |
Jetzt widmen wir uns der Postfix-Konfiguration. Diese werden wir zuerst löschen und mit unserer eigenen Konfiguration überschreiben. Dazu führen wir folgendes aus:
1 2 |
rm /etc/postfix/main.cf nano /etc/postfix/main.cf |
In dieser Datei können wir nun die neue Konfiguration einfügen. Dazu einfach den nachfolgenden Code einfügen und die Domain mail.domain.tld mit der eigenen FQDN ersetzen. Unter mydestination darf die Domäne domain.tld aber nicht aufgeführt sein!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
# SMTPd greeting banner: You MUST specify $myhostname at the start of the text. This is required by the SMTP protocol. smtpd_banner = $myhostname # Disable local biff service biff = no # Do not append the string $mydomain to -locally- submitted email. append_dot_mydomain = no # Readme directory readme_directory = /usr/share/doc/postfix # HTML directory html_directory = /usr/share/doc/postfix/html # Certificates smtpd_tls_cert_file = /etc/ssl/mail.domain.tld.crt smtpd_tls_key_file = /etc/ssl/mail.domain.tld.key # Opportunistic TLS. TLS auth only. smtpd_tls_security_level=may smtpd_tls_auth_only=yes smtpd_tls_exclude_ciphers = aNULL, DES, RC4, MD5 smtpd_tls_mandatory_exclude_ciphers = aNULL, DES, RC4, MD5 # TLS session cache for SMTPd smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache # Disallow SSLv2 and SSLv3, only accept secure ciphers smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3 smtpd_tls_mandatory_ciphers=high # Log TLS handling smtpd_tls_loglevel = 1 smtp_tls_loglevel = 1 # Delay reject until RCPT TO smtpd_delay_reject = yes # Enable elliptic curve cryptography, "ultra" needs more cpu time smtpd_tls_eecdh_grade = strong # Sender, recipient, client and data restrictions # !! non-FQDN HELOs are rejected on Port 25 only, see master.cf # Auth. Benutzer dürfen auch innerhalb der "mynetworks" nur von den Adressen senden, die ihnen zugehörig sind. smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch, # Erst jetzt werden "mynetworks" zugelassen # Unauth. Benutzer wie der Cron-Dienst können so weiterhin Mails versenden, etwa # als cron@fqdn permit_mynetworks, # Anderen unauth. Benutzern das Benutzen jeder Adresse verbieten. reject_sender_login_mismatch, # Alle auth. jetzt zulassen. permit_sasl_authenticated, # Nicht im System vorhandene Absender jetzt ablehnen reject_unlisted_sender, # Ablehnen, wenn die Sender-Domäne nicht existiert reject_unknown_sender_domain # Akzeptiere alle Empfänger, die ein authentifizierter Absender oder ein Absender aus "mynetworks" angibt smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, # Schnittstelle zu Dovecot, um die Quota live zu überprüfen (verhindert Bounces) check_policy_service unix:private/quota-status, # Ablehnen, wenn der HELO FQDN nicht aufzulösen ist reject_unknown_helo_hostname, # Ablehnen, wenn KEIN PTR zu dieser IP existiert # Verhindert nicht, dass ein FALSCHER PTR abgelehnt wird! # Hierfür würde "reject_unknown_client_hostname" verwendet. reject_unknown_reverse_client_hostname, # Kein offenes Relay reject_unauth_destination # Unauth. Benutzer dürfen ihre Befehle nicht "pipen" smtpd_data_restrictions = reject_unauth_pipelining, permit # Eine Art Tabelle mit vorhanden Identitäten und ihren Zugehörigkeiten smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf # Certificates smtp_tls_cert_file = /etc/ssl/mail.domain.tld.crt smtp_tls_key_file = /etc/ssl/mail.domain.tld.key # Opportunistic TLS. Use TLS if this is supported by the remote SMTP server, otherwise use plaintext. smtp_tls_security_level=may # TLS session cache for SMTP smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # A custom list with secure ciphers. tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA # Use the FQDN for the local hostname! myhostname = mail.domain.tld # Alias maps and database for -local- delivery only alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases # The domain name that locally-posted mail appears to come from, and that locally posted mail is delivered to. myorigin = mail.domain.tld # The list of domains that are delivered via the -local- mail delivery transport. No external domains like "domain.tld" belong here! "mail.domain.tld" is fine. mydestination = mail.domain.tld, localhost # We lookup MX records to send non-local mail, so this stays empty relayhost = # Trusted SMTP clients with more privileges. Trusted clients can relay mail. mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 # The maximal size of any -local- individual mailbox mailbox_size_limit = 0 # The maximal size of any -virtual- individual mailbox virtual_mailbox_limit = 0 # Handle Postfix-style extensions recipient_delimiter = + # The network interface addresses that this mail system receives mail on. inet_interfaces = all # Specifies what protocols Postfix will use when it makes or accepts network connections, and also controls what DNS lookups Postfix will use when it makes network connections. inet_protocols = ipv4 # VRFY command is not really needed anymore disable_vrfy_command = yes # Please say hello first... smtpd_helo_required = yes # The SASL plug-in type that the Postfix SMTP server should use for authentication. smtpd_sasl_type=dovecot # Where to passthrough our authentication information for the above plug-in smtpd_sasl_path=private/auth_dovecot # Enable SASL authentication in the Postfix SMTP server. smtpd_sasl_auth_enable = yes # Report the SASL authenticated user name in the smtpd Received message header. smtpd_sasl_authenticated_header = yes # Have Postfix advertise AUTH support in a non-standard way. broken_sasl_auth_clients = yes # The lookup tables that the proxymap server is allowed to access for the read-only service. proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps ## Virtual transport configuration # A prefix that the virtual delivery agent prepends to all pathname results from $virtual_mailbox_maps virtual_mailbox_base = / # THIS contains a list of domains we are the final destination for (unlike "mydestination"). virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf # Alias specific mail addresses or domains to other local or remote address. virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf # Specify a left-hand side of "@domain.tld" to match any user in the specified domain virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf # The minimum user ID value that the virtual delivery agent accepts virtual_minimum_uid = 5000 # We use "vmail" user with UID/GID 5000 to lookup tables virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 # The default mail delivery transport and next-hop destination for final delivery to domains listed with "virtual_mailbox_domains" virtual_transport = lmtps:unix:private/dovecot-lmtp transport_maps = mysql:/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf ## Queue configuration # Consider a message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit. maximal_queue_lifetime = 1d # Consider a bounce message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit. bounce_queue_lifetime = 1d # The time between deferred queue scans by the queue manager. queue_run_delay = 300s # The maximal/minimal time between attempts to deliver a deferred message. maximal_backoff_time = 1800s minimal_backoff_time = 300s # Maximum mail size (500 MiB) message_size_limit = 524288000 # This tarpits a client after 3 erroneous commands for 10s smtpd_soft_error_limit = 3 smtpd_error_sleep_time = 10s smtpd_hard_error_limit = ${stress?1}${stress:5} postscreen_access_list = permit_mynetworks # Drop connections from blacklisted servers with a 521 reply postscreen_blacklist_action = drop # Clean Postscreen cache after 24h postscreen_cache_cleanup_interval = 24h postscreen_dnsbl_ttl = 5m postscreen_dnsbl_threshold = 8 postscreen_dnsbl_action = enforce postscreen_dnsbl_sites = b.barracudacentral.org=127.0.0.2*7 dnsbl.inps.de=127.0.0.2*7 bl.mailspike.net=127.0.0.2*5 bl.mailspike.net=127.0.0.[10;11;12]*4 dnsbl.sorbs.net=127.0.0.10*8 dnsbl.sorbs.net=127.0.0.5*6 dnsbl.sorbs.net=127.0.0.7*3 dnsbl.sorbs.net=127.0.0.8*2 dnsbl.sorbs.net=127.0.0.6*2 dnsbl.sorbs.net=127.0.0.9*2 zen.spamhaus.org=127.0.0.[10;11]*8 zen.spamhaus.org=127.0.0.[4..7]*6 zen.spamhaus.org=127.0.0.3*4 zen.spamhaus.org=127.0.0.2*3 hostkarma.junkemailfilter.com=127.0.0.2*3 hostkarma.junkemailfilter.com=127.0.0.4*1 hostkarma.junkemailfilter.com=127.0.1.2*1 wl.mailspike.net=127.0.0.[18;19;20]*-2 hostkarma.junkemailfilter.com=127.0.0.1*-2 postscreen_greet_banner = $smtpd_banner postscreen_greet_action = enforce postscreen_greet_wait = 3s postscreen_greet_ttl = 2d postscreen_bare_newline_enable = no postscreen_non_smtp_command_enable = no postscreen_pipelining_enable = no postscreen_cache_map = proxy:btree:$data_directory/postscreen_cache |
Die Dienste, die Postfix bereitstellt, werden in /etc/postfix/master.cf definiert. Hierzu gibt es den folgenden Inhalt, der nicht angepasst und 1:1 übernommen werden kann.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# Postscreen on Port 25/tcp, filters zombies (spam machines) on first level with lowest costs. smtp inet n - n - 1 postscreen # Postscreen passes sane clients to the real SMTP daemon here. smtpd pass - - n - - smtpd # Reject non-FQDN HELOs on Port 25 (after passing postscreen process) -o smtpd_helo_restrictions=permit_mynetworks,reject_non_fqdn_helo_hostname -o smtpd_proxy_filter=127.0.0.1:10024 -o smtpd_client_connection_count_limit=10 -o smtpd_proxy_options=speed_adjust # For mail submitting users. Authenticated clients and known networks only. submission inet n - - - - smtpd -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o smtpd_proxy_filter=127.0.0.1:10025 -o smtpd_client_connection_count_limit=10 -o smtpd_proxy_options=speed_adjust # Handles TLS connections for postscreen to make them readable tlsproxy unix - - n - 0 tlsproxy # This implements an ad-hoc DNS white/blacklist lookup service dnsblog unix - - n - 0 dnsblog pickup fifo n - - 60 1 pickup cleanup unix n - - - 0 cleanup qmgr fifo n - n 300 1 qmgr tlsmgr unix - - - 1000? 1 tlsmgr 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 proxywrite unix - - n - 1 proxymap smtp unix - - - - - smtp relay unix - - - - - smtp showq unix n - - - - showq error unix - - - - - error retry unix - - - - - error discard unix - - - - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - - - - lmtp anvil unix - - - - 1 anvil scache unix - - - - 1 scache # LMTP with STARTTLS support, needs newer Dovecot versions lmtps unix - - - - - lmtp -o lmtp_use_tls=yes -o lmtp_tls_loglevel=1 -o lmtp_tls_CAfile=/etc/ssl/certs/ca-certificates.crt -o lmtp_enforce_tls=yes -o lmtp_tls_mandatory_protocols=!SSLv2,!SSLv3 -o lmtp_tls_protocols=!SSLv2,!SSLv3 -o lmtp_tls_mandatory_ciphers=high -o lmtp_tls_ciphers=high -o lmtp_send_xforward_command=yes -o lmtp_tls_security_level=encrypt -o lmtp_tls_note_starttls_offer=yes # Amavis reinjection, maximal 5 smtpd Prozesse, muss den Amavis Prozessen entsprechen! 127.0.0.1:10035 inet n - - - 5 smtpd -o smtpd_authorized_xforward_hosts=127.0.0.0/8 -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions= -o mynetworks=127.0.0.0/8 -o receive_override_options=no_unknown_recipient_checks |
Das war es auch schon mit Postfix, der SMTP-Server ist also nun vorbereitet. Weiter geht es mit dem Posteingang bzw. Dovecot …
Dovecot
Dovecot ist ein Mailserver-Paket zum Erstellen eines Posteingangsservers über IMAP und POP3. Wie gesagt behandeln wir in diesem Artikel aber nur IMAP. Eine Anleitung für POP3 folgt. Das aktuelle, stabile Dovecot-Paket erhalten wir von dem offiziellen Dovecot-Repository:
1 2 3 4 5 |
echo 'deb http://xi.rename-it.nl/debian/ stable-auto/dovecot-2.2 main' > /etc/apt/sources.list.d/dovecot.list wget -O - http://xi.rename-it.nl/debian/archive.key | apt-key add - apt-get update -y apt-get install --force-yes debian-dovecot-auto-keyring apt-get install dovecot-common dovecot-core dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-sieve dovecot-mysql<ins></ins> |
Für Dovecot wird ein eigener Benutzer vmail benötigt, den wir wie folgt anlegen:
1 2 3 4 |
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -d /var/vmail mkdir /var/vmail chown -R vmail: /var/vmail/ |
Wie bei Postfix auch, werden wir die Konfiguration von Dovecot löschen und komplett überschreiben:
1 2 |
rm /etc/dovecot/dovecot.conf nano /etc/dovecot/dovecot.conf |
Neben der Platzhalter-Mailadresse mail.domain.tld muss auch die Postmaster-Mailadresse angepasst werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
auth_mechanisms = plain login disable_plaintext_auth = yes login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k" mail_home = /var/vmail/%d/%n mail_location = maildir:~/Maildir:LAYOUT=fs mail_uid = vmail mail_gid = vmail # notify wird von mail_log benötigt. mail_log informiert in diesem Fall über DELETE und EXPUNGE (weiter unten) mail_plugins = quota acl mail_log notify auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@ ssl_protocols = !SSLv3 !SSLv2 ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA log_timestamp = "%Y-%m-%d %H:%M:%S " passdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } # Der "namespace separator" sollte "/" lauten, da es zusammen mit der ACL zu Konflikten käme, wenn der Benutzername das Zeichen "." enthält. namespace inbox { inbox = yes location = separator = / mailbox Trash { auto = subscribe special_use = \Trash } mailbox "Deleted Messages" { special_use = \Trash } mailbox "Gelöschte Objekte" { special_use = \Trash } mailbox "Papierkorb" { special_use = \Trash } mailbox Archive { auto = subscribe special_use = \Archive } mailbox Archiv { special_use = \Archive } mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } mailbox "Gesendet" { special_use = \Sent } mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Entwürfe { special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } prefix = } # Dieser Namespace wird für die ACL Erweiterung benötigt. # Freigegebene Ordner erscheinen automatisch in der Ordnerliste. namespace { type = shared separator = / prefix = Shared/%%u/ location = maildir:%%h/Maildir:LAYOUT=fs:INDEXPVT=~/Maildir/Shared/%%u subscriptions = yes list = yes } protocols = imap sieve lmtp service dict { unix_listener dict { mode = 0660 user = vmail group = vmail } } service auth { unix_listener /var/spool/postfix/private/auth_dovecot { group = postfix mode = 0660 user = postfix } unix_listener auth-master { mode = 0600 user = vmail } unix_listener auth-userdb { mode = 0600 user = vmail } user = root } service managesieve-login { inet_listener sieve { port = 4190 } service_count = 1 process_min_avail = 2 vsz_limit = 128M } service managesieve { process_limit = 256 } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } user = vmail } listen = * ssl_cert = </etc/ssl/mail.domain.tld.crt ssl_key = </etc/ssl/mail.domain.tld.key userdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } protocol imap { mail_plugins = quota imap_quota imap_acl acl mail_log notify } protocol lmtp { mail_plugins = quota sieve acl notify auth_socket_path = /var/run/dovecot/auth-master postmaster_address = postmaster@domain.tld } protocol sieve { managesieve_logout_format = bytes=%i/%o } protocol lda { mail_plugins = sieve quota acl notify postmaster_address = postmaster@domain.tld } plugin { mail_log_events = delete undelete expunge # Um quasi-öffentliche Ordner für authentifizierte Benutzer via ACL zu erstellen acl_anyone = allow # Wird automatisch verwaltet und beinhaltet eine Übersicht der Freigaben acl_shared_dict = file:/var/vmail/shared-mailboxes.db # In jeder Mailbox wird von Dovecot eine Datei gepflegt, die die Freigaben regelt acl = vfile quota = maildir:User quota # Die Ordner Trash und Sent erhalten +10% auf die Quota quota_rule = Trash:storage=+10%% quota_rule = Sent:storage=+10%% # Eigene Sieve Filter liegen im Heimverzeichnis sieve = ~/sieve/dovecot.sieve sieve_dir = ~/sieve # Der globale Filter außerhalb sieve_before = /var/vmail/before.sieve sieve_max_script_size = 1M sieve_quota_max_scripts = 0 sieve_quota_max_storage = 0 # Auch dann weitermachen, wenn die Quota nicht ermittelt werden kann # Gilt für den von Dovecot bereitgestellten Postfix policy service quota_status_success = DUNNO quota_status_nouser = DUNNO quota_status_overquota = "552 5.2.2 Mailbox is over quota" } service quota-status { executable = quota-status -p postfix unix_listener /var/spool/postfix/private/quota-status { group = postfix mode = 0660 user = postfix } client_limit = 1 } |
Dovecot braucht auch Zugriff auf die MySQL-Datenbank um Daten abfragen zu können (Postfächer etc.). Das wird in einer eigenen Datei abgebildet, die sich unter /etc/dovecot/dovecot-mysql.conf befindet:
1 |
nano /etc/dovecot/dovecot-mysql.conf |
Und nicht vergessen changeme mit dem korrekten vimbadmin-Passwort zu ersetzen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
driver = mysql connect = "host=localhost dbname=vimbadmin user=vimbadmin password=changeme" default_pass_scheme = SHA512-CRYPT password_query = SELECT username as user, password as password, \ homedir AS home, \ maildir AS mail, uid, gid, \ concat('*:bytes=', quota) as quota_rule \ FROM mailbox WHERE username = '%Lu' AND active = '1' \ AND ( access_restriction = 'ALL' OR LOCATE( '%Us', access_restriction ) > 0 ) user_query = SELECT homedir AS home, \ maildir AS mail, uid, gid, \ concat('*:bytes=', quota) as quota_rule \ FROM mailbox WHERE username = '%u' iterate_query = SELECT username FROM mailbox; |
Wieder sensible Daten, deshalb wird damit auch korrekt umgegangen: Datei schützen und dem vmail User zuweisen.
1 2 |
chown root:vmail /etc/dovecot/dovecot-mysql.conf chmod 640 /etc/dovecot/dovecot-mysql.conf |
Mithilfe von Sieve-Scripts können bestimmte Automatismen definiert werden. Zum Beispiel, dass Spam-Mails direkt in den Junk-Ordner verschoben werden. So ein Script werden wir in die Datei /var/vmail/before.sieve schreiben.
1 |
nano /var/vmail/before.sieve |
Mit folgendem Inhalt:
1 2 3 4 |
require "fileinto"; if header :contains "X-Spam-Flag" "YES" { fileinto "Junk"; } |
Die sieve-Datei muss dann noch kompiliert werden und dem vmail-User zugewiesen werden:
1 2 3 4 |
# sievec erstellt eine neue Datei before.svbin sievec /var/vmail/before.sieve # Beide Dateien möchten wir vmail zuweisen chown vmail: /var/vmail/before.* |
Damit haben wir auch die Konfiguration von Dovecot geschafft. Dem eigenen Mailserver sind wir schon näher. Kommen wir zum letzten Schritt: dem Inhaltsfilter …
Inhaltsfilter
Den Inhaltsfilter werden wir mit den Paketen amavis, clamav und spamassassin umsetzen. Diese Pakete müssen wie folgt mit apt installiert werden. Achtung: Will man in eine RAR-Datei gepackte Anhänge ebenfalls überprüfen/scannen, so muss man das non-free Debian-Repository aktiviert werden. Ob dies aktiviert ist, könnt ihr in eurer sources.list Datei sehen.
1 |
apt-get install zip rar unrar unzip p7zip-full amavisd-new clamav-daemon spamassassin libdbi-perl libdbd-mysql-perl |
Zuerst wird der Amavis-Filter konfiguriert. Dafür gibt es eine nach der Installation bereits vorhandene Datei, die wir bearbeiten:
1 |
nano /etc/amavis/conf.d/50-user |
Die Datei sollte gründlich durchgelesen werden und seine Daten anpassen bzw. ergänzen – wie auch in den Konfigurationsdateien zuvor auch. Die sollte dann danach ungefähr so aussehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
use strict; # Maximale Anzahl an Prozessen, die Amavis vorhält. # Siehe auch Anmerkung in master.cf im Listener für Reinjection $max_servers = 5; # Amavis wird mitgeteilt, wie auf die MySQL-Datenbank zugegriffen werden kann. # "changeme" bitte anpassen @lookup_sql_dsn = ( ['DBI:mysql:database=vimbadmin;host=127.0.0.1;port=3306', 'vimbadmin', 'changeme']); # Hierdurch ermittelt Amavis die lokalen Domänen $sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)'; # Ein Listener für die Herkunft "external" sowie "submission" $inet_socket_port = [10024,10025]; # Mails werden auf Port 10035 zurückgeführt $forward_method = 'smtp:[127.0.0.1]:10035'; $notify_method = 'smtp:[127.0.0.1]:10035'; # Listener :10025 bekommt eine eigene Policy $interface_policy{'10025'} = 'SUBMISSION'; $policy_bank{'SUBMISSION'} = { # Diese Mails kommen von einem vertrauten System originating => 1, # 7-bit Kodierung erzwingen, damit ein späteres Kodieren die DKIM-Signatur nicht zerstört smtpd_discard_ehlo_keywords => ['8BITMIME'], # Viren auch von auth. Sendern ablehnen final_virus_destiny => D_REJECT, final_bad_header_destiny => D_PASS, final_spam_destiny => D_PASS, terminate_dsn_on_notify_success => 0, warnbadhsender => 1, }; # "mail.domain.tld" bitte anpassen $myhostname = "mail.domain.tld"; # Wer wird über Viren, Spam und "bad header mails" informiert? # Den Benutzer "postmaster" bitte nachträglich in ViMbAdmin erstellen (Alias möglich) $virus_admin = "postmaster\@$mydomain"; $spam_admin = "postmaster\@$mydomain"; $banned_quarantine_to = "postmaster\@$mydomain"; $bad_header_quarantine_to = "postmaster\@$mydomain"; # DKIM kann verifiziert werden. $enable_dkim_verification = 1; # AR-Header darf gesetzt werden $allowed_added_header_fields{lc('Authentication-Results')} = 1; # DKIM-Signatur # Gilt nur, wenn "originating = 1", ergo für die SUBMISSION policy bank # "default" ist hierbei der Selector # "domain.tld" als Domäne bitte anpassen # "enable_dkim_signing" nur "1" setzen, wenn Mails wirklich signiert werden sollen. # "/var/lib/amavis/db/dkim_domain.tld.key" sollte ebenso dem Namen der Domäne angepasst werden. # Die TTL beträgt im Beispiel 7 Tage # relaxed/relaxed beschreibt die Header/Body canonicalization, relaxed ist weniger restriktiv $enable_dkim_signing = 1; dkim_key('domain.tld', 'default', '/var/lib/amavis/db/dkim_domain.tld.key'); @dkim_signature_options_bysender_maps = ( { '.' => { ttl => 7*24*3600, c => 'relaxed/relaxed' } } ); # Viren- und Spamfilter ACL; werden automatisch ermittelt @bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re); @bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re); #------------ Do not modify anything below this line ------------- 1; # ensure a defined return |
Das in Amavis beinhaltete DKIM verhindert das Empfangen von Mails von gefälschten Mailadressen, wie es häufig in Phishing-Mails der Fall ist. Außerdem signiert DKIM die eigenen Mails, sodass der andere Mailserver weiß, dass die Mail auch wirklich von dir stammt. Für die DKIM-Signatur brauchen wir also einen sicheren Schlüssel. In der Amavis-Konfiguration oben sollte dieser Schlüsselname bereits mit der eigenen Domain angepasst sein. Diesen 2048 Bit langen Schlüssel erstellen wir mit:
1 |
amavisd-new genrsa /var/lib/amavis/db/dkim_domain.tld.key 2048 |
Wir lassen uns den angelegten Schlüssel nun wie folgt anzeigen:
1 |
amavisd-new showkey domain.tld |
Die Ausgabe dieses Kommandos sollten wir kopieren und als DNS-Record auf dem DNS-Server eintragen. Solltet ihr keinen Zugriff haben einen TXT-Record anzulegen (wegen dem Hoster o.ä), solltet ihr die DKIM-Signatur deaktivieren.
Zum Konfigurieren des Virenscanners ClamAV für Amavis, müssen wir noch folgende Einstellungen durchführen:
1 2 3 4 |
# User clamav der Gruppe amavis hinzufügen adduser clamav amavis # Gestatte Gruppen, denen clamav zugehört, das Scannen sed -i 's/AllowSupplementaryGroups false/AllowSupplementaryGroups true/g' /etc/clamav/clamd.conf |
Dienste neu starten
Zu guter Letzt sollten wir nun mal alle Dienste neustarten, sodass alle Dienste ihre neuen Konfigurationen übernehmen. Das machen wir mit:
1 |
systemctl restart {dovecot,postfix,amavis,spamassassin,clamav-daemon,apache2,php5-fpm,mysql} |
Euer Werk könnt ihr euch nun ansehen und auch testen. Unter https://mail.domain.tld/admin könnt ihr ein Postfach anlegen. Dieses Postfach könnt ihr dann auf https://mail.domain.tld/webmail verwenden, um Mails abzurufen oder zu senden.
Externe Mail-Clients
In externen Mail-Clients wie Outlook, Thunderbird o.ä könnt ihr eure neu-angelegte Mailadresse (Postfach) hinzufügen und darüber Mails empfangen und senden. Dafür verwendet ihr folgende Daten:
- Senden: SMTP auf Port 587 (Verschlüsselung: STARTTLS) – Den Standard-SMTP-Port 25 bitte nie verwenden.
- Empfangen: IMAP auf Port 143 (Verschlüsselung: STARTTLS)
Schlusswort
Ich hoffe ihr habt einiges verstanden und habt euren Mailserver erfolgreich zum Laufen gebracht. Eine etwas detaillierte Anleitung mit einer Menge Hintergrundinfos bekommt ihr auf Debinux.
Es gibt ein Fehler bei SSLCertificateFile /etc/ssl/mail.domain.tld.crt
bei der vhost Datei. Und zwar erstellen wir ein mail.domain.tld.cer und dieses stimmt nicht überein.
Danke für deinen Hinweis.
Die Apache-Konfiguration benötigt eine .crt-Datei. Deshalb habe ich das Tutorial nochmal so angepasst, dass wir anfangs ein .crt-Zertifikat erstellen.
Man kann aber auch einfach das .cer-Zertifikat nehmen und die Dateiendung ändern, das funktioniert ebenfalls 😉
Nur „update-ca-certificates“ nicht vergessen.
Hallo Yannicl,
erstmal danke für die gute und zusammengefasste Installations Anleitung. Ich hab dennoch beim Installieren einen Fehler bzw. mehrere. Erstmals habe ich ein Problem mit Roundcube dieser sagt das „Verbindung zum Speicherserver fehlgeschlagen.“ . Nun in den Logs sagt dieser folgendes aus „IMAP Error: Login failed for admin@domain.com from 1.1.1.1. Could not connect to tls://mail.domain.com:143: php_network_getaddresses: getaddrinfo failed: Name or service not known in /var/www/html/webmail/program/lib/Roundcube/rcube_imap.php on line 196 (POST /webmail/?_task=login&_action=login)“.
Ich komme hier jedoch nicht mehr weiter, wo genau mein Fehler liegt. Könnten Sie mir hier helfen?
Hallo TastaMax,
das ist jetzt erstmal eine blöde Frage, die ich allerdings aufgrund der „Fehlermeldung“ stellen muss: Anstatt „domain.com“ hast du schon deine Domain bei der Installation von Roundcube angegeben oder? Ansonsten kann er die Adressinformationen von „domain.com“ nicht ermitteln, weil er natürlich keinen DNS-Eintrag für mail.domain.com finden kann.
Gruß Yannic