Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
centos:mail_c7:dovecot_2 [23.07.2014 20:48. ] – angelegt django | centos:mail_c7:dovecot_2 [22.07.2019 14:41. ] (aktuell) – django | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Dovecot, Anbindung an einen Frontend-Mailserver (Postfix-SMTP-Server) ====== | ====== Dovecot, Anbindung an einen Frontend-Mailserver (Postfix-SMTP-Server) ====== | ||
+ | {{: | ||
+ | ====== 1. LMTP ====== | ||
+ | In der Regel werden wir hinter unserem eigentlichen **SMTP**-Mailserver ein Backend System, eben unser Dovecot-Server, | ||
+ | Egal ob nun unsere beiden Mailserverkomponenten auf getrennten Hosts oder auf einem Host laufen, der Konfigurationsaufwand für **LMTP** ist dabei fast identisch. | ||
+ | ===== Dovecot (LMTP) ===== | ||
+ | ==== Konfiguration ==== | ||
+ | Zur Anbindung des **MUA**((**M**ail **U**ser **A**gent)) **Dovecot** an unseren **MTA**((**M**ail **T**ransport **A**gent)) **Postfix** nutzen wir das Protokoll **LMTP**. | ||
+ | In der Konfigurationsdatei // | ||
+ | Statt der vorbereiteten Variante über einen Unix-Datei-Socket, | ||
+ | Als erstes werden wir nun die nötige LMTP-Konfiguration in der **10-master.conf** festlegen. | ||
+ | # vim / | ||
+ | <file bash / | ||
+ | service lmtp { | ||
+ | unix_listener lmtp { | ||
+ | #mode = 0666 | ||
+ | } | ||
+ | # Create inet listener only if you can't use the above UNIX socket | ||
+ | # | ||
+ | # Avoid making LMTP visible for the entire internet | ||
+ | #address = | ||
+ | #port = | ||
+ | #} | ||
+ | # Django : 2014-07-22 | ||
+ | # Einlieferung der Nachrichten via LMTP | ||
+ | inet_listener lmtp { | ||
+ | address = 10.0.0.70 | ||
+ | port = 24 | ||
+ | } | ||
+ | } | ||
+ | ... | ||
+ | </ | ||
+ | ==== Aktivierung ==== | ||
+ | Zum Aktivieren unserer Konfigurationsänderung führen wir einen **reload** des dovecot-Daemons durch. | ||
+ | # systemctl reload dovecot.service | ||
+ | Der **Reload** wurde im maillog dokumentiert. Bei Bedarf können wir den Status unseres Dovecot_Servers abfragen. | ||
+ | # systemctl status dovecot.service | ||
+ | < | ||
+ | | ||
+ | | ||
+ | Process: 23610 ExecReload=/ | ||
+ | Main PID: 22063 (dovecot) | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Jul 23 21:32:16 vml000070.dmz.nausch.org dovecot[23587]: | ||
+ | Jul 23 21:47:21 vml000070.dmz.nausch.org systemd[1]: Reloading Dovecot IMAP/POP3 email server. | ||
+ | Jul 23 21:47:21 vml000070.dmz.nausch.org dovecot[22063]: | ||
+ | Jul 23 21:47:21 vml000070.dmz.nausch.org systemd[1]: Reloaded Dovecot IMAP/POP3 email server. | ||
+ | Jul 23 21:47:21 vml000070.dmz.nausch.org dovecot[23587]: | ||
+ | Hint: Some lines were ellipsized, use -l to show in full. | ||
+ | </ | ||
+ | |||
+ | Mit dem Befehl **netstat** überprüfen wir nun als nächstes, ob unser Port auf der richtigen Adresse gebunden ist. | ||
+ | # netstat -tulpen | ||
+ | < | ||
+ | Proto Recv-Q Send-Q Local Address | ||
+ | tcp 0 0 10.0.0.70: | ||
+ | tcp 0 0 10.0.0.70: | ||
+ | tcp 0 0 10.0.0.70: | ||
+ | tcp 0 0 10.0.0.70: | ||
+ | tcp 0 0 10.0.0.70: | ||
+ | tcp 0 0 10.0.0.70: | ||
+ | </ | ||
+ | |||
+ | ==== Verbindungstest ==== | ||
+ | Somit können wir einen ersten Verbindungstest zu unserem **LMTP**-Port durchführen. | ||
+ | # telnet 10.0.0.70 24 | ||
+ | Unser Dovecot-Server akzeptiert die Verbindung und gibt das Server-Greeting aus. | ||
+ | | ||
+ | | ||
+ | | ||
+ | 220 imap.nausch.org Dovecot ready. | ||
+ | Mit dem **LMTP**-Kommando **quit** loggen wir uns aus und beenden die Verbindung: | ||
+ | quit | ||
+ | Der Server Bestätigt den Befehl mit einem **2xx**-Code und beendet die Verbindung. | ||
+ | 221 2.0.0 OK | ||
+ | | ||
+ | |||
+ | ==== Paketfilterregel ==== | ||
+ | Damit nun nicht jeder fremde Host sich mit dem **LMTP**-Port verbinden kann, regeln wir den Zugriff über eine Firewall-Regel so, dass nur der vorgeschaltete **MTA** Postfix-Mailserver sich mit unserem **Dovecot-Server** auf Port **24** verbinden kann. | ||
+ | |||
+ | Unter **CentOS 7** wird als Standard-Firewall die dynamische **firewalld** verwendet. Ein großer Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbiundungen kurz getrennt werden. Sondern unsere Änderungen können **// | ||
+ | |||
+ | In unserem Konfigurationsbeispiel hat unser Postfix-Server die IP-Adresse 10.0.0.80 und unser Dovecot-Server die 10.0.0.70. Wir brauchen also eine Firewall-Definition, | ||
+ | |||
+ | Mit Hilfe des Programms **firewall-cmd** legen wir nun eine **permanente** Regel in der Zone **public**, dies entspricht in unserem Beispiel das Netzwerk-Interface **eth0** mit der IP **10.0.0.70** an. Als Source-IP geben wir die IP-Adresse unseres Postfix-Servers also die **10.0.0.80** an. Genug der Vorrede, mit nachfolgendem Befehl wird diese restriktive Regel angelegt. | ||
+ | # firewall-cmd --permanent --zone=public --add-rich-rule=" | ||
+ | |||
+ | Zum Aktivieren brauchen wir nun nur einen reload des Firewall-Daemon vornehmen. | ||
+ | # firewall-cmd --reload | ||
+ | |||
+ | Fragen wir nun den Regelsatz unserer **iptables**-basieten Firewall ab, finden wir in der Chain **IN_public_allow** unsere aktive Regel. | ||
+ | # iptables -nvL | ||
+ | |||
+ | ... | ||
+ | Chain IN_public_allow (1 references) | ||
+ | pkts bytes target | ||
+ | | ||
+ | ... | ||
+ | |||
+ | ==== abschließender Test ==== | ||
+ | |||
+ | Somit steht einem abschließenden Test nun nichts mehr im Wege. Als erstes versuchen wir vom Postfix-server aus eine **LMTP**-Verbindung herzustellen. | ||
+ | $ telnet 10.0.0.70 24 | ||
+ | < | ||
+ | Connected to 10.0.0.70. | ||
+ | Escape character is ' | ||
+ | 220 imap.nausch.org Dovecot ready. | ||
+ | quit | ||
+ | 221 2.0.0 OK | ||
+ | Connection closed by foreign host. | ||
+ | </ | ||
+ | |||
+ | Die Verbindung wurde im Maillog entsprechend dokumentiert: | ||
+ | # tail -n2 / | ||
+ | |||
+ | Jul 23 22:18:16 vml000070 dovecot: lmtp(24316): | ||
+ | Jul 23 22:18:18 vml000070 dovecot: lmtp(24316): | ||
+ | |||
+ | Ein Verbindungsaufbau von einem anderen Netzwerk-Host wird hingegen von der Firewall erfolgreich weggeblockt. | ||
+ | # telnet 10.0.0.70 24 | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | ===== Postfix (LMTP) ===== | ||
+ | Da unser Mailserver nicht nur für die Hauptdomäne **// | ||
+ | |||
+ | Postfix nimmt immer dann Post außerhalb unseres **$mynetworks** an, wenn er sich zuständig fühlt. Hierzu kennt Postfix drei Klassen von Domains: | ||
+ | |||
+ | - echte Domains **$mydestination** \\ Diese Variante haben wir schon bei der [[centos: | ||
+ | - zu relayende Domains **$relay_domains** \\ Mit diese Variante haben wir uns bereits bei der Anbingung unseres Mailservers an ein Backend-Mailgateway im Kapitel [[centos: | ||
+ | - virtuelle Domains **$virtual_alias_domains** \\ Eine alternative Einbindung virtueller Domains ist die Verwendung von **virtual_alias_domains** und **virtual_alias_maps** | ||
+ | |||
+ | <WRAP round important> | ||
+ | Dabei ist es logisch ausgeschlossen, | ||
+ | |||
+ | Da wir unsere Maildomänen und Nutzerkonten mit Hilfe von [[centos: | ||
+ | |||
+ | ==== Konfiguration ==== | ||
+ | In der Postfix-Konfigurationsdatei // | ||
+ | |||
+ | Für den Transport definieren wir nun den **virtual_transport** in Richtung Dovecot-Server, | ||
+ | # vim / | ||
+ | <file bash / | ||
+ | |||
+ | # Django : 2013-02-07 | ||
+ | # virtuelle Mailboxen | ||
+ | virtual_mailbox_domains = proxy: | ||
+ | |||
+ | virtual_alias_maps = proxy: | ||
+ | proxy: | ||
+ | proxy: | ||
+ | |||
+ | virtual_mailbox_maps = proxy: | ||
+ | proxy: | ||
+ | |||
+ | virtual_transport = lmtp: | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | ==== Aktivierung ==== | ||
+ | Zum aktivieren unserer Konfigurationsänderung führen wir nun einen Reload unseres Postfix-Mailservers durch. | ||
+ | # systemctl reload postfix.service | ||
+ | |||
+ | Im Maillog unseres Servers wird dieser Reload entsprechend dokumentiert. | ||
+ | # tail -n2 / | ||
+ | |||
+ | Jul 23 23:30:21 vml000070 postfix/ | ||
+ | Jul 23 23:30:21 vml000070 postfix/ | ||
+ | |||
+ | Der **Reload** wurde im maillog dokumentiert. Bei Bedarf können wir den Status unseres Dovecot_Servers abfragen. | ||
+ | # postfix.service - Postfix Mail Transport Agent | ||
+ | < | ||
+ | | ||
+ | Process: 24347 ExecReload=/ | ||
+ | Main PID: 2578 (master) | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | Jul 21 15:28:29 vml000070.dmz.nausch.org postfix/ | ||
+ | Jul 21 15:28:29 vml000070.dmz.nausch.org systemd[1]: Started Postfix Mail Transport Agent. | ||
+ | Jul 23 23:30:21 vml000070.dmz.nausch.org systemd[1]: Reloading Postfix Mail Transport Agent. | ||
+ | Jul 23 23:30:21 vml000070.dmz.nausch.org postfix/ | ||
+ | Jul 23 23:30:21 vml000070.dmz.nausch.org postfix/ | ||
+ | Jul 23 23:30:21 vml000070.dmz.nausch.org systemd[1]: Reloaded Postfix Mail Transport Agent. | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Dynamische Empfänger-Verifizierung ==== | ||
+ | <WRAP round info>Im vorgenannten Konfigurationsbeispiel werden für alle Empfänger Nachrichten angenommen, die in der statischen Lookup-Tabelle gelistet ist. Was ist nun aber, wenn das Backend-System wiederum die Annahme einer weitergeleiteten Nachricht verweigert? Richtig, unser Mailserver würde diese als Bounce zurück zum Absender schicken. Dies wollen wir eben sowenig, wie den zusätzlichen Pflegeaufwand für die richtige und aktuelle relay_recipients-Tabelle!< | ||
+ | </ | ||
+ | </ | ||
+ | Den notwendigen Konfogurationseintrag finden wir bereits in der Hauptkonfigurationsdatei von unserem **Postfix 2.6.6** unter **CentOS 6.x**. | ||
+ | # grep verify / | ||
+ | |||
+ | | ||
+ | |||
+ | Postfix wird mit Hilfe des Moduls **verify** versuchen, noch während der Annahme der Bachricht von einem fremden Mailserver, beim Backend-System in Erfahrung zu bringen, ob dieses die Nachricht auch abnehmen würde. Ist dies der Fall, reicht Postfix die Nachricht an das Backend weiter. Anderenfalls wird die Annahme der Nachricht verweigert. Damit nun der Mailserver nicht jedesmal nachfragen muss, werden wir ihm hierzu eine kleine Datenbanktabelle spendieren, die auch nach einen Neustart des Servers zur Verfügung stehen kann. | ||
+ | === Konfiguration === | ||
+ | Als erstes legen wir nun das entsprechende Verzeichnis an und schenke es dem Nutzer Postfix. | ||
+ | # mkdir / | ||
+ | |||
+ | # chown postfix.root / | ||
+ | |||
+ | # chmod 700 / | ||
+ | |||
+ | Als nächstes definieren wir noch die entsprechende Datenbank, bzw. den Ort wo Postfix diese Datenbank abspeichern wird. Hierzu tragen wir in die Konfigurationsdatei **main.cf** folgenden Eintrag nach. | ||
+ | # vim / | ||
+ | |||
+ | <code bash># Postfix-eigene verify-Datenbank für die dynamische | ||
+ | # Empfänger-Überprüfung nutzen | ||
+ | address_verify_map = btree:/ | ||
+ | </ | ||
+ | |||
+ | Ferner aktivieren wir noch den in der [[centos: | ||
+ | <code bash># | ||
+ | # Django : 2012-02-06 | ||
+ | # Schutz durch Restrictions für unser SOHO | ||
+ | # | ||
+ | |||
+ | smtpd_recipient_restrictions = | ||
+ | # Postmaster, abuse und andere aufgaben- oder funktionsgebundene E-Mail-Adressen (Role-Accounts) whitelisten | ||
+ | check_recipient_access btree:/ | ||
+ | # Black- und Whitelisting | ||
+ | check_client_access cidr:/ | ||
+ | check_helo_access btree:/ | ||
+ | check_sender_access btree:/ | ||
+ | check_recipient_access btree:/ | ||
+ | # Unsauberer eMails nicht annehmen | ||
+ | reject_non_fqdn_sender, | ||
+ | reject_non_fqdn_recipient, | ||
+ | reject_unknown_sender_domain, | ||
+ | reject_unknown_recipient_domain, | ||
+ | # Unsere eigenen Nutzer zulassen-/ | ||
+ | permit_sasl_authenticated, | ||
+ | permit_mynetworks, | ||
+ | # RBL überprüfen (Kapitel 10.11 Realtime Blackhole Lists) | ||
+ | reject_rbl_client zen.spamhaus.org, | ||
+ | reject_rbl_client ix.dnsbl.manitu.net, | ||
+ | reject_rbl_client bl.spamcop.net, | ||
+ | reject_rbl_client dnsbl.njabl.org, | ||
+ | reject_rhsbl_client multi.uribl.com, | ||
+ | # Dynamische Prüfung auf existente Relay-Empfänger | ||
+ | reject_unverified_recipient, | ||
+ | # Backupserver (MX) erlauben | ||
+ | # | ||
+ | # alles andere an relaying verbieten | ||
+ | reject_unauth_destination, | ||
+ | # Zu guter Letzt alles durchlassen, | ||
+ | permit | ||
+ | </ | ||
+ | |||
+ | Die Pflege der verify-Datenbank übernimmt dabei Postfix selbst, trägt neue Adressen ein und löscht auch regelmäßig alte Einträge - kurz und gut, der Postfix betreibt also eine Art // | ||
+ | # postconf address_verify_positive_refresh_time | ||
+ | |||
+ | | ||
+ | |||
+ | Nach Ablauf der sieben Tage wird das verify-Modul eine bereits bekannte und positiv gekennzeichnete eMailadresse erneuit beim Zielserver anfragen und die Aktualität des Datensatzes überprüfen. | ||
+ | |||
+ | # postconf address_verify_positive_expire_time | ||
+ | |||
+ | | ||
+ | |||
+ | Erst nach Ablauf von 31 Tagen wird eine bekannte und positive Adresse aus der Datenbank entfernt. Da aber bereits nach 7 Tagen eine Überprüfung der Adresse stattfindet, | ||
+ | |||
+ | # postconf address_verify_negative_refresh_time | ||
+ | |||
+ | | ||
+ | |||
+ | Nach drei Stunden wird das verify-Modul eine noch nicht existente gecachte Empfänger-Adresse beim Zielserver erneut anfragen. | ||
+ | |||
+ | # postconf address_verify_negative_expire_time | ||
+ | |||
+ | | ||
+ | |||
+ | Nicht existierende Empfängeradressen werden maximal drei Tage vorgehalten und dann gelöscht. | ||
+ | |||
+ | # postconf address_verify_sender | ||
+ | |||
+ | | ||
+ | |||
+ | # postconf double_bounce_sender | ||
+ | |||
+ | | ||
+ | |||
+ | Dieser Parameter legt fest, mit welchem // | ||
+ | |||
+ | === automatische Pflege === | ||
+ | <WRAP round important> | ||
+ | # tail -f / | ||
+ | < | ||
+ | Jun 4 22:11:20 vml000080 postfix/ | ||
+ | Jun 4 22:12:06 vml000080 postfix/ | ||
+ | Jun 4 22:12:06 vml000080 postfix/ | ||
+ | Jun 4 22:12:06 vml000080 postfix/ | ||
+ | Jun 4 22:12:06 vml000080 postfix/ | ||
+ | Jun 4 22:12:09 vml000080 postfix/ | ||
+ | Jun 4 22:12:17 vml000080 postfix/ | ||
+ | ... | ||
+ | </ | ||
+ | Das Beispiel zeigt einen erfolgreichen Überprüfungsversuch // **status=deliverable (250 2.1.5 ok)** // ). | ||
+ | |||
+ | Wir im Gegensatz versucht an einen nicht existierenden Empfänger eine Nachricht zuzustellen, | ||
+ | < | ||
+ | Jun 4 22:26:07 vml000080 postfix/ | ||
+ | Jun 4 22:26:37 vml000080 postfix/ | ||
+ | Jun 4 22:26:38 vml000080 postfix/ | ||
+ | Jun 4 22:26:38 vml000080 postfix/ | ||
+ | Jun 4 22:26:38 vml000080 postfix/ | ||
+ | Jun 4 22:26:40 vml000080 postfix/ | ||
+ | Jun 4 22:26:49 vml000080 postfix/ | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | === Einträge suchen/ | ||
+ | Werfen wir nun einen Blick in die verify-Datenbank von Postfix können wir für beide Beispiele die entsprechenden Einträge finden. | ||
+ | # postmap -s btree:/ | ||
+ | |||
+ | <code bash> | ||
+ | peer.heinlein@nausch.org 2: | ||
+ | </ | ||
+ | |||
+ | === manuell Einträge löschen === | ||
+ | Wollen wir, warum auch immer, einen Eintrag der verify-Datenbank manuell entfernen, greifen wir auch auf den Befehl **postmap** zurück. | ||
+ | # postmap -d peer.heinlein@nausch.org / | ||
+ | |||
+ | ===== LMTP-Einlieferungstests ===== | ||
+ | Da nun alle Konfigurationen erfolgreich abgeschlossen sind, können wir uns nunmehr an den finalen Test unserer **LMTP**-Konfiguration wagen. | ||
+ | Auch hier verwenden wir den gewohnten Test via **telnet** von berechtigten SMTP-Host aus. Die Eingaben am testenden Client sind in der Farbe < | ||
+ | |||
+ | < | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | Connected to 10.0.0.70. | ||
+ | Escape character is ' | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | 250-8BITMIME | ||
+ | 250-ENHANCEDSTATUSCODES | ||
+ | 250 PIPELINING</ | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | To: michael@nausch.org | ||
+ | Subj: finaler LMTP-Einlieferungstest | ||
+ | Date: 2014-07-23 23:42 | ||
+ | |||
+ | Ahoi, | ||
+ | das ist eine Testmail, eingeliefert via telnet imap-server auf Port 24 | ||
+ | | ||
+ | .</ | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | </ | ||
+ | |||
+ | Je nach Einstellungen bei der Konfigurationsoption **// | ||
+ | # doveconf mail_debug | ||
+ | |||
+ | | ||
+ | |||
+ | # tail -n 3 / | ||
+ | |||
+ | Jul 24 09:13:50 vml000070 dovecot: lmtp(24916): | ||
+ | Jul 24 09:16:41 vml000070 dovecot: lmtp(24916, michael@nausch.org): | ||
+ | Jul 24 09:16:44 vml000070 dovecot: lmtp(24916): | ||
+ | |||
+ | Bei aktiviertem **mail_debug** wird es dann schon wesentlich umfangreicher. | ||
+ | # tail -f / | ||
+ | < | ||
+ | Jul 24 11:07:48 vml000070 dovecot: lmtp(25150): | ||
+ | Jul 24 11:08:03 vml000070 dovecot: lmtp(25150): | ||
+ | Jul 24 11:08:03 vml000070 dovecot: lmtp(25150): | ||
+ | Jul 24 11:08:03 vml000070 dovecot: lmtp(25150): | ||
+ | Jul 24 11:08:03 vml000070 dovecot: lmtp(25150): | ||
+ | Jul 24 11:08:03 vml000070 dovecot: lmtp(25150): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:12 vml000070 dovecot: lmtp(25150, michael@nausch.org): | ||
+ | Jul 24 11:08:15 vml000070 dovecot: lmtp(25150): | ||
+ | </ | ||
+ | Auf unserem Festplatten wurde die eMail auch entsprechend abgespeichert. | ||
+ | < | ||
+ | └── michael | ||
+ | ├── cur | ||
+ | ├── dovecot.index.cache | ||
+ | ├── dovecot.index.log | ||
+ | ├── dovecot-uidlist | ||
+ | ├── dovecot-uidvalidity | ||
+ | ├── dovecot-uidvalidity.53d0ccfc | ||
+ | ├── new | ||
+ | │ └── 1406192892.M100007P25150.vml000070.dmz.nausch.org, | ||
+ | └── tmp | ||
+ | </ | ||
+ | |||
+ | # cat / | ||
+ | |||
+ | < | ||
+ | Delivered-To: | ||
+ | Received: from vml000080.dmz.nausch.org ([10.0.0.80]) | ||
+ | by imap.nausch.org (Dovecot) with LMTP id UYNyIuTM0FM+YgAAOs1BfA | ||
+ | for < | ||
+ | From: django@nausch.org | ||
+ | To: michael@nausch.org | ||
+ | Subj: finaler LMTP-Einlieferungstest | ||
+ | Date: 2014-07-23 23:42 | ||
+ | |||
+ | Ahoi, | ||
+ | das ist eine Testmail, eingeliefert via telnet imap-server auf Port 24 | ||
+ | | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ====== 2. SASL ====== | ||
+ | Damit unsere Mailbox-Inhaber auch von extern aus Ihre eMails bei unserem Postfix-Mailserver abliefern können, benötigen wir einen Mechanismus, | ||
+ | |||
+ | ===== Dovecot ===== | ||
+ | ==== Konfiguration ==== | ||
+ | Die Konfiguration auf Seiten des Dovecot-Servers ist denkbar einfach, ist die grundlegende Konfiguration ja schon in der Datei // | ||
+ | # vim / | ||
+ | |||
+ | <code bash>... | ||
+ | |||
+ | service auth { | ||
+ | # auth_socket_path points to this userdb socket by default. It's typically | ||
+ | # used by dovecot-lda, | ||
+ | # full permissions to this socket are able to get a list of all usernames and | ||
+ | # get the results of everyone' | ||
+ | # | ||
+ | # The default 0666 mode allows anyone to connect to the socket, but the | ||
+ | # userdb lookups will succeed only if the userdb returns an " | ||
+ | # matches the caller process' | ||
+ | # socket' | ||
+ | # | ||
+ | # To give the caller full permissions to lookup all users, set the mode to | ||
+ | # something else than 0666 and Dovecot lets the kernel enforce the | ||
+ | # permissions (e.g. 0777 allows everyone full permissions). | ||
+ | unix_listener auth-userdb { | ||
+ | #mode = 0666 | ||
+ | #user = | ||
+ | #group = | ||
+ | } | ||
+ | |||
+ | # Postfix smtp-auth | ||
+ | # | ||
+ | # mode = 0666 | ||
+ | #} | ||
+ | |||
+ | # Auth process is run as this user. | ||
+ | #user = $default_internal_user | ||
+ | |||
+ | # Django : 2014-05-23 | ||
+ | # default: unset | ||
+ | # Authentifizierungsport 3659 für Postfix Frontend-Mailserver definiert | ||
+ | inet_listener { | ||
+ | | ||
+ | port = 3659 | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Zum Aktivieren unserer Einstellungsänderungen führen wir einen **Reload** unseres Dovecot-Daemon durch. | ||
+ | # systemctl reload dovecot | ||
+ | |||
+ | Fragen wir nun die offenen Ports von Dovecot ab, finden wir auch unseren SASL-Port **3569**. | ||
+ | # netstat -tulpen | grep dovecot | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | ==== Paketfilter / Firewall ==== | ||
+ | Damit nun nicht jeder fremde Host sich mit dem **SASL**-Port verbinden kann, regeln wir den Zugriff über eine Firewall-Regel so, dass __**nur**__ der vorgeschaltete **MTA** Postfix-Mailserver sich mit unserem **Dovecot-Server** auf Port **3569** verbinden kann. | ||
+ | |||
+ | Unter **CentOS 7** wird als Standard-Firewall die dynamische **firewalld** verwendet. Ein großer Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbiundungen kurz getrennt werden. Sondern unsere Änderungen können **// | ||
+ | |||
+ | In unserem Konfigurationsbeispiel hat unser Postfix-Server die IP-Adresse 10.0.0.80 und unser Dovecot-Server die 10.0.0.70. Wir brauchen also eine Firewall-Definition, | ||
+ | |||
+ | Mit Hilfe des Programms **firewall-cmd** legen wir nun eine **permanente** Regel in der Zone **public**, dies entspricht in unserem Beispiel das Netzwerk-Interface **eth0** mit der IP **10.0.0.70** an. Als Source-IP geben wir die IP-Adresse unseres Postfix-Servers also die **10.0.0.80** an. Genug der Vorrede, mit nachfolgendem Befehl wird diese restriktive Regel angelegt. | ||
+ | # firewall-cmd --permanent --zone=public --add-rich-rule=" | ||
+ | |||
+ | Zum Aktivieren brauchen wir nun nur einen reload des Firewall-Daemon vornehmen. | ||
+ | # firewall-cmd --reload | ||
+ | |||
+ | Fragen wir nun den Regelsatz unserer **iptables**-basieten Firewall ab, finden wir in der Chain **IN_public_allow** unsere aktive Regel. | ||
+ | # iptables -nvL IN_public_allow | ||
+ | |||
+ | < | ||
+ | pkts bytes target | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | 0 0 ACCEPT | ||
+ | </ | ||
+ | ===== Postfix ===== | ||
+ | Auch der Konfigurationsaufwand auf Seiten von Postfix hält sich in überschaubaren Grenzen. | ||
+ | ==== Konfiguration ==== | ||
+ | Zum Aktivieren der SASL-Autentifikation gegen unseren Dovecot-Server tragen wir die folgenden Zeilen in der Postfix-konfigurationsdatei // | ||
+ | # vim / | ||
+ | <code bash>... | ||
+ | |||
+ | # Django : 2012-10-09 | ||
+ | # SMTP-Auth (SASL) | ||
+ | # Enable SASL authentication in the Postfix SMTP server. By default, the Postfix SMTP server | ||
+ | # does not use authentication. | ||
+ | smtpd_sasl_auth_enable = yes | ||
+ | # The SASL plug-in type that the Postfix SMTP server should use for authentication. The available | ||
+ | # types are and dovecot. | ||
+ | smtpd_sasl_type = dovecot | ||
+ | # Implementation-specific information that the Postfix SMTP server passes through to the SASL | ||
+ | # plug-in implementation that is selected with smtpd_sasl_type. Typically this specifies the | ||
+ | # name of a configuration file or rendezvous point. | ||
+ | smtpd_sasl_path = inet: | ||
+ | # Postfix SMTP server SASL security options; as of Postfix 2.3 the list of available features | ||
+ | # depends on the SASL server implementation that is selected with smtpd_sasl_type. The following | ||
+ | # security features are defined for the cyrus server SASL implementation: | ||
+ | # Restrict what authentication mechanisms the Postfix SMTP server will offer to the client. | ||
+ | # The list of available authentication mechanisms is system dependent. Specify zero or more of | ||
+ | # the following: | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # Only allow methods that support forward secrecy (Dovecot only). | ||
+ | # | ||
+ | # Only allow methods that provide mutual authentication | ||
+ | # (not available with Cyrus SASL version 1). | ||
+ | # | ||
+ | # By default, the Postfix SMTP server accepts plaintext passwords but not anonymous logins. | ||
+ | # | ||
+ | # Warning: it appears that clients try authentication methods in the order as advertised by the | ||
+ | # server (e.g., PLAIN ANONYMOUS CRAM-MD5) which means that if you disable plaintext passwords, | ||
+ | # clients will log in anonymously, | ||
+ | # disable plaintext logins, disable anonymous logins too. Postfix treats anonymous login as no | ||
+ | # authentication. | ||
+ | smtpd_sasl_security_options = noanonymous | ||
+ | # The name of the Postfix SMTP server' | ||
+ | # By default, the local authentication realm name is the null string. | ||
+ | smtpd_sasl_local_domain = $mydomain | ||
+ | # The SASL authentication security options that the Postfix SMTP server uses for TLS encrypted | ||
+ | # SMTP sessions. | ||
+ | smtpd_sasl_tls_security_options = $smtpd_sasl_security_options | ||
+ | # Enable inter-operability with remote SMTP clients that implement an obsolete version of the | ||
+ | # AUTH command (RFC 4954). Examples of such clients are MicroSoft Outlook Express version 4 | ||
+ | # and MicroSoft Exchange version 5.0. | ||
+ | broken_sasl_auth_clients = yes | ||
+ | |||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Ein Restart unseres Postfix-Servers aktiviert unsere Konfigurationsanpassungen. | ||
+ | # systemctl restart postfix | ||
+ | |||
+ | |||
+ | ===== SASL-Anmeldetest ===== | ||
+ | Melden wir uns nun via **telnet** auf Port **25** bei unserem Postfix-Server an werden uns nach Eingabe des **EHLO** die Authentifizierungsmöglichkeiten (gegen unseren Dovecot-SASL-Port 3569) angezeigt. | ||
+ | |||
+ | Bei Test vsind die Eingaben am testenden Client in der Farbe < | ||
+ | |||
+ | Wir bauen also eine Verbindung zu unserem Postfix-Server zum **SMTP** **25** auf und setzen dann den Befehl **EHLO** ab, damit uns der SMTP-server seine Authentifizierungsoptionen anzeigt. | ||
+ | |||
+ | < | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | Connected to 10.0.0.80. | ||
+ | Escape character is ' | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | 250-PIPELINING | ||
+ | 250-SIZE 52428800 | ||
+ | 250-ETRN | ||
+ | 250-STARTTLS | ||
+ | 250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 | ||
+ | 250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 | ||
+ | 250-ENHANCEDSTATUSCODES | ||
+ | 250 8BITMIME</ | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | <font style=" | ||
+ | </ | ||
+ | |||
+ | Melden wir uns nun über unseren Mailclient an, typischerweise passiert das jeweils vor dem Versand von ausgehenden Nachrichten, | ||
+ | # less / | ||
+ | |||
+ | Aug 10 10:56:29 vml000080 postfix/ | ||
+ | |||
+ | Auf seiten unseres Dovecot-Servers passiert natürlich wesentlich mehr, da ja dort die Authentifizierungsanfrage des Postfix-Servers angenommen und bearbeitet wird. Im Detail bedeutet dies, dass der Dovecot-Server eine **passdb-Anfrage** gegen unsere MySQL-Datenbank macht und das Ergebnis **OK** an den postfix-Frontend-Server zurückmeldet. | ||
+ | # less / | ||
+ | |||
+ | <code bash>Aug 10 10:56:29 vml000070 dovecot: auth: Debug: auth client connected (pid=0) | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: client in: AUTH# | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: client passdb out: CONT# | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: client in: CONT# | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: client passdb out: CONT# | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: client in: CONT# | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: sql(michael@nausch.org, | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth-worker(6830): | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth-worker(6830): | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth-worker(6830): | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth-worker(6830): | ||
+ | Aug 10 10:56:29 vml000070 dovecot: auth: Debug: client passdb out: OK# | ||
+ | </ | ||
Zeile 21: | Zeile 669: | ||
* **[[http:// | * **[[http:// | ||
- | ~~DISCUSSION~~ | ||