{"id":605,"date":"2023-10-09T15:55:49","date_gmt":"2023-10-09T13:55:49","guid":{"rendered":"http:\/\/www.tippex.net\/?p=605"},"modified":"2025-07-22T16:07:52","modified_gmt":"2025-07-22T14:07:52","slug":"von-der-cloud-in-die-cloud-migration-von-m365-zu-postfix-nextcloud","status":"publish","type":"post","link":"https:\/\/www.tippex.net\/?p=605","title":{"rendered":"Von der Cloud in die Cloud: Migration von M365 zu Postfix &#038; Nextcloud"},"content":{"rendered":"\n<p>F\u00fcr mich stand gerade mal ein gr\u00f6sseres Projekt an. Seit nun ca. 2 Jahren war ich Kunde bei Microsoft, genauer gesagt bei Ihrem SaaS Dienst M365, bisher bekannt als O365. Im Grunde war ich auch zufrieden. Die Dienste, wie Mail, Onedrive und Teams liefen ohne Ausf\u00e4lle. Zumindest ohne dass ich es bemerkt h\u00e4tte. <\/p>\n\n\n\n<p>Es kam aber der Tag, an dem bekannt wurde, dass Microsoft einen Master Key <a href=\"https:\/\/www.heise.de\/news\/Neue-Erkenntnisse-Microsofts-Cloud-Luecken-viel-groesser-als-angenommen-9224640.html\">&#8222;verloren&#8220;<\/a> hat. Dies ist aber nicht Microsoft selbst aufgefallen, sondern einem ihrer Kunden, der das kostenpflichte Addons zum Auswerten der Logs gebucht hatte. In eben diesen Logs hatte der Kunde verd\u00e4chtiges Verhalten aufgesp\u00fcrt und dies auch direkt an Microsoft gemeldet. Wie man sich nun schon fast denken kann, hat Microsoft dies ersteinmal nicht gross nach aussen kommuniziert. Intern hat man sich auf die Suche nach betroffenen Kunden gemacht und diese direkt kontaktiert. Es sollen angeblich nur um die 25 gewesen sein, haupts\u00e4chlich Beh\u00f6rden, auch in Deutschland. Ein Skandal, der verwunderlicher weise nicht viel Aufsehen erregte, ausser in Fachkreisen. Der Masterkey war so m\u00e4chtig, dass einige Security Experten sogar davon sprachen, Microsoft h\u00e4tte seine Kronjuwelen verloren. <strong>-B\u00c4M-<\/strong> Ein Wirkungstreffer sollte man meinen. Aber nicht so bei Microsoft. Sie haben das ganze verharmlost. <\/p>\n\n\n\n<p>Nun zur\u00fcck zu meinem Projekt. Ich war von Microsofts Sicherheitspolitik noch nie \u00fcberzeugt. Anstatt sichere Produkte mit dem Siegel &#8222;Secure by Design&#8220; auf den Markt zu bringen, war bzw. ist die g\u00e4ngige Praxis leider genau das Gegenteil. Die Standardeinstellungen sind l\u00f6chrig wie der schweizer K\u00e4se. Features sind den Redmondern wichtiger als Sicherheit.<\/p>\n\n\n\n<p>Als langj\u00e4hriger Admin weiss ich nat\u00fcrlich, an welchen Schrauben man drehen sollte, damit das Schlimmste abgewendet werden kann. Aber es ist immer mit extra Aufwand verbunden und nat\u00fcrlich auch einem Komfortverlust.<\/p>\n\n\n\n<p>Mit dem neuerlichem Vorfall bei Microsoft habe ich mein (privates) Vertrauen in diese Firma nun endg\u00fcltig verloren. Ich wollte weg, weit weg. Naja, sinnbildlich gesprochen.<\/p>\n\n\n\n<p>Ich machte mir ein paar Gedanken, wie es f\u00fcr meine Mails und Daten nun weitergehen sollte und entschloss mich, auf Postfix und Nextcloud setzen. Beides Open Source, beides seit Jahren erprobt und millionenfach eingesetzt, weltweit. Es gibt zahlreiche Dokumentationen, die einem die Installation und Konfiguration erleichtern w\u00fcrden.<\/p>\n\n\n\n<p>Mir ist nat\u00fcrlich klar, dass mit solch einem Projekt die Sicherheit nicht frei Haus kommt. Ich bin daf\u00fcr verantwortlich, mit allen Pros und Cons. Aber daf\u00fcr bin ich auch frei, zumindest gef\u00fchlt.<\/p>\n\n\n\n<p>In diesem Tutorial m\u00f6chte ich euch zeigen, wie auch ihr diese Freiheit erlangen k\u00f6nnt \ud83d\ude09 Nur Spass. Hier wird keiner erl\u00f6st, nur an die Hand genommen.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Voraussetzung:<\/h2>\n\n\n\n<p>Ihr ben\u00f6tigt einen Server, der aus dem Internet erreichbar ist. Es gibt g\u00fcnstige VPS Angebot schon ab 4-5\u20ac im Monat. F\u00fcr den Heimgebrauch v\u00f6llig ausreichend. Im Tutorial wird Ubuntu 22.04 verwendet. Gezeigte Befehle sollten aber auf allen aktuellen Debian basierten Systemen funktionieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ziel:<\/h2>\n\n\n\n<p>In diesem Tutorial zeige ich euch, wie ihr Postfix(MTA) mit Dovecot(MDA\/LDA) und die Benutzerspeicherung in eine MySQL Datenbank bewerkstelligt. Ausserdem richten wir das automatische Virenscanning via ClamAV ein und filtern unsere Mails nach SPAM via Spamassassin. Auch das Signieren ausgehender mails via OpenDKIM werde ich beschreiben. Zus\u00e4tlich richten wie Dovecot-Sieve ein und k\u00f6nnen so bereits eingehende Mails nach bestimmten Kriterien filtern und in entsprechende Mailbox-Ordnern einsortieren. Am Ende des Tutorials sichern wir unseren Server noch etwas weiter ab, sofern noch nicht selbst von eurer Seite geschehen.<\/p>\n\n\n\n<p>Die Installation bzw. Einrichtung von Nextcloud als Ersatz f\u00fcr OneDrive werde ich in diesem Tutorial nicht besprechen. Dazu verweise ich auf diesen <a href=\"https:\/\/apfelcast.com\/nextcloud-27-hub-5-installation-einfache-anleitung-inkl-domain-ssl-auf-linux-server\/\" data-type=\"link\" data-id=\"https:\/\/apfelcast.com\/nextcloud-27-hub-5-installation-einfache-anleitung-inkl-domain-ssl-auf-linux-server\/\">Artikel<\/a>.Das Video ist sehr ausf\u00fchrlich und die n\u00f6tigen Befehle sind sehr gut dokumentiert.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Inhaltsverzeichnis:<\/h2>\n\n\n\n<p>   1.) <a href=\"#paket\">Pakete installieren<\/a><\/p>\n\n\n\n<p>   2.) <a href=\"#zerifikate\">Zertifikate<\/a><\/p>\n\n\n\n<p>   3.) <a href=\"#mysql\">MySQL<\/a><\/p>\n\n\n\n<p>   4.) <a href=\"#postfix\">Postfix<\/a><\/p>\n\n\n\n<p>   5.) <a href=\"#dovecot\">Dovecot<\/a><\/p>\n\n\n\n<p>   6.) <a href=\"#spamassassin\">Spamassassin<\/a><\/p>\n\n\n\n<p>   7.) <a href=\"#dovecot-sieve\">Dovecot-Sieve Filter<\/a><\/p>\n\n\n\n<p>   8.) <a href=\"#opendkim\">OpenDKIM<\/a><\/p>\n\n\n\n<p>   9.) <a href=\"#absicherung\">Serverabsicherung<\/a><\/p>\n\n\n\n<p>  10.) <a href=\"#todos\">To do&#8217;s<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"pakete\">1.) Pakete installieren<\/h2>\n\n\n\n<p>Folgende Pakete werden installiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql mysql-server dovecot-sieve<\/code><\/pre>\n\n\n\n<p>Wir w\u00e4hlen &#8222;Internet Site&#8220; aus.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1017\" height=\"711\" src=\"https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik.png\" alt=\"\" class=\"wp-image-627\" srcset=\"https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik.png 1017w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-300x210.png 300w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-150x105.png 150w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-768x537.png 768w\" sizes=\"auto, (max-width: 1017px) 100vw, 1017px\" \/><\/figure>\n\n\n\n<p>Hier tragen wir unsere Domain ein, keinen Hostnamen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"953\" height=\"503\" src=\"https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-1.png\" alt=\"\" class=\"wp-image-628\" srcset=\"https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-1.png 953w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-1-300x158.png 300w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-1-150x79.png 150w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-1-768x405.png 768w\" sizes=\"auto, (max-width: 953px) 100vw, 953px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zertifikate\">2.)Zertifikat besorgen<\/h2>\n\n\n\n<p>F\u00fcr Postfix und Dovecot ben\u00f6tigen wir ein SSl Zertifikat. Dieses l\u00e4sst sich kostenlos \u00fcber <a href=\"https:\/\/letsencrypt.org\/\">Let&#8217;s Encrypt<\/a> beziehen. Auf Ubuntu 22.04 l\u00e4sst sich der Certbot Service, welcher zum Abholen der Zertifikate ben\u00f6tigt wird, wie folgt installieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo snap install --classic certbot\nsudo ln -s \/snap\/bin\/certbot \/usr\/bin\/certbot<\/code><\/pre>\n\n\n\n<p>Weiter geht es dann mit folgendem Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo certbot certonly --standalone<\/code><\/pre>\n\n\n\n<p>Damit haben wir den Private Key und das Zertifikat unter \/etc\/letsencrypt\/live\/example.com\/ liegen.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"mysql\">3.) MySQL<\/h2>\n\n\n\n<p>Sofern ihr bei der Installation von MySQL via apt nicht danach gefragt wurdet ein root Passswort anzulegen, k\u00f6nnt ihr dies mit nur weng Aufwand nachholen. Einen Artikel dazu habe ich <a href=\"https:\/\/www.tippex.net\/?p=602\" data-type=\"link\" data-id=\"https:\/\/www.tippex.net\/?p=602\">hier<\/a> geschrieben.<\/p>\n\n\n\n<p>Nachdem dies erledigt ist loggen wir uns zun\u00e4chst beo MySQL ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mysql -u root -p<\/code><\/pre>\n\n\n\n<p>Wir legen uns eine komplett neue Datenbank namens <em><strong>mailserver<\/strong><\/em> an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE mailserver;<\/code><\/pre>\n\n\n\n<p>Nun legen wir einen User an, der sp\u00e4ter von Postfix bzw. Dovecot ben\u00f6tigt wird, um sich zu authentisieren.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'password';<\/code><\/pre>\n\n\n\n<p>Dieser user ben\u00f6tigt nur Rechte zum Abfragen auf die Datenbank, also &#8222;Select&#8220;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1';\n\t\nmysql &gt; FLUSH PRIVILEGES;\n<\/code><\/pre>\n\n\n\n<p>Als n\u00e4chstes legen wir eine Tabelle an, die unsere Domain(s) beinhalten wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE `virtual_domains` (\n  `id` int(11) NOT NULL auto_increment,\n  `name` varchar(50) NOT NULL,\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;<\/code><\/pre>\n\n\n\n<p>Als n\u00e4chstes folgt eine Tabelle, die alle Emailadressen und zugeh\u00f6rige Passw\u00f6rter enhalten wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE `virtual_users` (\n  `id` int(11) NOT NULL auto_increment,\n  `domain_id` int(11) NOT NULL,\n  `password` varchar(106) NOT NULL,\n  `email` varchar(100) NOT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `email` (`email`),\n  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;<\/code><\/pre>\n\n\n\n<p>Nun zum Schluss eine weiter Tabelle, die Aliase beherbergt. Aliase sind Weiterleitungsadressen. Wenn z.B. eure Hauptadresse test@example.com ist, dann ist es m\u00f6glich via Alias z.B. postmaster@example.com and die Hauptadresse weiterzuleiten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE `virtual_aliases` (\n  `id` int(11) NOT NULL auto_increment,\n  `domain_id` int(11) NOT NULL,\n  `source` varchar(100) NOT NULL,\n  `destination` varchar(100) NOT NULL,\n  PRIMARY KEY (`id`),\n  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;<\/code><\/pre>\n\n\n\n<p>Nun bef\u00fcllen wir unsere Tabelle <em><strong>virtual_domains<\/strong><\/em> mit den Domains, die wir sp\u00e4ter als Maildomains nutzen wollen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO `servermail`.`virtual_domains` (`id` ,`name`) VALUES\n('1', 'example.com'),\n('2', example2.com');<\/code><\/pre>\n\n\n\n<p>Zu einem sp\u00e4teren Zeitpunkt kann man immer noch neue Domains hinzuf\u00fcgen.<\/p>\n\n\n\n<p>An dieser Stelle m\u00fcssen wir MySQL verlassen, um uns f\u00fcr jeden User ein sicheres Passwort zu generieren, bzw. aus dem Passwort einen Hash. Nicht das Passwort, sondern der Hash wird in der Tabelle gespeichert.<\/p>\n\n\n\n<p>Der Hash wird mit dem tool <em><strong>doveadm<\/strong><\/em> generiert:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo doveadm pw -s SHA512-CRYPT<\/code><\/pre>\n\n\n\n<p>Nachdem Ihr den Befehl ausgef\u00fchrt habt m\u00fcsst Ihr 2x das Passwort eingeben. Danach wird auch ein \u00e4hnlicher Hash, wie hier angezeigt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{SHA512-CRYPT}$6$WHttEk\/nzN7fk4TM$x\/KN3.UCQA1DH3euDMpcaAij520HBOhTtyWqf2ALWbCk\/CZLnRtbNKyAOJIjGCmNIMAtfpctOXNfvFcu7PxmQ<\/code><\/pre>\n\n\n\n<p>Der eigentliche Hash, also den Teil, den wir in die Tabelle in MySQL eingeben, ist alles rechts von der letzten geschweiften Klammer ( } ).<\/p>\n\n\n\n<p>Im Folgenden erzeugen wir einen Eintrag mit dem User test@example.com und seinem zugeh\u00f6rigen Passwort. Dies sind also die Logindaten f\u00fcr den sp\u00e4teren Einsatz im Mailclient.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO `servermail`.`virtual_users`(`id`, `domain_id`, `password` , `email`) VALUES\n('1','1','$6$rUbxIRkrdao.Gzwm$McnUc0DZ4mMZ7H1mPO3yYgytJ0s5Z3KqTilwUNWWpbHVdStpj87Vz3u.EPAEoYvq\/EZsdzGOc0\/vt7iMJRyPD.', 'test@example.com');<\/code><\/pre>\n\n\n\n<p>Zum \u00fcberpr\u00fcfen, ob obige Daten auch correct in die Tabelle eingtragen wurden, kann man folgenden Befehl nutzen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM mailserver.virtual_users;<\/code><\/pre>\n\n\n\n<p>Einen Alias k\u00f6nnen wir wie folgt hinzuf\u00fcgen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO mailserver.virtual_aliases (domain_id, source, destination) VALUES ('1', 'alias@example.com', 'test@example.com');<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"postfix\">4.) Postfix<\/h2>\n\n\n\n<p>Nun ist die Konfiguration von Postfix an der Reihe. Bevor wir aber die Konfigdateien editieren, machen wir ein Backup:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/etc\/postfix\nsudo cp \/etc\/postfix\/main.cf \/etc\/postfix\/main.cf.bak\nsudo cp \/etc\/postfix\/master.cf \/etc\/postfix\/materer.cf.bak<\/code><\/pre>\n\n\n\n<p>Richtet eure main.cf wie folgt ein. Achtet dabei auf den individuelle Pfad bei <strong><em>key<\/em> <\/strong>und <em><strong>cert<\/strong><\/em> ( unten fett dargestellt). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># See \/usr\/share\/postfix\/main.cf.dist for a commented, more complete version\n\n# Debian specific:  Specifying a file name will cause the first\n# line of that file to be used as the name.  The Debian default\n# is \/etc\/mailname.\n#myorigin = \/etc\/mailname\n\nsmtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)\nbiff = no\n\n# appending .domain is the MUA's job.\nappend_dot_mydomain = no\n\n# Uncomment the next line to generate \"delayed mail\" warnings\n#delay_warning_time = 4h\n\nreadme_directory = no\n\n# See http:\/\/www.postfix.org\/COMPATIBILITY_README.html -- default to 2 on\n# fresh installs.\ncompatibility_level = 2\n\n# TLS parameters\n<strong>smtpd_tls_cert_file=\/etc\/letsencrypt\/live\/example.com\/fullchain.pem\nsmtpd_tls_key_file=\/etc\/letsencrypt\/live\/example.com\/privkey.pem<\/strong>\nsmtpd_use_tls=yes\nsmtpd_tls_auth_only = yes\nsmtp_tls_security_level = may\nsmtpd_tls_security_level = may\nsmtpd_sasl_security_options = noanonymous, noplaintext\nsmtpd_sasl_tls_security_options = noanonymous\n\n# Authentication\nsmtpd_sasl_type = dovecot\nsmtpd_sasl_path = private\/auth\nsmtpd_sasl_auth_enable = yes\n\n# See \/usr\/share\/doc\/postfix\/TLS_README.gz in the postfix-doc package for\n# information on enabling SSL in the smtp client.\n\n# Restrictions\nsmtpd_helo_restrictions =\n        permit_mynetworks,\n        permit_sasl_authenticated,\n        reject_invalid_helo_hostname,\n        reject_non_fqdn_helo_hostname\nsmtpd_recipient_restrictions =\n        permit_mynetworks,\n        permit_sasl_authenticated,\n        reject_non_fqdn_recipient,\n        reject_unknown_recipient_domain,\n        reject_unlisted_recipient,\n        reject_unauth_destination\nsmtpd_sender_restrictions =\n        permit_mynetworks,\n        permit_sasl_authenticated,\n        reject_non_fqdn_sender,\n        reject_unknown_sender_domain\nsmtpd_relay_restrictions =\n        permit_mynetworks,\n        permit_sasl_authenticated,\n        defer_unauth_destination\n\n# See \/usr\/share\/doc\/postfix\/TLS_README.gz in the postfix-doc package for\n# information on enabling SSL in the smtp client.\n\nmyhostname = example.com\nalias_maps = hash:\/etc\/aliases\nalias_database = hash:\/etc\/aliases\nmydomain = example.com\nmyorigin = $mydomain\nmydestination = localhost\nrelayhost =\nmynetworks = 127.0.0.0\/8 &#91;::ffff:127.0.0.0]\/104 &#91;::1]\/128\nmailbox_size_limit = 0\nrecipient_delimiter = +\ninet_interfaces = all\ninet_protocols = all\n\n# Handing off local delivery to Dovecot's LMTP, and telling it where to store mail\nvirtual_transport = lmtp:unix:private\/dovecot-lmtp\n\n# Virtual domains, users, and aliases\nvirtual_mailbox_domains = mysql:\/etc\/postfix\/mysql-virtual-mailbox-domains.cf\nvirtual_mailbox_maps = mysql:\/etc\/postfix\/mysql-virtual-mailbox-maps.cf\nvirtual_alias_maps = mysql:\/etc\/postfix\/mysql-virtual-alias-maps.cf\n\n       \n# Even more Restrictions and MTA params\ndisable_vrfy_command = yes\nstrict_rfc821_envelopes = yes\n#smtpd_etrn_restrictions = reject\n#smtpd_reject_unlisted_sender = yes\n#smtpd_reject_unlisted_recipient = yes\nsmtpd_delay_reject = yes\nsmtpd_helo_required = yes\nsmtp_always_send_ehlo = yes\n#smtpd_hard_error_limit = 1\nsmtpd_timeout = 30s\nsmtp_helo_timeout = 15s\nsmtp_rcpt_timeout = 15s\nsmtpd_recipient_limit = 40\nminimal_backoff_time = 180s\nmaximal_backoff_time = 3h\n\n# Reply Rejection Codes\ninvalid_hostname_reject_code = 550\nnon_fqdn_reject_code = 550\nunknown_address_reject_code = 550\nunknown_client_reject_code = 550\nunknown_hostname_reject_code = 550\nunverified_recipient_reject_code = 550\nunverified_sender_reject_code = 550<\/code><\/pre>\n\n\n\n<p>Nun richten wir die 3 files ein, die in der <strong><em>\/etc\/postfix\/main.cf<\/em><\/strong> schon deklariert sind. Das erste w\u00e4re die <\/p>\n\n\n\n<p><em><strong>\/etc\/postfix\/mysql-virtual-mailbox-domains.cf<\/strong><\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user = mailuser\npassword = mailuserpass\nhosts = 127.0.0.1\ndbname = mailserver\nquery = SELECT 1 FROM virtual_domains WHERE name='%s'<\/code><\/pre>\n\n\n\n<p><strong><em>\/etc\/postfix\/mysql-virtual-mailbox-maps.cf<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user = mailuser\npassword = mailuserpass\nhosts = 127.0.0.1\ndbname = mailserver\nquery = SELECT 1 FROM virtual_users WHERE email='%s'<\/code><\/pre>\n\n\n\n<p><strong><em>\/etc\/postfix\/mysql-virtual-alias-maps.cf<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>user = mailuser\npassword = mailuserpass\nhosts = 127.0.0.1\ndbname = mailserver\nquery = SELECT destination FROM virtual_aliases WHERE source='%s'<\/code><\/pre>\n\n\n\n<p>Zum Abschluss starten wir Postfix einmal neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart postfix<\/code><\/pre>\n\n\n\n<p><strong>Postfix testen:<\/strong><\/p>\n\n\n\n<p>Die ersten beiden Befehle sollten als R\u00fcckgabewert die &#8218;1&#8216; liefern. Beim dritten Befehl wird die Hauptmailadresse ausgeben, auf den der Alias verweist.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo postmap -q example.com mysql:\/etc\/postfix\/mysql-virtual-mailbox-domains.cf\n\nsudo postmap -q email1@example.com mysql:\/etc\/postfix\/mysql-virtual-mailbox-maps.cf\n\nsudo postmap -q alias@example.com mysql:\/etc\/postfix\/mysql-virtual-alias-maps.cf<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Als n\u00e4chstes k\u00fcmmern wir uns um die Einstellungen in der master.cf. Diese Konfigurationsdatei startet und steuert die Postfix Prozesse. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#\n# Postfix master process configuration file.  For details on the format\n# of the file, see the master(5) manual page (command: \"man 5 master\" or\n# on-line: http:\/\/www.postfix.org\/master.5.html).\n#\n# Do not forget to execute \"postfix reload\" after editing this file.\n#\n# ==========================================================================\n# service type  private unpriv  chroot  wakeup  maxproc command + args\n#               (yes)   (yes)   (yes)    (never) (100)\n# ==========================================================================\nsmtp      inet  n       -       n       -       -       smtpd\n#smtp      inet  n       -       -       -       1       postscreen\n#smtpd     pass  -       -       -       -       -       smtpd\n#dnsblog   unix  -       -       -       -       0       dnsblog\n#tlsproxy  unix  -       -       -       -       0       tlsproxy\nsubmission inet n       -       y      -       -       smtpd\n  -o syslog_name=postfix\/submission\n  -o smtpd_tls_security_level=encrypt\n  -o smtpd_sasl_auth_enable=yes\n  -o smtpd_sasl_type=dovecot\n  -o smtpd_sasl_path=private\/auth\n  -o smtpd_reject_unlisted_recipient=no\n  -o smtpd_client_restrictions=permit_sasl_authenticated,reject\n  -o milter_macro_daemon_name=ORIGINATING\nsmtps     inet  n       -       -       -       -       smtpd\n  -o syslog_name=postfix\/smtps\n  -o smtpd_tls_wrappermode=yes\n  -o smtpd_sasl_auth_enable=yes\n  -o smtpd_sasl_type=dovecot\n  -o smtpd_sasl_path=private\/auth\n  -o smtpd_client_restrictions=permit_sasl_authenticated,reject\n  -o milter_macro_daemon_name=ORIGINATING\n  ...<\/code><\/pre>\n\n\n\n<p>Abschliessend nehmen wir noch \u00c4nderung an den Rechten von <em><strong>\/etc\/postfix<\/strong><\/em> vor, sodass die Gruppe &#8218;other&#8216; keine keinenn Zugriff mehr hat.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chmod -R o-rwx \/etc\/postfix\nsudo systemctl restart postfix<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dovecot\">5.) Dovecot<\/h2>\n\n\n\n<p>Dovecot dient f\u00fcr unsere Zwecke als IMAP Server und LDA ( local delivery agent ). Er nimmt die Mails von Postfix an und liefert sie an die User aus.<\/p>\n\n\n\n<p>Als erstes machen wir wieder Backups von den zu bearbeitenden Konfigdateien:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo cp \/etc\/dovecot\/dovecot.conf \/etc\/dovecot\/dovecot.conf.bak\nsudo cp \/etc\/dovecot\/conf.d\/10-mail.conf \/etc\/dovecot\/conf.d\/10-mail.conf.bak\nsudo cp \/etc\/dovecot\/conf.d\/10-auth.conf \/etc\/dovecot\/conf.d\/10-auth.conf.bak\nsudo cp \/etc\/dovecot\/dovecot-sql.conf.ext \/etc\/dovecot\/dovecot-sql.conf.ext.bak\nsudo cp \/etc\/dovecot\/conf.d\/10-master.conf \/etc\/dovecot\/conf.d\/10-master.conf.bak\nsudo cp \/etc\/dovecot\/conf.d\/10-ssl.conf \/etc\/dovecot\/conf.d\/10-ssl.conf.bak<\/code><\/pre>\n\n\n\n<p>Danach \u00e4ndern wir die Konfigs auf die gezeigten Werte:<\/p>\n\n\n\n<p><em><strong>\/etc\/dovecot\/dovecot.conf<\/strong><\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>## Dovecot configuration file\n...\n# Enable installed protocols\n!include_try \/usr\/share\/dovecot\/protocols.d\/*.protocol\nprotocols = imap pop3 lmtp\n\npostmaster_address = postmaster at example.com\n...<\/code><\/pre>\n\n\n\n<p><em><strong>\/etc\/dovecot\/conf.d\/10-mail.conf<\/strong><\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\nmail_location = maildir:\/var\/mail\/vhosts\/%d\/%n\/\n...\nmail_privileged_group = mail\n...<\/code><\/pre>\n\n\n\n<p>Erstellt nun das Verzeichnis <em><strong>\/var\/mail\/vhosts<\/strong><\/em> und Unterverzeichnis eurer Domain. Ersetzt <em><strong>example.com<\/strong><\/em> mit dem Namen eurer Domain:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/var\/mail\/vhosts\/example.com<\/code><\/pre>\n\n\n\n<p>Nun ben\u00f6tigen wir einen Systemuser und eine Systemgroup jeweils mit dem Namen <em><strong>vmail<\/strong><\/em>. Diese werden dann die Mails auf dem Server lesen k\u00f6nnen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo groupadd -g 5000 vmail\nsudo useradd -g vmail -u 5000 vmail -d \/var\/mail\nsudo chown -R vmail:vmail \/var\/mail<\/code><\/pre>\n\n\n\n<p>Als n\u00e4chstes editiert die Datei <em><strong>\/etc\/dovecot\/conf.d\/10-auth.conf<\/strong><\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\ndisable_plaintext_auth = yes\n...\nauth_mechanisms = plain login\n...\n!include auth-system.conf.ext\n...\n!include auth-sql.conf.ext\n...<\/code><\/pre>\n\n\n\n<p>In der Datei <strong><em>\/etc\/dovecot\/conf.d\/auth-sql.conf.ext<\/em><\/strong> stehen die Authentisierungs-und Storageinformationen.Passt sie wie folgend gezeigt an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\npassdb {\n  driver = sql\n  args = \/etc\/dovecot\/dovecot-sql.conf.ext\n}\n...\n#userdb {\n#  driver = sql\n#  args = \/etc\/dovecot\/dovecot-sql.conf.ext\n#}\n...\nuserdb {\n  driver = static\n  args = uid=vmail gid=vmail home=\/var\/mail\/vhosts\/%d\/%n\n}\n...<\/code><\/pre>\n\n\n\n<p>In der Datei <em><strong>\/etc\/dovecot\/dovecot-sql.conf.ext<\/strong><\/em> stehen die MySQL Verbindungsparameter:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\ndriver = mysql\n...\nconnect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass\n...\ndefault_pass_scheme = SHA512-CRYPT\n...\npassword_query = SELECT email as user, password FROM virtual_users WHERE email='%u';\n...<\/code><\/pre>\n\n\n\n<p>Nun noch ein paar \u00c4nderungen an Benutzern und Zugriffen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R vmail:dovecot \/etc\/dovecot\nsudo chmod -R o-rwx \/etc\/dovecot<\/code><\/pre>\n\n\n\n<p>Nehmt folgende \u00c4nderungen an der Datei <em><strong>\/etc\/dovecot\/conf.d\/10-master.conf<\/strong><\/em> vor:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Achtet bitte auf korrekte Formattierung bei den {geschweiften Klammern}. Schnell vergisst man diese korrekt zu schliessen<\/strong><\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>...\nservice imap-login {\n  inet_listener imap {\n    port = 0\n  }\n  inet_listener imaps {\n    port = 993\n    ssl = yes\n  }\n  ...\n}\n...\nservice pop3-login {\n  inet_listener pop3 {\n    port = 0\n  }\n  inet_listener pop3s {\n    port = 995\n    ssl = yes\n  }\n}\n...<\/code><\/pre>\n\n\n\n<p>Zus\u00e4tzlich in der selben Datei sucht nach <strong><em>service lmtp<\/em> <\/strong>und nehmt folgende Einstellungen vor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\nservice lmtp {\n  unix_listener \/var\/spool\/postfix\/private\/dovecot-lmtp {\n    #mode = 0666i\n    mode = 0600\n    user = postfix\n    group = postfix\n  }\n...\n}<\/code><\/pre>\n\n\n\n<p>Dann sucht nach <em><strong>service auth<\/strong><\/em> und macht die gezeigten Einstellungen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\nservice auth {\n  ...\n  unix_listener \/var\/spool\/postfix\/private\/auth {\n    mode = 0660\n    user = postfix\n    group = postfix\n  }\n\n  unix_listener auth-userdb {\n    mode = 0600\n    user = vmail\n  }\n...\n  user = dovecot\n}\n...<\/code><\/pre>\n\n\n\n<p>In der <em><strong>service-auth-worker<\/strong> <\/em>section wird user unkommentiert und auf <em>vmail<\/em> gesetzt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\nservice auth-worker {\n  ...\n  user = vmail\n}<\/code><\/pre>\n\n\n\n<p>Nun binden wir das bereits im Postfix aktive Zertifikat samt Key in Dovecot ein:<\/p>\n\n\n\n<p><em><strong>\/etc\/dovecot\/conf.d\/10-ssl.conf<\/strong><\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>..\n# SSL\/TLS support: yes, no, required. &lt;doc\/wiki\/SSL.txt&gt;\nssl = required\n...\nssl_cert = &lt;\/etc\/letsencrypt\/live\/example.com\/fullchain.pem\nssl_key = &lt;\/etc\/letsencrypt\/live\/example.com\/privkey.pem<\/code><\/pre>\n\n\n\n<p>Zu guter letzt startet ihr noch den <em>dovecot<\/em> neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart dovecot<\/code><\/pre>\n\n\n\n<p><strong>Testen des Mailservers:<\/strong><\/p>\n\n\n\n<p>Nun ist es an der Reihe zu testen, ob unser Postfix in der Lage ist, Mails zu versenden. Dazu benutzen wir das CMD Tool <em><strong>mailutil<\/strong>s<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install mailutils<\/code><\/pre>\n\n\n\n<p>Wir nehmen den anschliessenden Befehl, um von der Kommandozeile eine Mail an einen externen Empf\u00e4nger zu senden, wie z.B. an eine Gmail-Adresse:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"Email body text\" | sudo mail -s \"Email subject line\" recipient@gmail.com -a From:test@example.com<\/code><\/pre>\n\n\n\n<p>Schaut nun nach, ob die Mail bei eurem extern Anbieter angekommen ist. Falls Ja, dann dr\u00fcckt auf &#8222;<em>Antworten<\/em>&#8222;. So k\u00f6nnt ihr gleich testen, ob euer Postfix die Mail auch korrekt eingeliefert bekommt. Dies checkt ihr, indem folgender Befehl genutzt wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mail -f \/var\/mail\/vhosts\/example.com\/email1<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Achtung:<\/strong> Ihr m\u00fcsst vorher bei euren DNS Anbieter die korrekten Werte f\u00fcr z.B. den MX Record gesetzt haben, ansonsten weiss Google nicht, wohin er die Mails schicken soll.<\/p>\n<\/blockquote>\n\n\n\n<p><strong>Einrichten eines Mailclients:<\/strong><\/p>\n\n\n\n<p>Zum testen sollte im Prinzip jeder Mailclient funktionieren. Ich habe Thunderbird verwendet.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Username = eure Hauptmailadresse, z.B. test@example.com<\/li>\n\n\n\n<li>Password = das Passwort, f\u00fcr welches ihr den Hashes erstellt hattet<\/li>\n\n\n\n<li>Server   = wie im DNS angegeben, z.B. mail.example.com<\/li>\n\n\n\n<li>IMAPs    = es wird der Port 993 genutzt und die Einstellung auf <em>SSL\/TLS<\/em> gesetzt<\/li>\n\n\n\n<li>SMTP     = der Port ist 587 und die SSL Security muss auf <em>STARTTLS<\/em> gstellt werden<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Achtung:<\/strong> Thunderbird wird anfangs versuchen, die Accounteinstellungen automatisch zu finden. Dies wird aber fehlschlagen. Danach lassen sich o.g Werte manuell eintragen.<\/p>\n<\/blockquote>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"spamassassin\">6.)Spamassassin<\/h2>\n\n\n\n<p>Als erstes installieren wir die n\u00f6tigen Pakete:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install spamassassin spamc<\/code><\/pre>\n\n\n\n<p>Dann noch einen Benutzer <strong><em>spamd <\/em><\/strong>anlegen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo adduser spamd --disabled-login<\/code><\/pre>\n\n\n\n<p>Die Datei <em><strong>\/etc\/default\/spamassassin<\/strong><\/em> wird wie folgt angepasst:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n\nHOMEDIR=\"\/home\/spamd\/\"\n\nOPTIONS=\"--create-prefs --max-children 5 --username spamd --helper-home-dir ${HOMEDIR} -s ${HOMEDIR}spamd.log\"\n\nPIDFILE=\"${HOMEDIR}spamd.pid\"\n\n...\n\nCRON=1<\/code><\/pre>\n\n\n\n<p>Nun noch die <em><strong>\/etc\/spamassassin\/local.cf<\/strong><\/em> konfigurieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n\nrewrite_header Subject ***** SPAM _SCORE_ *****\nreport_safe             0\nrequired_score          5.0\nuse_bayes               1\nuse_bayes_rules         1\nbayes_auto_learn        1\nskip_rbl_checks         0\nuse_razor2              0\nuse_dcc                 0\nuse_pyzor               0\n\n...<\/code><\/pre>\n\n\n\n<p>Ob ihr <a href=\"https:\/\/spamassassin.apache.org\/full\/4.0.x\/doc\/Mail_SpamAssassin_Plugin_Razor2.html\">razor2<\/a>, <a href=\"https:\/\/spamassassin.apache.org\/full\/4.0.x\/doc\/Mail_SpamAssassin_Plugin_DCC.html\">dcc<\/a> oder <a href=\"https:\/\/www.pyzor.org\/en\/latest\/introduction.html\">pyzor<\/a> zur weiteren Spamerkennung einsetzen wollt h\u00e4ngt vom pers\u00f6nlichen Bed\u00fcrfnis ab. <\/p>\n\n\n\n<p>An dieser Stelle schaut euch mal die Seite <a href=\"http:\/\/www.spamhaus.com\" data-type=\"link\" data-id=\"www.spamhaus.com\">www.spamhaus.com<\/a> an. Dort erhaltet ihr Infos, wie man deren RBLs ( Real Time Blacklists ) in Postfix einbindet<\/p>\n\n\n\n<p>Als n\u00e4chstes passt ihr noch die <em>\/etc\/postfix\/master.cf<\/em> an, sodass eingehende mails auch auf SPAM gepr\u00fcft werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n\nsmtp      inet  n       -       -       -       -       smtpd\n-o content_filter=spamassassin\n\n...\n\nspamassassin unix -     n       n       -       -       pipe\n  user=spamd argv=\/usr\/bin\/spamc -f -e\n\/usr\/sbin\/sendmail -oi -f ${sender} ${recipient}<\/code><\/pre>\n\n\n\n<p>Nun aktivieren wir spamassassin, starten ihne und den postfix gleich auch noch:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl start spamassassin\nsudo systemctl enable spamassassin\n\nsudo systemctl restart postfix<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"clamav\">7.)Clamav Virenpr\u00fcfung<\/h2>\n\n\n\n<p>An dieser Stelle konfigurieren wir noch die Einbindung von clamav in postfix, sodas eingehende Mails zus\u00e4tlich noch auf das Vorhandensein von Viren gepr\u00fcft werden. Dazu installiert ihr folgende Pakete:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install clamav clamsmtp<\/code><\/pre>\n\n\n\n<p>Anschliessend pr\u00fcfen wir die Datei <em><strong>\/etc\/clamsmtpd.conf<\/strong><\/em> auf folgende Eintr\u00e4ge bzw. unkommentieren die Zeilen, wie unten zu sehen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OutAddress: 10025\nListen: 127.0.0.1:10026\nClamAddress: \/var\/run\/clamav\/clamd.ctl\nHeader: X-AV-Checked: ClamAV using ClamSMTP\nTempDirectory: \/var\/spool\/clamsmtp\nPidFile: \/var\/run\/clamsmtp\/clamsmtpd.pid\nQuarantine: on\nUser: clamsmtp\nVirusAction: \/etc\/clamav\/script.sh<\/code><\/pre>\n\n\n\n<p>IM Falle des Fundes eines Viruses werden wir via Mail benachrichtigt. Dazu haben wir, wie in der letzten Zeile geschrieben, ein Skript deklariert. Dieses Skript erstellen wir nun unter <em><strong>\/etc\/clamav\/script.sh <\/strong><\/em>und f\u00fcgen den nachstehenden Inhalt ein und passen es den eigenen Bed\u00fcrfnissen nach an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/sh\nDOMAIN=example.com\nADMIN=user@example.com\nPATH=\/bin:\/sbin:\/usr\/bin:\/usr\/sbin:\/usr\/local\/bin:\/usr\/local\/sbin\nLINE=\"-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\"\nif &#91; X`echo $SENDER | egrep $DOMAIN` != \"X\" ];\nthen MAILTO=$SENDER,$ADMIN\nelse MAILTO=`echo \"$RECIPIENTS\" | egrep $DOMAIN | tr '\\n' ','`$ADMIN\nfi\n\n(echo \"Virus name: $VIRUS\"\necho \"Sender: $SENDER\"\necho \"Recipient(s): $RECIPIENTS\"\necho\nif &#91; \"x$EMAIL\" != \"x\" ] &amp;&amp; &#91; -f $EMAIL ]\nthen\necho \"Quarantined to: $EMAIL\"\nfi\n) | cat -v | mail -s \"$VIRUS found on mailserver\" $MAILTO <\/code><\/pre>\n\n\n\n<p>Das Skript braucht noch die Rechte zum ausf\u00fchren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x \/etc\/clamav\/script.sh<\/code><\/pre>\n\n\n\n<p>Zu guter letzt nur noch den clamav server neu starten:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart clamsmtp<\/code><\/pre>\n\n\n\n<p>Postfix muss jetzt noch wissen, dass es Mails an clamsmtpd \u00fcbergeben soll. Dazu f\u00fcgen wir folgendes in die <em><strong>\/etc\/postfix\/master.cf<\/strong><\/em> zus\u00e4tzlich ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>scan unix - - n - 16 smtp\n  -o smtp_send_xforward_command=yes\n\n127.0.0.1:10025 inet n - n - 16 smtpd\n  -o content_filter=\n  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks\n  -o smtpd_helo_restrictions=\n  -o smtpd_client_restrictions=\n  -o smtpd_sender_restrictions=\n  -o smtpd_recipient_restrictions=permit_mynetworks,reject\n  -o mynetworks_style=host\n  -o smtpd_authorized_xforward_hosts=127.0.0.0\/8<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dovecot-sieve\">7.)Dovecot-Sieve Filter<\/h2>\n\n\n\n<p>Mit Sieve sind wir in der Lage, eingehende Mails nach bestimmte Mustern zu filtern. Erkennt Sieve z.B., dass ein Email, nachdem sie durch den Spamfilter gelaufden ist, im Betreff *****SPAM***** stehen hat, oder dex X-SPAM-TAG auf Yes steht, dann kann diese Mail direkt in ein daf\u00fcr vorher definiertes Verzeichnis verschoben werden.<\/p>\n\n\n\n<p>Zum Anfang installiert ihr das n\u00f6tige Paket:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install dovecot-sieve<\/code><\/pre>\n\n\n\n<p>Nun passt ihr die Datei <strong><em>\/etc\/dovecot\/conf.d\/20-lmtp.conf<\/em><\/strong> an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>protocol lmtp {\n    # Space separated list of plugins to load (default is global mail_plugins).\n    mail_plugins = $mail_plugins sieve\n}<\/code><\/pre>\n\n\n\n<p>Als n\u00e4chstes werden zus\u00e4tzliche Einstellungen in der <strong><em>\/etc\/dovecot\/dovecot.conf<\/em><\/strong> vorgenommen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>plugin {\n    sieve_before = \/var\/vmail\/sieve\/spam-global.sieve\n    sieve_dir = \/var\/vmail\/%d\/%n\/sieve\/scripts\/\n    sieve = \/var\/vmail\/%d\/%n\/sieve\/active-script.sieve\n}<\/code><\/pre>\n\n\n\n<p>Die Verzeichnis-und Dateinamen k\u00f6nnt ihr wennn gew\u00fcnscht so \u00fcbernehmen, m\u00fcsst dann aber daf\u00fcr sorgen, diese noch anzulegen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/var\/vmail\nmkdir sieve\ncd sieve\ntouch spam-global.sieve\nchown -R vmail:vmail \/var\/vmail\/sieve\/<\/code><\/pre>\n\n\n\n<p>Der Eintrag <strong><em>sieve-before<\/em><\/strong>  definiert ein Skript, welches noch vor eventuellen Userskripten ausgef\u00fchrt wird. Es hat somit die h\u00f6chste Priorit\u00e4t. In nachfolgenden Beispiel soll dieses Skript erkennen, ob die Mail als SPAM eingestuft wurde und diese dann in das Verzeichnis ***SPAM*** verschieben. Dieses Verzeichnis muss in der Mailbox bereits existieren.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>require \"fileinto\";\nif header :contains \"X-Spam-Flag\" \"YES\" {\n  fileinto \"***SPAM***\";\n}<\/code><\/pre>\n\n\n\n<p>Zum Schluss starten wir dovecot neu, damit diese \u00c4nderungen wirksam werden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart dovecot<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"opendkim\">8.)OpenDKIM<\/h2>\n\n\n\n<p>DKIM ist ein Email-Authentisierungsl\u00f6sung, die Sender und Empf\u00e4nger vor SPAM, Phishing und Spoofing sch\u00fctzt. Es basiert auf einer Public Key Kryptografie.<\/p>\n\n\n\n<p>Der Email-Versender, also unser Postfix, signiert mit seinem private key jede ausgehende Mail. Der Empf\u00e4nger kann anhand des \u00f6ffentlichen Schl\u00fcssels ( im DNS hinterlegt ) \u00fcberpr\u00fcfen, ob die Mail Signatur vom rechtm\u00e4ssigen Absender kommt. I.d.R sind Mailserver so konfiguriert, dass sie diesen Prozess einhalten. Dadurch, dass die Authentizit\u00e4t des Absenders best\u00e4tigt wurde, wird der Mail ein deutlich kleinerer SPAM Scoring Wert zugeordnet. Praktisch gesehen bedeutet dies, dass unsere Mails mit geringerer Wahrscheinlichkeit als SPAM markiert werden. Dies steigert unsere Reputation.<\/p>\n\n\n\n<p>OpenDKIM ist die Open Source L\u00f6sung und l\u00e4sst sich wie folgt installieren: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install opendkim <\/code><\/pre>\n\n\n\n<p>Im n\u00e4chsten Schritt editieren wie die Datei <em><strong>\/etc\/opendkim.conf<\/strong><\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Mode                   sv\nDomain                 example.com\nRequireSafeKeys        False\nKeyfile                \/etc\/opendkim\/keys\/example.com\/default.private  \nKeyTable               \/etc\/opendkim\/KeyTable\nSigningTable           refile:\/etc\/opendkim\/SigningTable\nExternalIgnoreList     refile:\/etc\/opendkim\/TrustedHosts\nInternalHosts          file:\/etc\/opendkim\/TrustedHosts<\/code><\/pre>\n\n\n\n<p>In der gleichen Datein existiert ein Eintrag der bestimmt, auf welchem Port OpenDKIM l\u00e4uft. Standardm\u00e4ssig ist dies der Port 8891:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> Socket for the MTA connection (required). If the MTA is inside a chroot jail,\n# it must be ensured that the socket is accessible. In Debian, Postfix runs in\n# a chroot in \/var\/spool\/postfix, therefore a Unix socket would have to be\n# configured as shown on the last line below.\n#Socket                 local:\/run\/opendkim\/opendkim.sock\nSocket                  inet:8891@localhost\n#Socket                 inet:8891\n#Socket                 local:\/var\/spool\/postfix\/opendkim\/opendkim.sock\n\nPidFile                 \/run\/opendkim\/opendkim.pid<\/code><\/pre>\n\n\n\n<p>Als n\u00e4chstes editieren wir die Datei <em><strong>\/etc\/opendkim\/SigningTable<\/strong><\/em> Diese Datei weisst das System an, ausgehende Mails mit einer bestimmten Domain zu signieren, hier im Bespiel ist es example.com:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*@example.com default._domainkey.example.com<\/code><\/pre>\n\n\n\n<p>Nun passen wir die <strong><em>\/etc\/opendkim\/KeyTable<\/em> <\/strong>an. Dort wird der Pfad des private keys angegeben.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>default._domainkey.example.com example.com:selector:\/etc\/opendkim\/keys\/example.com\/default.private<\/code><\/pre>\n\n\n\n<p>In der <em><strong>\/etc\/opendkim\/TustedHosts<\/strong><\/em> f\u00fcgen wir unsere Domain ein:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>127.0.0.0.1\n::1\n*.example.com<\/code><\/pre>\n\n\n\n<p>Jetzt ist es an der Zeit, unseren key zu generieren. Als erstes legen wir das Verzeichnis an:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir \/etc\/opendkim\/keys\/example.com<\/code><\/pre>\n\n\n\n<p>Und jetzt diesen Befehl:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo opendkim-genkey -b 1024 -d example.com -D \/etc\/opendkim\/keys\/example.com -s default -v<\/code><\/pre>\n\n\n\n<p>Die Schl\u00fcsselst\u00e4rke ist in dem Bespiel auf 1024 bit gesetzt. Mehr geht nat\u00fcrlich immer und erh\u00f6ht demnach auch die Sicherheit des Schl\u00fcssels.<\/p>\n\n\n\n<p>Wir sch\u00fctzen das <strong><em>\/etc\/opendkim\/keys<\/em><\/strong> Verzeichnis, indem wir den Benutzer opendkim zum Besitzer machen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown opendkim:opendkim \/etc\/opendkim\/keys -R <\/code><\/pre>\n\n\n\n<p>Den privaten key haben wir nun an der richtigen Stelle. Als n\u00e4chstes m\u00fcssen wir noch den \u00f6ffentliche Schl\u00fcssel im DNS ver\u00f6ffentlichen. Diesen \u00f6ffentlichen Schl\u00fcssel ruft man folgendermassen ab:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@mail:~# <strong>cat \/etc\/opendkim\/keys\/example.com\/default.txt<\/strong> \n\ndefault._domainkey\tIN\tTXT\t( \"v=DKIM1; h=sha256; k=rsa;\n\t  p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0ebeOixh5A92cfkbogw9YY8WwbgkyHI4I9dIrUc6pBcTEMhIiCIxqgM8xXhwU139FJp6\/2tMrAiSbGXSL6MKf4Bp7\/Ni3WnSluV2CaRf1Nn2ncmzn8kP5VfMukALLeRePaZODkhFIbz2JXqx6aqwpL5EUMdwQYNEHS9HT+Uf4RwIDAQAB\" )  ; ----- DKIM key default for example.com<\/code><\/pre>\n\n\n\n<p>Der relevante Teil aus der <strong><em>\/etc\/opendkim\/keys\/example.com\/default.txt<\/em><\/strong> ist:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>v=DKIM1; h=sha256; k=rsa; \"\n\t  \"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0ebeOixh5A92cfkbogw9YY8WwbgkyHI4I9dIrUc6pBcTEMhIiCIxqgM8xXhwU139FJp6\/2tMrAiSbGXSL6MKf4Bp7\/Ni3WnSluV2CaRf1Nn2ncmzn8kP5VfMukALLeRePaZODkhFIbz2JXqx6aqwpL5EUMdwQYNEHS9HT+Uf4RwIDAQAB<\/code><\/pre>\n\n\n\n<p>Im \u00f6ffentlichen DNS der eigenen Doamin wird ein neuer Eintrag vom Typ TXT angelegt. Der (Host) Name ist default._domainkey, TTL kann auf Auto stehen bleiben. Als Wert bzw. Inhalt ist obiger Code einzutragen.<\/p>\n\n\n\n<p>Hier mein Eintrag aus dem DNS:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"30\" src=\"https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2-1024x30.png\" alt=\"\" class=\"wp-image-719\" srcset=\"https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2-1024x30.png 1024w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2-300x9.png 300w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2-150x4.png 150w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2-768x22.png 768w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2-1536x45.png 1536w, https:\/\/www.tippex.net\/wp-content\/uploads\/2023\/10\/grafik-2.png 1950w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Im Folgenden m\u00fcssen wir noch Postfix beibringen, dass ausgehende Mails an OpenDKIM \u00fcbergeben werden. Dies wird durch nachstehenden Eintrag in der <strong><em>\/etc\/postfix\/main.cf<\/em><\/strong> erreicht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>smtpd_milters = inet:127.0.0.1:8891\nnon_smtpd_milters = $smtpd_milters milter_default_action = accept <\/code><\/pre>\n\n\n\n<p>Zu guter letzt starten wir opendkim und postfix neu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart opendkim\nsudo systemctl restart postfix<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"absicherung\">9.)Server absichern<\/h2>\n\n\n\n<p>In den allermeisten F\u00e4llen wird der Mailserver direkt im Internet h\u00e4ngen. Um die Sicherheit zu erh\u00f6hen w\u00e4re es ratsam, auch dort eine Firewall vorzuschalten, wie z.B. Pfsense Community edition. Viele Hoster lassen dieses Szenario zu. Der Vorteil liegt klar auf der Hand. Auf der Pfsense l\u00e4sst sich der Zugriff zum Mailserver weiter einschr\u00e4nken bzw. \u00fcberwachen. Durch den Einsatz von Snort lassen sich Angriffe erkennen und die IP der Angreifer sperren. Auch liesse sich durch Pfblocker NG der Zugriff nach Geolocations einschr\u00e4nken. <\/p>\n\n\n\n<p>Nat\u00fcrlich gibt es dies nicht zum Nulltarif. Der zus\u00e4tliche Server will bezahlt werden. Wer diese Kosten scheut, bzw. aus anderen Gr\u00fcnden davon absieht, sollte folgende Tipps zur Grundabsicherung des Servers ber\u00fccksichtigen.<\/p>\n\n\n\n<p><strong>Aktivieren von fail2ban<\/strong>:<\/p>\n\n\n\n<p>Fail2ban ist ein tool, welches definierte logs nach verd\u00e4chtigen Aktivit\u00e4ten, wie fehlgeschlagene Logins, untersucht und entsprechend den Absender blockieren ( via iptables ) kann. Dies reduziert Brute-Force Attacken enorm.<\/p>\n\n\n\n<p>Unter diesem <a href=\"https:\/\/www.tippex.net\/?p=780\" data-type=\"post\" data-id=\"780\">Link<\/a> findet ihre meine anleitung zu fail2ban.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Einspielen von Updates:<\/strong><\/p>\n\n\n\n<p>Das regelm\u00e4ssige Einspielen von Updates ist f\u00fcr die allgemeine Sicherheit essentiell. Entweder stellen wir uns einen Wecker, der uns mindestens 1x die Woche daran erinnert, oder wir lassen uns automatisch via Email benachrichtigen, sobald ein Update f\u00fcr das System bereitsteht, bzw. das Update automatisch einspielen. Letzters ist nicht ganz ohne Risiko, da ein Update immer auch die Gefahr in sich birkt, etwas kaputt zu machen.<\/p>\n\n\n\n<p>Ein n\u00fctliches Tool f\u00fcr diese Aufgabe ist <strong><em><a href=\"https:\/\/wiki.ubuntuusers.de\/cron-apt\/\">cron-apt<\/a><\/em><\/strong>, welches bei Ubuntu vorhanden ist.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Apache mit Modsecurity absichern:<\/strong><\/p>\n\n\n\n<p>Wer dem Link zum installieren von Nextcloud gefolgt ist, der hat neben Postfix nun auch Apache2 auf seinem System. Apache2 liefert sog. mods mit. Eines davon nennt sich security2. Es l\u00e4sst sich einfach \u00fcber folgenden Befehl aktivieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo a2enmod security<\/code><\/pre>\n\n\n\n<p>Zu modesecurity habe ich bereits einen <a href=\"https:\/\/www.tippex.net\/?p=294\" data-type=\"post\" data-id=\"294\">Artikel<\/a> geschrieben.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>SSH Daemon absichern:<\/strong><\/p>\n\n\n\n<p>Viele Angriffsversuche, gerade Brute-Force Attacken, zielen auf den SSH Dienst. Aus diesem Grund ist es ratsam, den SSH Dienst zu h\u00e4rten. Dazu sollte man das root Login abstellen und die <a href=\"https:\/\/www.techgrube.de\/tutorials\/ssh-login-mit-public-private-key-authentifizierung\">Authentisierung <\/a>mittels Key aktivieren.<\/p>\n\n\n\n<p>Um eine schwache Konfiguration auszumerzen existiert ein <a href=\"https:\/\/www.sshaudit.com\/hardening_guides.html\">SSH Hardening Guide<\/a>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Firewall nutzen:<\/strong><\/p>\n\n\n\n<p>Ubuntu bieten die M\u00f6glichkeit, die intergrierte Firewall zu nutzen. Diese nennt sich UFW. <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-set-up-a-firewall-with-ufw-on-ubuntu-20-04-de\" data-type=\"link\" data-id=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-set-up-a-firewall-with-ufw-on-ubuntu-20-04-de\">Hier<\/a> wird gut beschrieben, wie diese zu nutzen ist.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>Monitoring:<\/strong><\/p>\n\n\n\n<p>Ein \u00dcberwachen des Systems, z.B. mittels <a href=\"https:\/\/checkmk.com\/de\">checkmk<\/a>, kann ebenfalls zur Sicherheit beitragen, da z.B. neue Systemprozesse, die vom Angreifer gestaret werden, erkannt und gemeldet werden k\u00f6nnen. Auch eine \u00fcberm\u00e4ssige Systemlast, ebenfalls durch Angreifer verurssacht, liese sich so schnell erkennen. Dar\u00fcber hinaus existieren noch weitere Tools, die durch \u00dcberwachung einen enormen Sicherheitsgewinn bieten. <a href=\"https:\/\/wazuh.com\/\" data-type=\"link\" data-id=\"https:\/\/wazuh.com\/\">Wazuh<\/a> w\u00e4re definiv ein wichtiges.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Nat\u00fcrlich sind oben genante Massnahmen nicht abschliessend, aber sie sollten f\u00fcr eine Grundabsicherung ausreichend Schutz bieten.<\/p>\n<\/blockquote>\n\n\n\n<p><strong>Security Audit:<\/strong><\/p>\n\n\n\n<p>Abschliessen sei noch das Security Audit erw\u00e4hnt. Eine gute und auch kostenlose Variante stellt der <a href=\"https:\/\/www.greenbone.net\/\">Greenbone Security Assistant<\/a> bereit. Mit dieser Art von Audit lassen sich viele L\u00fccken, aber auch Fehler in der Konfiguration finden.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"todos\">To do&#8217;s:<\/h2>\n\n\n\n<p>Ganz oben auf meiner Liste steht nocht die Verbesserung der M\u00f6glichkeit, neue Benutzer, Aliase und Dom\u00e4nen in MySQL anzulegen. Wir hatten uns ja in diesem Tutorial auf die Kommandozeile beschr\u00e4nkt. F\u00fcr ein kleines System ist dies nicht so schlimm, aber komfortabler w\u00e4re es definitiv, dies mittels eines Web Interfaces zu erledigen.<\/p>\n\n\n\n<p>Zus\u00e4tlich werde ich bei Gelegenheit die Option pr\u00fcfen, wie man im Thunderbird mittels Plugins eigene Sieve Filter erstellen kann.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Sollte euch etwas unklar sein, oder ihr habt Fehler gefunden, so nutzt gerne die Kommentarfunktion.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>F\u00fcr mich stand gerade mal ein gr\u00f6sseres Projekt an. Seit nun ca. 2 Jahren war ich Kunde bei Microsoft, genauer gesagt bei Ihrem SaaS Dienst M365, bisher bekannt als O365. Im Grunde war ich auch zufrieden. Die Dienste, wie Mail, Onedrive und Teams liefen ohne Ausf\u00e4lle. Zumindest ohne dass ich es bemerkt h\u00e4tte. Es kam [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":49,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,8,17,53],"tags":[79,78,74,31,72,73,29,77,75,76],"class_list":["post-605","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-anleitung","category-linux","category-security","category-wissen","tag-amavis","tag-clamav","tag-dovecot","tag-modsecurity","tag-postfix","tag-sasl","tag-security","tag-sicherheit","tag-sieve","tag-spamassassin","wpbf-post"],"_links":{"self":[{"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/posts\/605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tippex.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=605"}],"version-history":[{"count":95,"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/posts\/605\/revisions"}],"predecessor-version":[{"id":870,"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/posts\/605\/revisions\/870"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tippex.net\/index.php?rest_route=\/wp\/v2\/media\/49"}],"wp:attachment":[{"href":"https:\/\/www.tippex.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tippex.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tippex.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}