Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
centos:mail_c7:spam_9 [26.11.2014 12:27. ] – [Konfiguration (single domain)] django | centos:mail_c7:spam_9 [22.07.2019 14:46. ] (aktuell) – django | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | <WRAP center round tip 30%>\\ | ||
- | **//aktuell in Bearbeitung!// | ||
- | </ | ||
====== DKIM - Domain Key Identified Mail unter CentOS 7.x ====== | ====== DKIM - Domain Key Identified Mail unter CentOS 7.x ====== | ||
{{: | {{: | ||
Zeile 19: | Zeile 16: | ||
===== Überprüfung von DKIM-Signaturen ===== | ===== Überprüfung von DKIM-Signaturen ===== | ||
Damit unsere AMaViS-installation die Überprüfung von DKIM-Signaturen im Mailheader vornimmt bedarf es keiner großen Konfiguration. Wie in der [[http:// | Damit unsere AMaViS-installation die Überprüfung von DKIM-Signaturen im Mailheader vornimmt bedarf es keiner großen Konfiguration. Wie in der [[http:// | ||
- | # vim / | + | # vim /etc/amavisd/ |
<code perl>################################################################################ | <code perl>################################################################################ | ||
Zeile 61: | Zeile 58: | ||
# ll / | # ll / | ||
- | < | + | < |
In dieser Datei befindet sich nun der **private key**. | In dieser Datei befindet sich nun der **private key**. | ||
Zeile 136: | Zeile 133: | ||
# signing domain | # signing domain | ||
# ------------- | # ------------- | ||
- | dkim_key(' | + | dkim_key(' |
# DKIM Signing Policies | # DKIM Signing Policies | ||
Zeile 160: | Zeile 157: | ||
Über das Array **@dkim_signature_options_bysender_maps** können ferner Standardwerte für Signatur-Tags überschrieben werden. Dies kann per Sender(Domäne) erfolgen, oder wie im obigen Beispielals "// | Über das Array **@dkim_signature_options_bysender_maps** können ferner Standardwerte für Signatur-Tags überschrieben werden. Dies kann per Sender(Domäne) erfolgen, oder wie im obigen Beispielals "// | ||
+ | ==== Konfiguration (multiple domain) ==== | ||
+ | Haben wir noch weitere [[centos: | ||
+ | # vim / | ||
+ | <code perl>################################################################################ | ||
+ | ## DKIM - Domain Key Identified Mail | ||
+ | # | ||
- | FIXME | + | # DKIM-Signaturen verifizieren |
+ | $enable_dkim_verification = 1; | ||
+ | # DKIM-Signaturen erstellen | ||
+ | $enable_dkim_signing = 1; | ||
+ | # Private Keys und Selectors | ||
+ | # | ||
+ | # signing domain | ||
+ | # ------------- | ||
+ | dkim_key(' | ||
+ | dkim_key(' | ||
+ | dkim_key(' | ||
+ | Betreiben wir einen Mailserver für sehr viele virtuellen Domänen und hat auch noch mehrere Mail-Administratoren, | ||
+ | Bei der [[centos: | ||
+ | # vim / | ||
+ | <code perl>################################################################################ | ||
+ | ## DESTINATIONS | ||
+ | # | ||
+ | # Definition der Verkehrsrichtungen: | ||
+ | # Das ist nach intern. Alle anderen Destinationen sind im Umkehrschluss extern. | ||
+ | @local_domains_maps = ( | ||
+ | [" | ||
+ | read_hash("/ | ||
+ | ); | ||
+ | ... | ||
+ | </ | ||
+ | Hier haben wir ja bereits eine Aufstellung aller bekannten lokalen (virtuellen) Domains. Mit Hilfe dieser Tabelle generieren wir uns nun die Liste mit den DKIM-Schlüsseln. Anstatt jede Domain einzeln in der amavisd.conf aufzuführen, | ||
+ | # vim / | ||
+ | <code perl>################################################################################ | ||
+ | ## DKIM - Domain Key Identified Mail | ||
+ | # | ||
+ | # DKIM-Signaturen verifizieren | ||
+ | $enable_dkim_verification = 1; | ||
+ | # DKIM-Signaturen erstellen | ||
+ | $enable_dkim_signing = 0; | ||
+ | # Private Keys und Selectors | ||
+ | # | ||
+ | # signing domain | ||
+ | # ------------- | ||
+ | # dkim_key(' | ||
+ | # Django : 2014-02-19 | ||
+ | # DKIM-Keys für automatisch generierte Domainliste definieren | ||
+ | open(filehandle,'/ | ||
+ | or die " | ||
+ | while (< | ||
+ | { | ||
+ | chomp; s/ | ||
+ | dkim_key($_, | ||
+ | } | ||
+ | close(filehandle) or die " | ||
+ | # DKIM Signing Policies | ||
+ | @dkim_signature_options_bysender_maps = ( | ||
+ | { ' | ||
+ | { | ||
+ | ttl => 21*24*3600, | ||
+ | c => ' | ||
+ | } | ||
+ | } | ||
+ | ); | ||
+ | ... | ||
+ | </ | ||
+ | ===== DKIM & DNS ===== | ||
+ | ==== public key ==== | ||
+ | Wie Eingangs bereits erwähnt, kann der Empfänger eine DKIM-signierte eMail mit Hilfe des public keys auf Echtheit hin überprüfen. Damit der Empfänger den public key abfragen kann, müssen wir diesen im DNS hinterlegen. Hierzu lassen wir uns den public-key unseres DKIM-keys am besten mit Hilfe des Befehls **amavisd** ausgeben. | ||
+ | # amavisd -c / | ||
+ | < | ||
+ | 140224._domainkey.nausch.org. | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | Möchte man sich alle Schlüssel anzeigen lassen, nutzt man einfach die Option // | ||
+ | # amavisd -c / | ||
+ | < | ||
+ | 140224._domainkey.omni128.de. | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ... | ||
+ | ... | ||
+ | ; key#16, domain c3n705.guru, | ||
+ | 140224._domainkey.c3n705.guru. | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | </ | ||
+ | Natürlich kann man auch **openssl** dazu verwenden, sich den public-key ausgeben zu lassen. | ||
+ | # openssl rsa -in / | ||
+ | | ||
+ | Die Dateiberechtigung passen wir entsprechend an. | ||
+ | # chmod 600 / | ||
+ | Die Schlüsseldatei enthält nun den public-key für unsere DKIM-Konfiguration. | ||
+ | # less / | ||
- | ===== domain_maps ===== | + | < |
+ | MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAojGXwA9zJFJ4wpa2PB51 | ||
+ | amh5s2amqyBpUJR07or9SeqZlGV0193VGGuVM72w7ry8AzTKGZKRf2oPtjgx2zAF | ||
+ | FQDoewOQVDdkQG9g+VGLW/ | ||
+ | 0SE4EN6hcJ0lkgNK8wqzkWvrA5xwouuj1WfXTHm6Ov4I7HRsmHvPyOaK+jpMBBYj | ||
+ | o9qRtZiU48x+DOp3ti3r/ | ||
+ | OdwxnmEMdb4QLgtPV1S3atyq4JFNt2Qc6C06fDzN3ylyH+orrCjBBSa75ZdVxOun | ||
+ | my5Iv7GbFUqX8QAGH1l0KyZWBdlx3YRME2ZpThOjwhG9cl66cc8w7dxlIFM1XZb/ | ||
+ | Z8SlFHFelhaqSovYPAd30pbooU4gL+sGOqqvdc18yXB7jIjUmiBNsO7HTXiI/ | ||
+ | dl+wWylh202hlTdl1VG3Gskup8I2gpuRK7SAsbNRzr2KN05T0B/ | ||
+ | CiPf+z9/ | ||
+ | DQMObGLgidf2+pY7YoxUHigq5ptF8/ | ||
+ | 4sUZajSC04shzSmob+gimAMCAwEAAQ== | ||
+ | -----END PUBLIC KEY----- | ||
+ | </ | ||
- | # yum install perl-DBD-MySQL -y | + | <WRAP round important> |
+ | </ | ||
- | # mysql -h localhost | + | Den, mit Hilfe von **amavisd** ausgegebenen, |
+ | # host -t TXT 140224._domainkey.sec-mail.guru | ||
- | < | + | < |
- | Welcome to the MySQL monitor. | + | 140224._domainkey.sec-mail.guru descriptive text " |
- | Your MySQL connection id is 170683 | + | </ |
- | Server version: 5.1.73 Source distribution | + | |
- | Copyright | + | ==== ADSP ==== |
+ | Über **ADSP**((**A**uthor **D**omain **S**igning **P**ractices)) kann ein (Mail)-Domaininhaber definieren, was ein Mailserver mit einer zu Annahme anstehenden eMail passieren soll, sofern dessen DKIM((**D**omain**K**eys **I**dentified **M**ail))-Signatur **__nicht__** gültig ist. Für ADSP wird dazu ein eigener Qualifier **_adsp** benutzt. Am Beispiel der Domain **sec-mail.guru** ergibt sich der Name **_adsp._domainkey.sec-mail.guru**. | ||
- | Oracle is a registered trademark of Oracle Corporation and/or its | + | Der (TXT)-Datensatz hat dabei folgende Struktur "// |
- | affiliates. Other names may be trademarks of their respective | + | * **unknown** Der Domaininhaber signiert einige __oder__ alle Nachrichten. |
- | owners. | + | * **all** __Alle__ Nachrichten der Mail-Domäne werden mit einer DKIM-Signatur versehen. |
+ | * **discardable** __Alle__ Nachrichten der Mail-Domäne werden mit einer DKIM-Signatur versehen. Darüber hinaus __empfiehlt__ der Domain-Inhaber alle Nachrichten deren DKIM-Signatur gebrochen wurde, bei der die Nachricht also manipuliert wurde, __zu verwerfen__ (REJECT). | ||
+ | Wurde nichts definiert oder ein anderer Wert als die oben angegeben wurde, wird der Default-Wert **unknown** gesetzt. | ||
+ | Somit ergibt sich in unserem Anwendungsbeispiel, | ||
+ | _adsp._domainkey.sec-mail.guru. | ||
+ | Diesen Record veröffentlichen wir nun über unseren DNS. Somit kann ein Empfänger nicht nur den DKIM-Schlüssel zum Verifizieren der DKIM-Signatur abfragen, sondern auch den **ADSP**-TXT-Record und weiß damit, was er ggf. machen sollte, sofern die DKIM-Signatur gebrochen wurde. | ||
- | Type ' | + | ===== Tests ===== |
+ | ==== DNS + private key ==== | ||
+ | Nachdem der TXT zur Verfügung steht, können wir mit Hilfe von **amavisd** diesen Überprüfen. | ||
+ | # amavisd -c / | ||
- | mysql> CREATE USER ' | + | TESTING#1: 141126._domainkey.omni128.de |
- | Query OK, 0 rows affected (0.01 sec) | + | |
+ | |||
+ | | ||
+ | TESTING#16: 141126._domainkey.c3n705.guru | ||
- | mysql> CREATE USER ' | + | Wollen wir nur den Schlüssel einer bestimmten Domain testen, so verwenden wir folgenden Aufruf. |
- | Query OK, 0 rows affected (0.01 sec) | + | # amavisd -c / |
- | mysql> GRANT ALL PRIVILEGES ON postfix.* TO ' | + | TESTING#1: 141126._domainkey.omni128.de => pass |
- | Query OK, 0 rows affected (0.01 sec) | + | |
- | mysql> GRANT ALL PRIVILEGES ON postfix.* TO ' | + | Das folgende Beispiel zeigt eine Abfrage, die die Fehlermeldung |
- | Query OK, 0 rows affected (0.01 sec) | + | # amavisd -c / |
- | mysql> FLUSH PRIVILEGES; | + | TESTING#6: 141126._domainkey.ebersberger-liedersammlung.de |
- | Query OK, 0 rows affected | + | Die Fehlermeldung **bad base64 decode** weißt direkt auf einem Typo-Fehler im Schlüsseldaten hin! |
- | mysql> exit | + | Das nächste Beispiel zeigt eine Abfrage, die eine weitere Fehlermeldung nach sich zieht: |
- | Bye | + | # amavisd -c / |
+ | |||
+ | TESTING#6: 141126._domainkey.ebersberger-liedersammlung.de => fail (OpenSSL error: data too large for key size) | ||
+ | |||
+ | <WRAP center round tip> | ||
+ | Erhalten wir die Fehlermeldung **fail (OpenSSL error: data too large for key size)**, so liegt es meist nicht an einem vermeintlich zu großen DKIM-Schlüssel, | ||
+ | </ | ||
+ | |||
+ | Wurde der public DKIM-Schlüssel **revoked**, | ||
+ | TESTING#6: 140224._domainkey.piraten-it.guru | ||
+ | Möchte man einen DKIM-Schlüssel zurückziehen (**revoke**), | ||
+ | main._domainkey.piraten-it.guru | ||
+ | |||
+ | Wir können natürlich auch direkt den TXT-Record eines Hosts abfragen eim DNS-Server abrufen: | ||
+ | # host -t TXT 141126._domainkey.nausch.org | ||
+ | |||
+ | < | ||
+ | 141126._domainkey.nausch.org descriptive text " | ||
+ | |||
+ | ==== signing und verifying ==== | ||
+ | Nachdem die Überprüfung der AMaViS/ | ||
+ | # vim / | ||
+ | |||
+ | <code perl>################################################################################ | ||
+ | ## DKIM - Domain Key Identified Mail | ||
+ | # | ||
+ | |||
+ | # DKIM-Signaturen verifizieren | ||
+ | $enable_dkim_verification = 1; | ||
+ | |||
+ | # DKIM-Signaturen erstellen | ||
+ | $enable_dkim_signing = 1; | ||
+ | |||
+ | ... | ||
</ | </ | ||
+ | Anschließend führen wir einen Reload des AMaViS-Daemon durch. | ||
+ | # systemctl reload amavisd | ||
- | # vim /root/bin/generate_local_domains_map | + | Schicken wir nun eine Test-eMail so findet der Empfänger im Mailheader die entsprechende DKIM-Signatur. |
+ | < | ||
+ | content-transfer-encoding: | ||
+ | : | ||
+ | 140224; t=1394130616; | ||
+ | RT2RSN/XKdLCPjaYaY=; | ||
+ | izj2W0G8zJe+a5RVAKj9nFlPgPB1KtQ3rCPXmYsn59zJ/DyS30gZjkt43KQUcydr | ||
+ | Hf3z8QmFmPWvvBx/ | ||
+ | ipOZa2FrXNeHJpAhMpAFZ9ynhxV8ekg9v000f6ZLKlzTj5MNuXzohhfdH7I1hy/ | ||
+ | b9r+/ | ||
+ | o+LB2i8zLWNe56hrKDzEoOS872xQQvErezZ4+X7UPpMeswspcaLdnSkbeWMNGElw | ||
+ | pTpL/ | ||
+ | S4Gnk0yXgrx6B9wVwytAhEguDe3dhm6stQgkzvSi0sl1I9WV85OS3+5sFfOpuvju | ||
+ | icOrI2DGNZnuFWFmbiaTLmMlw4y2QENxP/ | ||
+ | mqH8mwZRdaTcQD2M3mtGNqDYIlnCsir/ | ||
+ | XkEEoELtW7aIWIKM2xWagUtmVVW/ | ||
+ | dk= | ||
+ | </ | ||
+ | Der empfangende Mailserver ist mit Hilfe des **Headers:// | ||
+ | < | ||
+ | dkim=pass (4096-bit key) header.d=nausch.org | ||
+ | </ | ||
- | <file perl root/ | + | Wurde die Nachricht jedoch hingegen verändert, so schlägt die Überprüfung fehl und wird entsprechend quittiert: |
- | use DBI; | + | <code>Authentication-Results: amavis.dmz.nausch.org |
- | use strict; | + | dkim=fail (1024-bit key) reason="fail (message has been altered)" |
- | my $config = "/ | + | header.d=controlc.de |
- | my $dbh = DBI-> | + | </ |
- | my $sth = $dbh-> | + | Die Veränderung der Nachricht passierte in dem obigen Beispiel dadurch, dass die Nachricht aus einer Mailingliste vom Mailinglisten-Server verändert wurde, da am Ende der nachricht ein listenspezifischer Mailfooter angefügt wurde. |
- | $sth->execute || die " | + | <WRAP center round info> \\ |
+ | Wie man das Brechen der DKIM-Signaturen durch den Mailinglisten-Manager **mailman** unterbindet, also den Mailinglistenserver DKIM-konform konfiguriert, | ||
+ | </ | ||
- | open (FH, "> $config" | + | ==== signing |
- | while (my @row = $sth->fetchrow_array) { | + | Eine sehr gute und einfache Möglichkeit die DKIM-Konfiguration zu testen, stellt die [[http:// |
- | print FH join(', ', @row), "\n"; | + | Die angegebene temporäre eMailadresse kopieren wir uns und schicken an diese eine Testnachricht. |
- | } | + | |
- | close FH; | + | {{ : |
- | $dbh->disconnect; | + | |
+ | Wir schicken also nun eine Testnachricht an die angegebene Addresse, im einfachsten FAll nutzen wir dazu einfach das Schweizer Taschenmesser für SMTP, kurz **[http:// | ||
+ | # swaks --to Dj4n90-i5-a-G33k@www.brandonchecketts.com --from n3rd@sec-mail.guru --header-X-Test | ||
+ | |||
+ | Über die Schaltfläche **//[View Results]// | ||
+ | === Original Message: === | ||
+ | < | ||
+ | X-Original-To: | ||
+ | Delivered-To: | ||
+ | Received: from mx01.nausch.org (mx01.nausch.org [217.91.103.190]) | ||
+ | by yen.roundsphere.com (Postfix) with ESMTP id 292D1533009D | ||
+ | for < | ||
+ | DKIM-Signature: | ||
+ | message-id: | ||
+ | 140224; t=1417089522; | ||
+ | lqqvsQYKOpYUP8nk7I=; | ||
+ | V9eh4YN2lzh5vdsQrh3fB0wqcQwc46ypNiHrYAXdI/ | ||
+ | 8c808dQGgh5iEy01nkKAoJY3641CZrxp1gshtVyQUrM8x5cRhdk9KvdmHCPMkkCn | ||
+ | vVSC/ | ||
+ | z5pZZYSmw1CBYE644jTtiHcEpy6qonjwh53NL5FrI/ | ||
+ | mJJw+ayVBDuzIxJEta38QySxkdcvS4YejEMTFT7ACcJoZeu0ct3Z9gXYJo301ESr | ||
+ | ZTPoxhqNSRTs105dE26DDVlAUZjeTAtRgJlEge4zhSO4wem2qsRpFjXh7vbjKz7i | ||
+ | Jy/ | ||
+ | LJ440FpkY2EA0zQ1y9O2S62IDDS1ON+fyufJJ0W9oaelTYr45/ | ||
+ | +Irem5j0// | ||
+ | KpPuliFssSxCR4QHC08rVoQda+AtRvGWlNEBgN3RDR65iSm7Q1fJJt3Z6LTakv7/ | ||
+ | 38= | ||
+ | X-Virus-Scanned: | ||
+ | Received: from vml000087.dmz.nausch.org | ||
+ | (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) | ||
+ | (No client certificate requested) | ||
+ | by mx01.nausch.org (Postfix) with ESMTPSA id E9A98C00088 | ||
+ | for < | ||
+ | Date: Thu, 27 Nov 2014 12:58:41 +0100 | ||
+ | To: Dj4n90-i5-a-G33k@www.brandonchecketts.com | ||
+ | From: n3rd@sec-mail.guru | ||
+ | Subject: DKIM-Signing-Test | ||
+ | X-Mailer: swaks v20130209.0 jetmore.org/ | ||
+ | X-Test: test eMail | ||
+ | Message-Id: < | ||
+ | |||
+ | This is a test mailing | ||
+ | </ | ||
+ | |||
+ | === DKIM Information: | ||
+ | < | ||
+ | |||
+ | Message contains this DKIM Signature: | ||
+ | DKIM-Signature: v=1; a=rsa-sha256; | ||
+ | message-id: | ||
+ | 140224; t=1417089522; | ||
+ | lqqvsQYKOpYUP8nk7I=; | ||
+ | V9eh4YN2lzh5vdsQrh3fB0wqcQwc46ypNiHrYAXdI/ | ||
+ | 8c808dQGgh5iEy01nkKAoJY3641CZrxp1gshtVyQUrM8x5cRhdk9KvdmHCPMkkCn | ||
+ | vVSC/ | ||
+ | z5pZZYSmw1CBYE644jTtiHcEpy6qonjwh53NL5FrI/ | ||
+ | mJJw+ayVBDuzIxJEta38QySxkdcvS4YejEMTFT7ACcJoZeu0ct3Z9gXYJo301ESr | ||
+ | ZTPoxhqNSRTs105dE26DDVlAUZjeTAtRgJlEge4zhSO4wem2qsRpFjXh7vbjKz7i | ||
+ | Jy/ | ||
+ | LJ440FpkY2EA0zQ1y9O2S62IDDS1ON+fyufJJ0W9oaelTYr45/ | ||
+ | +Irem5j0// | ||
+ | KpPuliFssSxCR4QHC08rVoQda+AtRvGWlNEBgN3RDR65iSm7Q1fJJt3Z6LTakv7/ | ||
+ | 38= | ||
+ | |||
+ | |||
+ | Signature Information: | ||
+ | v= Version: | ||
+ | a= Algorithm: | ||
+ | c= Method: | ||
+ | d= Domain: | ||
+ | s= Selector: | ||
+ | q= Protocol: | ||
+ | bh= | ||
+ | lqqvsQYKOpYUP8nk7I= | ||
+ | h= Signed Headers: | ||
+ | b= Data: dT0+XLEMpY7/ | ||
+ | V9eh4YN2lzh5vdsQrh3fB0wqcQwc46ypNiHrYAXdI/ | ||
+ | 8c808dQGgh5iEy01nkKAoJY3641CZrxp1gshtVyQUrM8x5cRhdk9KvdmHCPMkkCn | ||
+ | vVSC/ | ||
+ | z5pZZYSmw1CBYE644jTtiHcEpy6qonjwh53NL5FrI/ | ||
+ | mJJw+ayVBDuzIxJEta38QySxkdcvS4YejEMTFT7ACcJoZeu0ct3Z9gXYJo301ESr | ||
+ | ZTPoxhqNSRTs105dE26DDVlAUZjeTAtRgJlEge4zhSO4wem2qsRpFjXh7vbjKz7i | ||
+ | Jy/ | ||
+ | LJ440FpkY2EA0zQ1y9O2S62IDDS1ON+fyufJJ0W9oaelTYr45/ | ||
+ | +Irem5j0// | ||
+ | KpPuliFssSxCR4QHC08rVoQda+AtRvGWlNEBgN3RDR65iSm7Q1fJJt3Z6LTakv7/ | ||
+ | 38= | ||
+ | Public Key DNS Lookup | ||
+ | |||
+ | Building DNS Query for 140224._domainkey.sec-mail.guru | ||
+ | Retrieved this publickey from DNS: v=DKIM1; p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/ | ||
+ | Validating Signature | ||
+ | |||
+ | result = pass | ||
+ | Details: | ||
+ | </code> | ||
+ | |||
+ | === SPF Information: | ||
+ | < | ||
+ | |||
+ | Using this information that I obtained from the headers | ||
+ | |||
+ | Helo Address = mx01.nausch.org | ||
+ | From Address = n3rd@sec-mail.guru | ||
+ | From IP = 217.91.103.190 | ||
+ | SPF Record Lookup | ||
+ | |||
+ | Looking up TXT SPF record for sec-mail.guru | ||
+ | Found the following namesevers for sec-mail.guru: | ||
+ | Retrieved this SPF Record: v=spf1 mx ?all (TTL = 3600) | ||
+ | using authoritative server | ||
+ | Result: pass (Mechanism | ||
+ | |||
+ | Result code: pass | ||
+ | Local Explanation: | ||
+ | spf_header = Received-SPF: | ||
+ | </ | ||
+ | === SPAM-Scoring: | ||
+ | < | ||
+ | Message is NOT marked as spam | ||
+ | Points breakdown: | ||
+ | -0.0 SPF_PASS | ||
+ | -1.9 BAYES_00 | ||
+ | [score: 0.0000] | ||
+ | -0.1 DKIM_VALID_AU | ||
+ | domain | ||
+ | 0.1 DKIM_SIGNED | ||
+ | -0.1 DKIM_VALID | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Besonderheit - Mailinglisten ===== | ||
+ | Wie am Anfang dieses Artikels beschrieben, | ||
+ | |||
+ | Der empfangende Mail-Server ist nun in der Lage, an Hand des öffentlichen Schlüssels, | ||
+ | |||
+ | Und genau bei diesem Punkt haben wir nun bei unserem [[centos: | ||
+ | [[https:// | ||
+ | < | ||
+ | _______________________________________________ | ||
+ | Postfixbuch-users -- http:// | ||
+ | Heinlein Professional Linux Support GmbH | ||
+ | |||
+ | Postfixbuch-users@listen.jpberlin.de | ||
+ | https:// | ||
+ | </ | ||
+ | Haben wir uns die Rahmenbedingungen zum **DKIM** verinnerlicht, | ||
+ | - **eMail nicht verändern**: | ||
+ | - **DKIM Header** entfernen: Soll der Mailheader mit dem **[LISTENNAMEN]** erweitert und ein listenzpezifischer Footer angefügt werden, dann soll unser **AMaViS** etwaige DKIM-Signaturen entfernen. | ||
+ | |||
+ | <WRAP center round tip> \\ | ||
+ | Nachfolgend finden sich daher Hinweise, wie man (s)einen Mailinglistenserver **Mailman** **// | ||
+ | </ | ||
+ | |||
+ | ==== eMail nicht verändern ==== | ||
+ | Eine ungültige DKIM-Signatur bekommen wir immer dann, wenn der Mailheader und/oder der Mailbody, also der Nachrichtentext, | ||
+ | * **Mailheader**: | ||
+ | |||
+ | * **Mailbody**: | ||
+ | %(real_name)s mailing list | ||
+ | %(real_name)s@%(host_name)s | ||
+ | %(web_page_url)slistinfo%(cgiext)s/ | ||
+ | </ | ||
+ | |||
+ | * **Default-Einstellungen**: | ||
+ | |||
+ | # Django : 2014-02-09 | ||
+ | # Vorhandenen Mail-Header und Mail-Body nicht ergaenzen. (DKIM-Signatur bleibt valide) | ||
+ | DEFAULT_SUBJECT_PREFIX = "" | ||
+ | DEFAULT_MSG_HEADER = "" | ||
+ | DEFAULT_MSG_FOOTER = "" | ||
+ | # Django : 2013-02-21 | ||
+ | # Vorhandene DKIM-Header nicht entfernen | ||
+ | REMOVE_DKIM_HEADERS = No | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | Starting mailman: | ||
+ | </ | ||
+ | |||
+ | Mit diesen Änderungen bleiben nunmehr die DKIM-Signaturen der eingehenden Nachrichten intakt und somit valide. | ||
+ | |||
+ | ==== DKIM-Signaturen entfernen ==== | ||
+ | |||
+ | Möchte man auf die Listenspezifischen Detailangaben im **Subject** wie auch am Ende des **Nachrichtentextes** __nicht__ verzichten, haben wir nur noch die Option, eine etwaige DKIM-Signatur vom Mailinglistenserver entfernen zu lassen. Wir tragen hierzu in die Konfigurationsdatei unseres Mailman-Mailinglistenservers nachfolgende Zeilen ein. | ||
+ | # | ||
+ | <file bash vim / | ||
+ | |||
+ | # Django : 2013-02-21 | ||
+ | # Vorhandene DKIM-Header entfernen | ||
+ | REMOVE_DKIM_HEADERS = Yes | ||
+ | |||
+ | ... | ||
</ | </ | ||
+ | Anschließend starten wir unseren Mailinglistenserver einmal durch. | ||
+ | # service mailman condrestart | ||
- | # chmod +x / | + | Shutting down mailman: |
+ | Starting mailman: | ||
+ | ===== Besonderheit - DMARC ===== | ||
+ | Möchten wir DMARC bei der Bewertung der anzunehmenden Nachrichten mit berücksichtigen, | ||
- | # vim / | + | Die Installation und Konfiguration von OpenDMARC ist im Kapitel [[centos:mail_c7:spam_12|DMARC - Domain-based Message Authentication, |
- | <file bash / | + | |
- | PATH=/sbin:/bin:/ | + | |
- | MAILTO=root | + | |
- | HOME=/ | + | |
- | # For details see man 4 crontabs | + | ==== Installation von OpenDKIM ==== |
+ | Die Installation gestaltet sich sehr einfach, da wir das EPEL-Paket direkt mit **yum** installieren können. | ||
+ | # yum install opendkim | ||
- | # Example of job definition: | + | Was bei der Installation alles an Dateien und Verzeichnisse neu im System hinzugefügt worden sind, überprüfen wir mit Hilfe von **rpm -qil < |
- | # .---------------- minute (0 - 59) | + | # rpm -qil opendkim |
- | # | .------------- hour (0 - 23) | + | |
- | # | | .---------- day of month (1 - 31) | + | |
- | # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... | + | |
- | # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun, | + | |
- | # | | | | | | + | |
- | # * * * * * user-name command to be executed | + | |
- | # Django | + | < |
- | # jede Stunde alle Maildomains | + | Version |
- | 0 * * * * root /root/bin/generate_local_domains_map | + | Release |
+ | Architecture: | ||
+ | Install Date: Wed 17 Dec 2014 03:22:40 PM CET | ||
+ | Group : System Environment/ | ||
+ | Size : 591007 | ||
+ | License | ||
+ | Signature | ||
+ | Source RPM : opendkim-2.9.2-2.el7.src.rpm | ||
+ | Build Date : Mon 04 Aug 2014 10:55:31 PM CEST | ||
+ | Build Host : buildvm-14.phx2.fedoraproject.org | ||
+ | Relocations : (not relocatable) | ||
+ | Packager | ||
+ | Vendor | ||
+ | URL : http:// | ||
+ | Summary | ||
+ | Description : | ||
+ | OpenDKIM allows signing and/or verification of email through an open source | ||
+ | library that implements the DKIM service, plus a milter-based filter | ||
+ | application that can plug in to any milter-aware MTA, including sendmail, | ||
+ | Postfix, or any other MTA that supports the milter protocol. | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | |||
+ | ==== Konfiguration ==== | ||
+ | Die Konfiguration von OpenDKIM ist nicht sehr aufwändig, da wir lediglich das Modul **verify** benötigen. Das Signieren der eMails überlassen wir AMaViS. Die Konfiguration hierzu findet sich im Abschnitt [[centos: | ||
+ | # vim / | ||
+ | |||
+ | <file bash / | ||
+ | ## See opendkim.conf(5) or / | ||
+ | |||
+ | ## BEFORE running OpenDKIM you must: | ||
+ | |||
+ | ## - make your MTA (Postfix, Sendmail, etc.) aware of OpenDKIM | ||
+ | ## - generate keys for your domain (if signing) | ||
+ | ## - edit your DNS records to publish your public keys (if signing) | ||
+ | |||
+ | ## See / | ||
+ | |||
+ | ## CONFIGURATION OPTIONS | ||
+ | |||
+ | # Specifies the path to the process ID file. | ||
+ | PidFile / | ||
+ | |||
+ | # Selects operating modes. Valid modes are s (sign) and v (verify). Default is v. | ||
+ | # Must be changed to s (sign only) or sv (sign and verify) in order to sign outgoing | ||
+ | # messages. | ||
+ | Mode v | ||
+ | |||
+ | # Log activity to the system log. | ||
+ | Syslog | ||
+ | |||
+ | # Log additional entries indicating successful signing or verification of messages. | ||
+ | SyslogSuccess | ||
+ | |||
+ | # If logging is enabled, include detailed logging about why or why not a message was | ||
+ | # signed or verified. This causes an increase in the amount of log data generated | ||
+ | # for each message, so set this to No (or comment it out) if it gets too noisy. | ||
+ | LogWhy | ||
+ | |||
+ | # Attempt to become the specified user before starting operations. | ||
+ | UserID | ||
+ | |||
+ | # Create a socket through which your MTA can communicate. | ||
+ | Socket | ||
+ | |||
+ | # Required to use local socket with MTAs that access the socket as a non- | ||
+ | # privileged user (e.g. Postfix) | ||
+ | Umask 002 | ||
+ | |||
+ | # This specifies a text file in which to store DKIM transaction statistics. | ||
+ | # OpenDKIM must be manually compiled with --enable-stats to enable this feature. | ||
+ | # | ||
+ | |||
+ | ## SIGNING OPTIONS | ||
+ | |||
+ | # Selects the canonicalization method(s) to be used when signing messages. | ||
+ | # Django : 2014-12-17 | ||
+ | # default: Canonicalization | ||
+ | Canonicalization | ||
+ | |||
+ | # Domain(s) whose mail should be signed by this filter. Mail from other domains will | ||
+ | # be verified rather than being signed. Uncomment and use your domain name. | ||
+ | # This parameter is not required if a SigningTable is in use. | ||
+ | #Domain example.com | ||
+ | |||
+ | # Defines the name of the selector to be used when signing messages. | ||
+ | # Django : 2014-12-17 | ||
+ | # default: Selector | ||
+ | # Selector | ||
+ | |||
+ | # Specifies the minimum number of key bits for acceptable keys and signatures. | ||
+ | # Django : 2014-12-17 | ||
+ | # default: MinimumKeyBits 1024 | ||
+ | # MinimumKeyBits 1024 | ||
+ | |||
+ | # Gives the location of a private key to be used for signing ALL messages. This | ||
+ | # directive is ignored if KeyTable is enabled. | ||
+ | # Django : 2014-12-17 | ||
+ | # default: KeyFile / | ||
+ | # | ||
+ | |||
+ | # Gives the location of a file mapping key names to signing keys. In simple terms, | ||
+ | # this tells OpenDKIM where to find your keys. If present, overrides any KeyFile | ||
+ | # directive in the configuration file. Requires SigningTable be enabled. | ||
+ | # | ||
+ | |||
+ | # Defines a table used to select one or more signatures to apply to a message based | ||
+ | # on the address found in the From: header field. In simple terms, this tells | ||
+ | # OpenDKIM how to use your keys. Requires KeyTable be enabled. | ||
+ | # | ||
+ | |||
+ | # Identifies a set of " | ||
+ | # of the signing domains without credentials as such. | ||
+ | # | ||
+ | |||
+ | # Identifies a set " | ||
+ | # | ||
+ | # Django : 2014-12-17 | ||
+ | # default: unset | ||
+ | InternalHosts | ||
</ | </ | ||
+ | Unsere eigenen internen Hosts tragen wir in der Konfigurationsdatei // | ||
+ | # vim / | ||
+ | |||
+ | <file bash / | ||
+ | # To use this file, uncomment the # | ||
+ | # option in / | ||
+ | # may be added on separate lines (IP addresses, hostnames, or CIDR ranges). | ||
+ | # The localhost IP (127.0.0.1) should always be the first entry in this file. | ||
+ | 127.0.0.1 | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Django : 2014-12-17 - internes Netz eingetragen | ||
+ | # default: unset | ||
+ | 10.0.0.0/24 | ||
+ | </ | ||
+ | |||
+ | Wie schon auch bei der **[[centos: | ||
+ | |||
+ | In der Konfigurationsdatei **main.cf** unseres Postfix-Mailserver tragen wir dazu in der Section **MILTER** nachfolgende Zeilen ein. | ||
+ | # vim / | ||
+ | |||
+ | <file bash / | ||
+ | |||
+ | ################################################################################ | ||
+ | ## MILTER | ||
+ | # Django : 2014-11-18 | ||
+ | # DMARC Test | ||
+ | # | ||
+ | opendkim_milter | ||
+ | # | ||
+ | amavisd_milter | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | In der Konfigurationsdatei // | ||
+ | # vim / | ||
+ | |||
+ | < | ||
+ | |||
+ | smtp inet n | ||
+ | smtpd | ||
+ | -o smtpd_sasl_auth_enable=no | ||
+ | -o smtpd_milters=${opendkim_milter}, | ||
+ | dnsblog | ||
+ | tlsproxy | ||
+ | </ | ||
+ | |||
+ | Bei unserem AMaViS-Host passen wir nun noch die Konfiguration an. Da wir die DKIM-Verifizierung mit Hilfe des **// | ||
+ | # vim / | ||
+ | |||
+ | <code bash>... | ||
+ | |||
+ | ################################################################################ | ||
+ | ## DKIM - Domain Key Identified Mail | ||
+ | # | ||
+ | |||
+ | # DKIM-Signaturen verifizieren | ||
+ | # Django : 2014-12-17 | ||
+ | # DKIM-Verifizierung mit Hilfe des opendkim-Milters vornehmen | ||
+ | # old : $enable_dkim_verification = 1; | ||
+ | $enable_dkim_verification = 0; | ||
+ | |||
+ | # DKIM-Signaturen erstellen | ||
+ | $enable_dkim_signing = 0; | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Anschließend aktivieren wir diese Änderung am AMaViS-Daemon. | ||
+ | # systemctl restart amavisd | ||
+ | |||
+ | ==== Programmstart ==== | ||
+ | Das Starten des Daemon erfolgt über folgenden Aufruf. | ||
+ | # systemctl start opendkim | ||
+ | |||
+ | Den erfolgreichen Start bzw. den Status des **smf-spf**-Daemon können wir bei Bedarf mit folgendem Aufruf abfragen. | ||
+ | # systemctl status opendkim | ||
+ | |||
+ | < | ||
+ | | ||
+ | | ||
+ | Docs: man: | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | Process: 19548 ExecStart=/ | ||
+ | Main PID: 19549 (opendkim) | ||
+ | | ||
+ | | ||
+ | |||
+ | Dec 17 16:00:28 vml000087.dmz.nausch.org opendkim[19549]: | ||
+ | Dec 17 16:00:28 vml000087.dmz.nausch.org systemd[1]: Started DomainKeys Identified Mail (DKIM) Milter. | ||
+ | </ | ||
+ | |||
+ | Im Syslog wird der Start des Daemon entsprechend dokumentiert | ||
+ | # less / | ||
+ | < | ||
+ | Dec 17 16:00:28 vml000087 systemd: Started DomainKeys Identified Mail (DKIM) Milter. | ||
+ | Dec 17 16:01:01 vml000087 systemd: Created slice user-0.slice. | ||
+ | Dec 17 16:01:01 vml000087 systemd: Starting Session 151 of user root. | ||
+ | Dec 17 16:01:01 vml000087 systemd: Started Session 151 of user root. | ||
+ | </ | ||
+ | |||
+ | |||
+ | Mit Hilfe von **netstat** können wir überprüfen, | ||
+ | # netstat -tulpen | ||
+ | |||
+ | < | ||
+ | Proto Recv-Q Send-Q Local Address | ||
+ | tcp 0 0 0.0.0.0: | ||
+ | tcp 0 0 127.0.0.1: | ||
+ | tcp 0 0 127.0.0.1: | ||
+ | </ | ||
+ | |||
+ | Gleiches können wir natürlich auch mit dem Befehl **lsof** erreichen | ||
+ | # lsof -i:8891 | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | Damit der Daemon automatisch beim Hochfahren des Servers gestartet wird, nutzen wir folgenden Aufruf. | ||
+ | # systemctl enable opendkim.service | ||
+ | |||
+ | ln -s '/ | ||
+ | |||
+ | Wollen wir überprüfen ob der Dienst automatisch startet, verwenden wir folgenden Aufruf. | ||
+ | |||
+ | # systemctl is-enabled opendkim.service | ||
+ | |||
+ | | ||
+ | |||
+ | Die Rückmeldung **enabled** zeigt an, dass der Dienst automatisch startet; ein **disabled** zeigt entsprechend an, dass der Dienst __nicht__ automatisch startet. | ||
+ | |||
+ | Nachdem wir nun unseren opendkim-Milter erfolgreich installiert und konfiguriert haben, können wir auch unseren Postfix Mailserver durchstarten, | ||
+ | |||
+ | ==== Tests und Logging ==== | ||
+ | |||
+ | Wurde die Nachricht unterwegs verändert, | ||
+ | Mar 26 12:52:15 vml000080 opendkim[10943]: | ||
+ | |||
+ | Hingegen wird bei positivem Ergebnis der DKIM-Validierung im maillog vermerkt. | ||
+ | Mar 26 18:02:48 vml000080 opendkim[7535]: | ||
+ | Mar 26 18:02:48 vml000080 opendkim[7535]: | ||
+ | |||
+ | Im Mailheader einer angenommenen eMail finden sich dann entsprechend auch Hinweise zur DKIM-Signaturüberprüfung. | ||
+ | Authentication-Results: | ||
+ | header.d=piratenpartei-bayern.de header.i=@piratenpartei-bayern.de | ||
+ | header.b=WFipEQPn; | ||
+ | |||
+ | Bei negativem Ergebnis wird entsprechend vermerkt. | ||
+ | Authentication-Results: | ||
+ | reason=" | ||
+ | header.d=kitterman.com header.i=@kitterman.com header.b=g01pGD3l; | ||
+ | dkim-adsp=none | ||
+ | |||
+ | |||
+ | ====== Links ====== | ||
+ | * **⇐ [[centos: | ||
+ | * **⇒ [[centos: | ||
+ | * **[[centos: | ||
+ | * **[[wiki: | ||
+ | * **[[http:// | ||