Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

centos:mail_c6:mta_9 [20.04.2018 10:43. ]
centos:mail_c6:mta_9 [22.07.2019 15:06. ] (aktuell)
Zeile 1: Zeile 1:
 +====== DKIM - Domain Key Identified Mail ======
 +{{:​centos:​mail_c6:​dkim-logo.png?​nolink |DKIM Logo}} Zur Sicherstellung der Authentizität von E-Mail-Absendern wurde in 2004 von Yahoo ein Identifikationsprotokoll entwickelt, mit welchem die Authentizität von E-Mail-Absendern sichergestellt werden kann. Dies wurde vor allem mit dem Wunsch zur Eindämmung unerwünschter eMail wie Phishing und/oder Spam konzipiert.
 +Ursprünglich wurde DomainKeys unter dem Titel //​Domain-Based Email Authentication Using Public Keys Advertised in the DNS (DomainKeys)//​ im [[http://​www.ietf.org/​rfc/​rfc4870.txt|RFC 4870]] veröffentlicht. Im [[http://​www.ietf.org/​rfc/​rfc4871.txt|RFC 4871]] wurde dies unter dem Titel //​DomainKeys Identified Mail (DKIM) Signatures//​ über- und in der aktuellen Version [[http://​www.ietf.org/​rfc/​rfc6376.txt|RFC 6376]] weitergeführt.
 +
 +[[http://​www.dkim.org/​|DKIM]] basiert auf asymmetrischer Verschlüsselung,​ bei der eMails mit zwei Signaturen versehen werden, die erste über ein paar Header-Zeilen der Nachricht und die zweite über den Mail-Body, also dem Inhalt einer eMail. Die zugehörigen Prüfsummen werden in standardisierten DKIM-Signature-Headern in der eMail eingetragen. Weitere Informationen hierzu findet man im [[http://​tools.ietf.org/​html/​rfc4871#​section-3.5| RFC 4871]] oder in der [[http://​dkim.org/​specs/​rfc4871-dkimbase.html#​choosing-header-fields|Dokumentation]] von [[http://​dkim.org|DKIM.org]].
 +
 +Der empfangende Mail-Server ist nun in der Lage, an Hand des öffentlichen Schlüssels diese Daten, der im TXT-Record des Domain Name System (DNS) der Domäne abrufbar ist, die Daten zu verifizieren. Ist diese Signatur gültig, ist der Absendeserver der eMail zweifelsfrei festgestellt. Bei einem negativen Ergebnis hat nun der empfangende MTA((**M**ail **T**ransfer **A**gent)) die Möglichkeit,​ die Annahme der eMail zu verweigern bzw. die empfangene Nachricht auszusortieren. Wie bereits erwähnt ist dies möglich, da der sendende MTA jede versendete E-Mail im sogenannten „DomainKey-Signature-Header“ mit einer digitalen Signatur des Inhaltes der E-Mail versieht.
 +Der Domaininhaber (Sender) kann mit Hilfe von **ADSP**((**A**uthor **D**omain **S**igning **P**ractices)) festlegen, was der Empfänger beim Eingang einer eMail tun soll, sofern die DKIM-Signatur gebrochen wurde. Diese Policy wird, wie der öffentliche DKIM-Schlüssel auch, über den DNS publiziert. Weitere Informationen hierzu findet man im [[http://​tools.ietf.org/​html/​rfc5617#​section-4.2.1|RFC 4871]] ​
 +
 +===== Installation von AMaVIS =====
 +Zur Signierung und Überprüfung der empfangenen Daten nutzen wir bei unserem Mailserver-Postfix die Möglichkeiten von AMaViS. Die Grundinstallation von AMaViS ist im Kapitel [[centos:​mail_c6:​spam_3|SPAM- und Virenschutz Mechanismen mit Greylisting,​ policyd-weight,​ ClamAV, SpamAssasin und AMaVIS]] beschrieben. In unserer Postofficeumgebung nutzen wir den [[http://​www.ijs.si/​software/​amavisd/​|AMaVis-Daemon]] in der Version **amavisd-new-2.8.0**. Neben diesem Perl-Programm benötigen wir noch die beiden Pakete **perl-Mail-DKIM** und **perl-Crypt-OpenSSL-RSA** welche bei der Installation von amavisd-new automatisch mitinstalliert wurden.
 +
 +Bei der nachfolgenden Konfigurationsbeschreibung gehen wir davon aus, dass bereits ein funktionierender [[centos:​mail_c6:​mta_1|Mailserver]] wie auch der [[centos:​mail_c6:​spam_3|Viren- und SPAM-Schutz mit Hilfe von AMaViS]] zur Verfügung steht.
 +
 +===== Konfiguration =====
 +Wertvolle Hinweise zur Konfiguration und Nutzung von DKIM entnimmt man am besten der original AMaViS-Dokumentation **[[http://​www.ijs.si/​software/​amavisd/​amavisd-new-docs.html#​dkim|Setting up DKIM mail signing and verification]]**.
 +
 +==== Überprüfung der DKIM-Signaturen ====
 +
 +<WRAP round tip> \\ **WICHTIG:​** Möchte man später **[[centos:​mail_c6:​mta_13|DMARC]]**((**D**omain-based **M**essage **A**uthentication,​ **R**eporting & **C**onformance)),​ bei der Bewertung von **[[centos:​mail_c6:​mta_10|SPF]] __und__ [[centos:​mail_c6:​mta_9|DKIM]]** einsetzen, einsetzen, so greift man zum Überprüfen der DKIM-Signaturen unserer Nachrichten auf das Paket **[[http://​www.opendkim.org/​|OpenDKIM]]**,​ einem MILTER((**M**ail**F**ILTER)) zurück! ​
 +
 +Hintergrund ist, dass die einzelnen Header (SPF und DKIM) nur dann dem DMARC-Milter zur Verfügung stehen, wenn diese als MILTER eingebunden wurden. Einen Mix aus MILTER und AMaViS als smtpd_proxy_filter in Postfix wird hier unweigerlich Fehlschlagen,​ da es ein Problem ist, wenn die Header dann an unterschiedlichen Zeitpunkten bei der eMailverarbeitung eingefügt werden und so für den nächsten Verarbeitungsschritt nicht *sichtbar* sind.
 +
 +Wollen wir also später **DMARC** bei der Mailverarbeitung einsetzen, übersprigen wir die nachfolgende Konfiguration für die Signaturprüpfung durch AMaViS und setzen dafür dann **OpenDKIM** ein. Die Installation und Konfiguration von **OpenDKIM** ist in dem Absatz [[centos:​mail_c6:​mta_9#​besonderheit_-_dmarc|hier]] beschrieben.
 +
 +</​WRAP>​
 +
 +
 +Damit unsere AMaViS-installation die Überprüfung von DKIM-Signaturen im Mailheader vornimmt bedarf es keiner großen Konfiguration. Wie in der [[http://​www.ijs.si/​software/​amavisd/​amavisd-new-docs.html#​dkim-am-verify|Originaldoku]] von Marc Martinec zu entnehmen ist, müssen wir lediglich die Variable **$enable_dkim_verification** setzen, in dem wir ihr den Wert **1** zuweisen.
 +   # vim /​etc/​amavisd.conf
 +
 +<code perl>...
 +
 +$enable_dkim_verification = 1;                  # enable DKIM signatures verification
 +
 +...
 +</​code>​
 +Anschließend starten wir den Dämon einmal durch.
 +   # service amavisd condrestart
 +
 +  Shutting down Mail Virus Scanner (amavisd): ​               [  OK  ]
 +  Starting Mail Virus Scanner (amavisd): ​                    ​[ ​ OK  ]
 +
 +Bekommen wir nun eine eMail mit einer DKIM-Signatur im Mail-Header,​ so können wir diese Headerzeile im Quelltext der Nachricht sehen:
 +<​code>​DKIM-Signature:​ v=1; a=rsa-sha256;​ c=relaxed/​simple;​ d=nausch.org;​ h=
 + content-transfer-encoding:​content-type:​content-type:​subject
 + :​subject:​mime-version:​user-agent:​from:​from:​date:​date:​message-id
 + :​received:​received;​ s=140224; t=1393867197;​ x=1395681598;​ bh=sCU
 + xtMjFEZ3m2MycmeHx9n/​S11f5YgqlMUgftS5R4gg=;​ b=NoF26JrAH2qzT1u+xVp
 + mIOxrFZDt6BYSff5t0wF1LAQxYTcjCun/​FageediXMTzOYFeX644/​PZ3TCjsEeow
 + AXjPbpXTNCVODBzh2elVHhtwHCmbOfbqISCBrd6xBVlzOHloYJB/​UVd8ilAw7Bdr
 + G51wyKxZS5UyWKpd0l8KXijMQSZUcAY8RYk+glKWEl3D3aZTiKH4O0YhvsvM30YC
 + 0qW+k4uTph+gNJkyxxRHLQOGkD6xlaoiHOrTutTCapRJp25TJWKMHBmg6qcNrZFH
 + Pfh6GUMfqISKnjjVQ6VOKISLLmz+bRnWoPWEiPw07LFL91XAkMtKzEhsDT6uaVsr
 + 9or/​xKARDL6Yhlbi23nT/​mrWA0mWrkmnIZxDHnYOTHhWVeU1Pa3gVqJV5AWS7QNF
 + h5szXnn1M3poFEBh9nhqo8hyZaYLHbP1gGctmajftkGmHruGfxULwhitacpCbGa0
 + iYeoI9RY9uETcN6EuKd9dguSm3oOVPO77J69fp1CiPCItgtBL9CpoD3YZyQ/​fMas
 + IZPH1w7fC1XZZW5KQSHUO0sPbhBup3vn9Gjany70sZwnFNqA9qs7gEOsWA9mFACw
 + 6TOst7Q781eMkfWNlIo39v75OspUxGteOFZ4VZSthhN/​QXBvndBOhYpOGYVuYZKv
 + +AI/​2fSj9BuLnp+nVem2aL4Y=
 +</​code>​
 +Unser AMaViS-Daemon kann nun mit Hilfe des Public-Keys des absendenden Mailservers überprüfen,​ ob dieser Eintrag gültig, die Nachricht also nicht manipuliert wurde. Bei einem positivem Prüfungsergebnis vermerkt unser AMaViS-Daemon dies mit einer entsprechenden neuen Header-Zeile.
 +<​code>​Authentication-Results:​ mx1.piratenpartei-bayern.de (amavisd-new);​
 + dkim=pass (4096-bit key) header.d=nausch.org
 +</​code>​
 +\\ 
 +==== Generierung von DKIM-Signaturen ====
 +Wie Eingangs bereits erwähnt, wird bei den //​**DKIM-Signaturen**//​ auf asymmetrischer Verschlüsselung zurück gegriffen. Wir benötigen also ein Schlüsselpaar aus public- und private-key. Bevor wir diese erzeugen, legen wir uns das Zielverzeichnis für unseren privaten Schlüssel an und passen die Berechtigung so an, dass dieses Verzeichnis unserem User amavis "​gehört":​
 +   # mkdir /​var/​amavis/​dkim
 +
 +   # chown amavis:​amavis /​var/​amavis/​dkim
 +
 +Im nächsten Schritt erstellen wir uns nun unser Schlüsselpaar. Dazu benutzen wir die Option **genrsa** des Befehls **amavisd**:​\\
 +''​amavisd **genrsa** file_name [nbits]''​ Beim Dateinamen vermerken wir dabei am einfachsten das Erstellungsdatum **YYMMDD** (Jahr+Monat+Tag,​ z.B. 140228 für 28. Februar 2014). So haben wir es später einfacher, die einzelnen Schlüssel auseinander zu halten, wenn wir mehrere benötigen, oder einzelne Schlüssel für ungültig erklären (revoke'​n). Diesen Datums-Stempel verwenden wir dann auch als **selector** bei der nachfolgenden AMaViS-Konfiguration.
 +   # amavisd genrsa /​var/​amavis/​dkim/​dkim-key-140228.pem 4096
 +
 +  Private RSA key successfully written to file "/​var/​amavis/​dkim/​dkim-key-140228.pem"​ (4096 bits, PEM format)
 +
 +
 +Alternativ können wir auch **openssl** zum Erstellen des Schlüssel verwenden.
 +   # openssl genrsa -out /​var/​amavis/​dkim/​dkim-key-140228.pem 4096
 +
 +  Generating RSA private key, 4096 bit long modulus
 +  ...................++
 +  ...................................++
 +  e is 65537 (0x10001)
 +
 +Haben wir unseren Schlüssel mit Hilfe von **openssl** erzeugt, passen wir die Dateiberechtigungen und Rechte unseres erstellen Schlüssels an.
 +   # chmod 600 /​var/​amavis/​dkim/​dkim-key-140228.pem
 +
 +   # chown amavis:​amavis /​var/​amavis/​dkim/​dkim-key-140228.pem
 +
 +In unserem zuvor Schlüssel-Verzeichnis befindet sich nun der erstellte **private** Schlüssel.
 +   # ll /​var/​amavis/​dkim/​
 +
 +<​code>​-rw------- 1 amavis amavis 3243 Feb 28 21:53 dkim-key-140228.pem</​code>​
 +
 +In dieser Datei befindet sich nun der **private key**.
 +   # cat /​var/​amavis/​dkim/​dkim-key.pem
 +<​code>​-----BEGIN RSA PRIVATE KEY-----
 +MIIJKQIBAAKCAgEAuJ3/​CruOs3fCU0ujOStcNN85TJh+5HvMa9m99C5XuRBlxOr+
 +fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i2ObpRkzKRUXmAa0qVezUZwQIbKei
 +uKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9WamFUUaHeN3+pVGtMyjYekRaAoRlV+
 +a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+ezqbLHLB8DLJQBZEGUILvJjAHX07
 +22XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS4ZPQ89SrK4KcHt/​XptSlztXMWtmR
 +FQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6/​1GujQiMD6po81NpYbrjnfd+QF4s
 +Ubus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnImJhVDnzZODQy0nSafedlr5g4VR36
 +vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv80uMPbEdujrw9gLbK3H8ow42iTic
 +mgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7bkMjufLc29XHbtp22wfgq2Lmarr3
 ++psaHokFaQrImkMbzdSL9CdabkLptanAilLScvq8UaKVC+G1+vHDgaweq3BhXD5+
 +YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFbNJSH5NJuS7GuzplNg+f20ysCAwEA
 +AQKCAgAY4qM4TSPlKSV2mOF9mUyqi9RrcLraDZ32g7lJKt4EQiOVsZ9wbeChX7hF
 +l6Qp65Eoxgb//​s5E3iZoGWcbhMrNNgMHyN4TDGL+otrsDiprYG3KR6Z1gNHzaVx5
 +06ld3n7Q/​mN8JPqxZ98RRjvxXt+h3QYNNuBW6H1kSkesMDaCdB45rNiHm6uY4ivf
 +HUBPjwFpr4uf4lVtjF9goHovPqoQ7ktwaF+gAxiBnP688NwoJebvkqv43Psiw3li
 +yZJzAfwDjVjwWwdGSYEBoJU3S7nsUkJ+O5J/​IPHub3ngMRXQlZ0gOeeGkJr+L16f
 +FQBM9VicLU2mCtwOu+zy4Rck07/​u4/​Xkqnq5cNLbc0a1AYU6UDikB3yrG1QeupGg
 +/​0M11D/​4qDJ8hVK8Sl72SEWMnbkLh5YZEOoKE83C4uQ79yMnbSADXHJfUHmnO6O8
 +aDlCaMoRKw+Dj4n90/​d3R-m4i153rV3R-gURu+p8UXtpz19zXK9nxsBsI1bl/​63M
 +4y0VMba8UjgtSz2rzrjO2BkN4g/​p3k1wmgyxAorJeyZRcNpG+HdBf4jMo5j8f+Jd
 +BlZgjFx0d69v3hToHfWd6Un4yc1+KDsyB1uNwuA1zs5lVX5QGba5LgYhNPUWmhQ/​
 +3Vj2hG7Pp4FpK1UcnwoyX8YqK0/​NJICqkwu+kDUDLHapgnVawQKCAQEA2YR/​pVc4
 +CXEyxwwCfV5Q6qtHdgHGXwKfMikQl86YmDy2DLGTSojQW8BZmlCAxDqmaWit0DN8
 +TEGoM+hkVenz5ebG+SVFGGdQEh+urrRCHkrBIAGiNMHhh0ecKud2z7Pc+nxSDdKS
 +8QPko+wnAzG/​WKNkl73Wvx06UqnbBqMSiG6SKjdtH2Kh2wXb5KT5PQYY112W4JIi
 +53PVQMbgwFdRaJyy1WmCro0OaIs/​6bJPWIKuKdSw35fC6/​lgQsC7elD5p0XrdcpN
 +MuYJJOg0L8GYvIqO5+AIR5tCkutbd5yAEmLoHN6/​IwDrt69YV1yLg27N09a/​RJbI
 +uTkQmtpaJBgzcQKCAQEA2UdrNeaoz9jaRxm6HJgGtIbO8RJM/​9bGYMxgSP+KAGIY
 +nQIEF/​rxySdzIrkBuewIiWgKdjFiP+1DCi7M6IDu3YNxYik6f1Pp2HlZ7MUmT3XF
 +3Tm2RjnR33eCknoicohzEj5tSKFzshCqDDlv1sm9e32+eO5xjgx59EpxvjqQnP/​4
 +PR3gxSIOGfYwAaHJnV3n/​YAKKhM52f09+IMouk0javOYDg96Se6acnZszcLOv8vQ
 +FiwtRTAWiV6wbY1H7SFwWb2fMINsmh9E4eOz17cmwVHDSjxOnCvwUpFsAAqqWRBa
 +jqFxumSApErGEW97E1ucAdeZemqtki0yY3mnu6wqWwKCAQEAwjVNCsDu5W9OWO3e
 +IzVcpcm7ih9XkGj03oJPsFrjX7mFCZxa2AeDkQgSeHc8IPgEsMSnu+bcKfHNTltF
 +infSLgh4yuZ95KYJlcT34EBNcGJqQDt1KgmZZYGIa74yFIyQ1oy9bl3+mHZTZBBr
 +XKzEHU31eI4k+IoOEtRZHHnpCCtBEbRfF9CmlrmKdYDej5+r+k4zcdrIk0KWurlW
 +3iSYKQEPowALj/​GdVbZOoEd2FJ7JBcxDB7+mZ65GRhNy0GkQHkuNSaQQfUtqCqvQ
 +PHtr9Zr4sQsUGWsEa8z747W1m7T3bR9sJMKjs2M5Svb0EauS1ns8Vu8R1F6g9sHS
 +DbwV4QKCAQEAiMguFOOdOCNy3jmy8Rc/​eVw4YIi90n05q2xd3PaJwM4AYq8HNrVy
 +ish78cr37DxL73yAwYE7MbVCc+Gce23XcbmyojIEMm34E5/​pXWWLRZCFvEv9lF4H
 +4h8RIvcidB3qglse0N6IQ/​9gUrCHywypsGOV5DRvZhYym/​hVfITPzxZRBuCNRGy4
 +5d0WwaBBFQEt72cwfuZVkAadgZnIBOhUuJqbCZbyzCIaNp6Yxjux/​gnneF3dLeYk
 ++duTQ5QiSIS5frUhxt+leazfpzi6Wb1h92dqgoxOjIAYrVIA5FHShXkHGS1HNCja
 +1xJ/​eDBvEXOlVX+NjgQkOpabVwYZ8spiawKCAQAI30WzWHPLcFHOhaIIRr7VlUv5
 +IR96T95H+c0a5JzNFhSOwxnqCWOtTmUnlaJcFwbREYl2mrImjht44Tz3bNjQlGqr
 +04WUf1VExh1WRfRGlT8LWuSLgVDHrI6M5yl5sefzILqogHaiEAvKbaTlIowD8hbR
 +MJGE0QdJKZNU/​+dPO5w/​0Rnq2kY54OJhSWZE0Z6zWqMQa3komnqQAXnlvHaUshjy
 +0M8oJ2zG8LEvqJllsjIU3orVPPfkuenWkn3cGQhx1xZIEEaLo1YC8eyAGW2OkKMP
 +OMrxmovD66O4MuPCnnPfcftE1e80Gi/​UgxiVrdGOqx8BZ/​AmChdWFZx5ZrVF
 +-----END RSA PRIVATE KEY-----
 +</​code>​
 +Den ersten Teil unserer Konfiguration haben wir schon erledigt. Nun weisen wir unseren **//​AMaViS//​-Daemon** an unsere ausgehenden Nachrichten mit einer DKIM-Signatur zu versehen. Hierzu tragen wir folgende Zeilen ein.
 +<code perl amavisd.conf>​...
 +
 +$enable_dkim_signing = 0;    # load DKIM signing code, keys defined by dkim_key
 +dkim_key('​nausch.org',​ '​140228',​ '/​var/​amavis/​dkim/​dkim-key-140228.pem
 +', h=>'​sha256'​);​ # Nausch.org'​s Mailserver DKIM-Schluessel
 +@dkim_signature_options_bysender_maps = (
 +    { '​.'​ => { ttl => 21*24*3600, c => '​relaxed/​simple'​ } } # catchall defaults
 +                                        ); 
 +
 +...
 +</​code>​
 +\\
 +<WRAP round important>​Die Variable **$enable_dkim_signing** setzen wir erst noch auf den Wert **0**, da wir unseren public-key erst noch auf dem für uns zuständigen Nameserver einen entsprechenden DNS-Eintrag hinterlegen müssen, sprich wie müssen den public-key veröffentlichen. Anderenfalls würde AMaViS- bereits jetzt schon Nachrichten Signieren, die dann aber vom Empfänger nicht geprüft werden können. Schlimmstenfalls würde das zu **bounces** oder **rejects** führen! ​
 +</​WRAP>​
 +
 +Die Angaben der Schlüsselparameter im obigen Beispiel haben folgende Bedeutungen:​
 +  * **nausch.org** = Maildomäne,​ bei die der Schlüssel verwendet werden soll
 +  * **140228** = Selector: Der Selector wird zusammen mit der Kennung **//​_domainkey//​** und dem Maildomänen-Namen vom empfangenen Mailserver benutzt, um über einen TXT-Abfrage des DNS-Records den verwendeten //​public-key//​ zu erfragen. Bei obigen Beispiel wäre das demnach **//​140228//​._domainkey.nausch.org**
 +  * **/​var/​amavis/​dkim/​dkim-key-140228.pem** = Name und Pfad unseres **//​privatekey //**.
 +  * **h=>'​sha256'​** = Über die Optionen/​tags (RFC 4871 Abschnitt 3.6) kann z.B. Einfluß auf die Signatur genommen werden. Nähere Informationen hierzu entnimmt man entweder dem **[[https://​tools.ietf.org/​html/​rfc5672|RFC 5672]]** oder der **[[http://​www.ijs.si/​software/​amavisd/​amavisd-new-docs.html#​dkim-am-sign|Doku]]** von Marc Martinec.
 +
 +Ü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 "//​catch all//" für alle Absender. Über den Parameter **ttl** kann defniert werden, wie lange eine Signatur nach Erstellung als gültig erachtet werden soll - in unserem Beispiel also 3 Wochen. Der Parameter **c** definiert, wie Amavis die zur Signierung herangezogenen Daten ggf. umeschrieben werden sollen. Detailierte erklärungen hierzu entnimmt man dem Kapitel **[[http://​tools.ietf.org/​html/​rfc4871#​section-3.5|3.5 The DKIM-Signature Header Field]]** bzw. dem Kapitel **[[http://​tools.ietf.org/​html/​rfc4871#​section-3.4|3.4. ​ Canonicalization]]**.
 +
 +Haben wir noch weitere [[centos:​mail_c6:​mta_7|virtuelle Mailserver]] am laufen, können wir durch nachfolgende exeplarische Zeilen erreichen, dass auch diese Nachrichten mit unserem DKIM-Signatur versehen werden können.
 +
 +<code perl amavisd.conf>​...
 +
 +dkim_key('​nausch.org',​ '​140228',​ '/​var/​amavis/​dkim/​dkim-key-140228.pem
 +', h=>'​sha256'​);​
 +dkim_key('​omni128.de',​ '​140228',​ '/​var/​amavis/​dkim/​dkim-key-140228.pem
 +', h=>'​sha256'​);​
 +dkim_key('​ebersberger-liedersammlung.de',​ '​140228',​ '/​var/​amavis/​dkim/​dkim-key-140228.pem
 +', h=>'​sha256'​);​
 +
 +...
 +</​code>​
 +
 +Betreiben wir einen Mailserver für viele Domänen, so kann selbst das händische Pflegen der Domänen in den verschiedenen Konfigurationsdateien zum nervigen und fehleranfälligem Zeitvertreib werden. Abhilfe schafft hier eine zentrale Datei, in der alle **lokalen Maildomänen** enthalten sind. Diese Datei erstellen wir einmal per Hand z.B. mit unserem Editor der Wahl.
 +  # vim /​etc/​postfix/​all_local_domains_map
 +<file /​etc/​postfix/​all_local_domains_map>​omni128.de
 +nausch.org
 +it-ignorant.de
 +it-ignorant.org
 +wetterstation-pliening.info
 +ebersberger-liedersammlung.de
 +</​file>​
 +
 +Hat man sehr viele Maildomänen,​ pflegt man seine virtuellen Maildomänen oft mit Hilfe von **[[http://​postfixadmin.sourceforge.net/​|postfix.admin]]**. Die Installation und Konfiguration von **postfix.admin** ist im Kapitel [[https://​dokuwiki.nausch.org/​doku.php/​centos:​mail_c6:​pfadmin_1|Postfixadmin zur Verwaltung des Dovecot-IMAP-Server unter CentOS 6.x]] detailiert beschrieben.
 +
 +Über ein kleines Script erzeugen wir die oben gezeigte Konfigurationsdatei //​**/​etc/​postfix/​all_local_domains_map**//​.
 +   # vim /​usr/​local/​bin/​generate_local_domains_maps
 +<file perl /​usr/​local/​bin/​generate_local_domains_maps>#​!/​usr/​bin/​perl
 +# Perl-script zum Erstellen der Datei /​etc/​postfix/​all_local_domains_map mit den
 +# Daten aus der mySQL-Datenbank "​postfix"​ von postfix.admin
 +# Wir verbinden uns dabei mit dem User "​amavisd_systemuser"​ und dem Passwort "​Dj4n90_d3r_m4i153rv3r_guru"​
 +# mit der Datenbank "​postfix"​ auf dem mySQL-Datenbank-Server "​mysql.dmz.nausch.org"​
 +# Django : 2014-02-10
 +#
 +use DBI;
 +use strict;
 +my $config = "/​etc/​postfix/​all_local_domains_map";​
 +my $dbh = DBI->​connect("​dbi:​mysql:​database=postfix;​host=mysql.dmz.nausch.org:​3306;​user=amavisd_systemuser;​password=Dj4n90_d3r_m4i153rv3r_guru"​) || die "​Cannot connect to database\n",​ $DBI::​Errstr;​
 +
 +my $sth = $dbh->​prepare("​select domain from domain where active = '​1'"​); ​
 +
 +$sth->​execute || die "​failed to execute:\n ", $DBI::​Errstr;​
 +
 +open (FH, "> $config"​) || die "​Cannot open file\n";​
 +while (my @row = $sth->​fetchrow_array) {
 +    print FH join(',​ ', @row), "​\n";​
 +}
 +close FH;
 +$dbh->​disconnect;​
 +</​file>​
 +
 +Anschließend tragen wir in der //​**/​etc/​crontab**//​ nachfolgende Zeile ein: **0 * * * * root /​usr/​local/​bin/​generate_local_domains_maps**
 +   # vim /​etc/​crontab
 +<file bash /​etc/​crontab>​...
 +
 +# Django : 2014-02-10
 +# jede Stunde alle Maildomains in configfile für amavisd schreiben
 +0 * * * * root /​usr/​local/​bin/​generate_local_domains_maps
 +
 +...
 +</​file>​
 +
 +In der **AMaViS**-Konfigurationsdatei //​**/​etc/​amavisd.conf**//​ tragen wir nun noch nachfolgende Konfiguration ein.
 +   # vim /​etc/​amavisd.conf
 +<code perl /​etc/​amavisd.conf>​...
 +
 +# Django : 2014-02-28
 +# DKIM-Keys für automatisch generierte Domainliste definieren
 +  open(filehandle,'/​etc/​postfix/​all_local_domains_map'​)
 +    or die "​Can'​t open domain-list-file:​ $!";
 +       while (<​filehandle>​)
 +             {
 +              chomp; s/​\s*#​.*$//;​ next if $_ eq '';​
 +              dkim_key($_,​ '​140228',​ '/​var/​amavis/​dkim/​dkim-key-140228.pem',​ h=>'​sha256'​);​
 +             }
 +  close(filehandle) or die "​Can'​t close domain-list-file:​ $!";
 +
 +# Django : 2014-02-07
 +#​@local_domains_maps = ( ["​.$mydomain"​] );      # list of all local domains
 +@local_domains_maps = ( read_hash("/​etc/​postfix/​all_local_domains_map"​) );
 +</​code>​
 +
 +Damit **AMaViS** ausgehende eMail auch signieren kann, muss der Deamon natürlich wissen, welche Domains "//​local//"​ sind und welche Nachrichten nach extern verschickt werden, kurz handelt es sich um einen //legitimen Sender//. Hierzu setzen wir noch den Parameter **@mynetworks**. Dieses Array definiert eine Liste von IP-Adressen bzw. Netzwerksegmente,​ die **AMaViS** als internen Server/​Sender,​ also dem Mailserver zugeordnete Maschinen, betrachten soll.
 +
 +Wir tragen also in unserer Konfigurationsdatei //​**/​etc/​amavisd.con**//​ die betreffenden Adressbereiche ein, sofern wir das bei der [[centos:​mail_c6:​spam_3|Grundkonfiguration von AMaViS]] nicht bereits erledigt haben.
 +   # vim /​etc/​amavisd.conf
 +
 +<file perl /​etc/​amavisd.conf>​...
 +
 +# Django : 2012-05-21
 +# @mynetworks = qw( 127.0.0.0/8 [::1] [FE80::]/10 [FEC0::]/10
 +#                   ​10.0.0.0/​8 172.16.0.0/​12 192.168.0.0/​16 );
 +@mynetworks = qw( 127.0.0.0/8 10.0.0.0/24 10.0.10.0/​26 );
 +
 +...
 +</​file>​
 +
 +Somit haben wir alle internen Sender hinreichend qualifiziert,​ was noch fehlt sind nun alle externern mobilen Klienten, die in der Regel von dynamischen IP-Adressen aus ihre Nachrichten einliefern. Diese IP-Adressen können natürlich unmöglich unserem Array **//​@mynetworks//​** zugeschlagen werden. In den seltensten Fällen wird die entsprechende IP-Adresse "//​sauber//"​ sein, sondern wir bereits auf vielen Blacklist gelandet sein, bzw. der ISP hat die entsprechenden IP-Adressbereiche von sich aus an Dienste wie [[http://​www.spamhaus.org|SPAMHAUS]] gemeldet haben. ​
 +
 +Für diese Nutzer haben wir auf unserem Postfix-Mailserver den Submission-Port **587** eingerichtet. Das besondere an diesem Port ist die zwingende Notwendigkeit,​ dass sich der Sender vor dem Einliefern zwingend mit SMTP-Authentifizierung identifizieren muss. Nähere Informationen hierzu findet man im [[https://​tools.ietf.org/​html/​rfc4409|RFC 4409]]. Wir können also einem erfolgreich authentifizierten Klient eine ähnliche Vertrauensstellung gewähren, wie einem Sender aus dem eigenen Netzwerk!
 +
 +Haben wir die Einrichtung des Submission-Ports auf Seiten unseres Postfix-Servers noch nicht vorgenommen,​ holen wir diesen wichtigen Schritt nun nach. Hierzu aktivieren wir die bereits vorgefertigte Konfig in der **master.cf** und passen diese noch entsprechend an.
 +   # vim /​etc/​postfix/​master.cf
 +<file bash /​etc/​postfix/​master.cf>​...
 +
 +# Django : 2013-02-15
 +# # Submission auf Port 587 geöffnet
 +submission inet n       ​- ​      ​n ​      ​- ​      ​- ​      smtpd
 +          -o smtpd_tls_security_level=encrypt
 +          -o smtpd_sasl_auth_enable=yes
 +          -o mydestination=lists.nausch.org,​fax.nausch.org
 +          -o smtpd_client_restrictions=permit_mynetworks,​permit_sasl_authenticated,​reject
 +          -o smtpd_etrn_restrictions=reject
 +          -o smtpd_proxy_filter=amavis.dmz.nausch.org:​10026
 +          -o milter_macro_daemon_name=ORIGINATING
 +
 +# Django : 2013-02-15
 +# HTPPS auf Port 465 geöffnet
 +smtps     ​inet ​ n       ​- ​      ​n ​      ​- ​      ​- ​      smtpd
 +          -o smtpd_tls_security_level=encrypt
 +          -o smtpd_tls_wrappermode=yes
 +          -o smtpd_sasl_auth_enable=yes
 +          -o smtpd_client_restrictions=permit_mynetworks,​permit_sasl_authenticated,​reject
 +          -o smtpd_etrn_restrictions=reject
 +          -o smtpd_proxy_filter=amavis.dmz.nausch.org:​10026
 +          -o milter_macro_daemon_name=ORIGINATING
 +...
 +</​file>​
 +
 +Anschließend starten wir unseren Postfix-Mailserver einmal durch.
 +   # service postfix condrestart
 +
 +  Shutting down postfix: ​                                    ​[ ​ OK  ]
 +  Starting postfix: ​                                         [  OK  ]
 +
 +Nun müssen wir unserem **AMaViS**-Daemon noch so konfigurieren,​ dass dieser auch auf dem Port **10026** lauscht und die Nachrichten die auf diesem port eingehen einer spezielen **policy_bank** zuordnet. Dies ist nicht sonderlich aufwändig, da in der //​**etc/​amavisd.conf**//​ für die **policy-bank** **__ORIGINATING__** fast alles schon vorbereitet ist.
 +   # vim /​etc/​amavisd.conf
 +
 +<file perl /​etc/​amavisd.conf>​...
 +
 +# Django : 2014-02-10
 +# default: $inet_socket_port = 10024;
 +#​$inet_socket_port = 10024; ​  # listen on this local TCP port(s)
 +$inet_socket_port = [10024,​10026]; ​ # listen on multiple TCP ports
 +
 +...
 +
 +# it is up to MTA to re-route mail from authenticated roaming users or
 +# from internal hosts to a dedicated TCP port (such as 10026) for filtering
 +$interface_policy{'​10026'​} = '​ORIGINATING';​
 +
 +$policy_bank{'​ORIGINATING'​} = {  # mail supposedly originating from our users
 +  originating => 1,  # declare that mail was submitted by our smtp client
 +  allow_disclaimers => 1,  # enables disclaimer insertion if available
 +  # notify administrator of locally originating malware
 +  virus_admin_maps => ["​virusalert\@$mydomain"​],​
 +  spam_admin_maps ​ => ["​virusalert\@$mydomain"​],​
 +  warnbadhsender ​  => 1,
 +  # forward to a smtpd service providing DKIM signing service
 +  #​forward_method => '​smtp:​[127.0.0.1]:​10027',​
 +  # force MTA conversion to 7-bit (e.g. before DKIM signing)
 +  smtpd_discard_ehlo_keywords => ['​8BITMIME'​],​
 +  bypass_banned_checks_maps => [1],  # allow sending any file names and types
 +  terminate_dsn_on_notify_success => 0,  # don't remove NOTIFY=SUCCESS option
 +};
 +
 +...
 +</​file>​
 +
 +Damit AMaVis nun Kenntnis von unseren Änderungen erfährt, starten wir diesen einmal durch.
 +   # service amavisd restart
 +
 +  Shutting down Mail Virus Scanner (amavisd): ​               [  OK  ]
 +  Starting Mail Virus Scanner (amavisd): ​                    ​[ ​ OK  ]
 +
 +==== öffentlichen Schlüssel ====
 +Damit wir den unseren öffentlichen Schlüssel via DNS veröffentlichen können, lassen wir uns den public-key unseres DKIM-keys am besten mit Hilfe des Befehls **amavisd** ausgeben.
 +   # amavisd showkey nausch.org
 +
 +<​code>;​ key#2, domain nausch.org, /​var/​amavis/​dkim/​dkim-key_140224.pem
 +140224._domainkey.nausch.org. 3600 TXT (
 +  "​v=DKIM1;​ p="
 +  "​MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/​CruOs3fCU0ujOStc"​
 +  "​NN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i"​
 +  "​2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9Wa"​
 +  "​mFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+"​
 +  "​ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS"​
 +  "​4ZPQ89SrK4KcHt/​XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6"​
 +  "/​1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnI"​
 +  "​mJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv"​
 +  "​80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7"​
 +  "​bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLS"​
 +  "​cvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFb"​
 +  "​NJSH5NJuS7GuzplNg+f20ysCAwEAAQ=="​)
 +</​code>​
 +
 +Alternativ können wir auch hier den public-key mittels **openssl** erstellen und auf die Platte schreiben lassen.
 +   # ​ openssl rsa -in /​var/​amavis/​dkim/​dkim-key_140224.pem -out /​var/​amavis/​dkim/​dkim-key_140224_public.pem -pubout -outform PEM
 +
 +   ​writing RSA key
 +
 +Die Dateiberechtigung passen wir entsprechend an:
 +   # chmod 600 /​var/​amavis/​dkim/​dkim-key_140224_public.pem
 +
 +Die Schlüsseldatei enthält nun den public-key für unsere DKIM-Konfiguration.
 +   # cat /​var/​amavis/​dkim/​dkim-key_140224_public.pem
 +
 +<​code>​-----BEGIN PUBLIC KEY-----
 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/​CruOs3fCU0ujOStc
 +NN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i
 +2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9Wa
 +mFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+
 +ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS
 +4ZPQ89SrK4KcHt/​XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6
 +/​1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnI
 +mJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv
 +80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7
 +bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLS
 +cvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFb
 +NJSH5NJuS7GuzplNg+f20ysCAwEAAQ==
 +-----END PUBLIC KEY-----
 +</​code>​
 +
 +<WRAP round important>​Den public-key lassen wir uns am besten mit Hilfe des Befehls **amavisd** ausgeben, denn so können wir einfach die Zeichenfolge direkt in die [[http://​de.wikipedia.org/​wiki/​Zonendatei|ZONEN des Nameserver]] [[https://​dokuwiki.nausch.org/​doku.php/​centos:​bind_c6|BIND]] ein. Somit können auch einfach größere Schlüssel, wie in unserem Beispiel **4096 bits** hinterlegt werden, da der Schlüssel bereits in mehrere TXT-Häppchen aufgeteilt wurde!
 +</​WRAP>​
 +
 +Die nachfolgende Zeichenfolge veröffentlichen wir nun überunseren Nameserver. Dazu tragen wir die Textausgabe entweder in die ZONEN-Datei unseres eigenen DNS-Servers ein, tragen die Daten in die WEB-GUI unseres ISPs ein oder schicken die Daten dem DNS-Administrator des Domain-Hosters mit der Bitte, diese dort zu hinterlegen.
 +
 +Alternativ zur Abfrage einer Domäne kann man sich auch alle Schlüssel mit Hilfe des Befehlss **amavisd showkeys** anzeigen lassen.
 +
 +   # amavisd showkeys
 +<​code>;​ key#1, domain omni128.de, /​var/​amavis/​dkim/​dkim-key_4096.pem
 +140224._domainkey.omni128.de. 3600 TXT (
 +  "​v=DKIM1;​ p="
 +  "​MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/​CruOs3fCU0ujOStc"​
 +  "​NN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i"​
 +  "​2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9Wa"​
 +  "​mFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+"​
 +  "​ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS"​
 +  "​4ZPQ89SrK4KcHt/​XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6"​
 +  "/​1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnI"​
 +  "​mJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv"​
 +  "​80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7"​
 +  "​bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLS"​
 +  "​cvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFb"​
 +  "​NJSH5NJuS7GuzplNg+f20ysCAwEAAQ=="​)
 +
 +...
 +
 +...
 +
 +; key#16, domain c3n705.guru,​ /​var/​amavis/​dkim/​dkim-key_140224.pem
 +140224._domainkey.c3n705.guru. 3600 TXT (
 +  "​v=DKIM1;​ p="
 +  "​MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/​CruOs3fCU0ujOStc"​
 +  "​NN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i"​
 +  "​2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9Wa"​
 +  "​mFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+"​
 +  "​ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS"​
 +  "​4ZPQ89SrK4KcHt/​XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6"​
 +  "/​1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnI"​
 +  "​mJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv"​
 +  "​80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7"​
 +  "​bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLS"​
 +  "​cvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFb"​
 +  "​NJSH5NJuS7GuzplNg+f20ysCAwEAAQ=="​)
 +</​code>​
 +===== ADSP =====
 +Eingangs wurde bereits schon erwähnt, dass der Domaininhaber und Absender die Möglichkeit hat, dem Empfänger weitere Informationen zur DKIM-Signatur-Policy mitzugeben. ​
 +Die Publizierung erfolgt wir der öffentliche DKIM-Schlüssel auch schon über den DNS. Beim unserer Installation **nausch.org** wird der Name **<​selector>​**._domainkey.nausch.org benutzt, wobei der Domaininhaber den **<​selector>​** nutzt, den aktuellen Schlüssel an Hand eines eindeutigen Datums zu qualifizieren. Im aktuellen Beispiel lautet dieser:
 +**140224._domainkey.nausch.org**
 +
 +Für **ADSP** wird der eigene Qualifier **_adsp** verwendet, somit wird lautet der Name für unsere Doamin **nausch.org**:​
 +**_adsp._domainkey.nausch.org**
 +
 +Der (TXT)-Datensatz hat dabei folgende Struktur "//​dkim=**<​WERT>​**//"​. Über den **<​WERT>​** kann der Domaininhaber folgendes festlegen:
 +  * **unknown** Der Domaininhaber signiert einige oder alle Nachrichten. ​
 +  * **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 Wert **unknown** gesetzt.
 +Somit ergibt sich in unserem Anwendungsbeispiel,​ bei dem der Domaininhaber von **sec-mail.guru** selbst alle Nachrichten signiert und dem Empfänger bittet, Nachrichten mit schadhafter DKIM-Signatur zu rejecten, folgender TXT-Record: ​
 +  _adsp._domainkey.sec-mail.guru. ​         IN TXT  "​dkim=discardable;"​
 +Diesen Record veröffentlichen wir nun über unseren DNS.
 +
 +===== Tests =====
 +==== Schlüssel ====
 +Nachdem der TXT zur Verfügung steht, können wir mit Hilfe von **amavisd** diesen Überprüfen.
 +   # amavisd testkeys
 +
 +  TESTING#1: 140224._domainkey.omni128.de ​        => pass
 +  ...
 +  ...
 +  ...
 +  TESTING#16: 140224._domainkey.c3n705.guru ​      => pass
 +
 +Wollen wir nur den Schlüssel einer bestimmten Domain testen, so verwenden wir folgenden Aufruf.
 +   # amavisd testkey domain omni128.de
 +
 +  TESTING#1: 140224._domainkey.omni128.de ​        => pass
 +
 +Das folgende Beispiel zeigt eine Abfrage, die die Fehlermeldung **invalid (public key: OpenSSL error: bad base64 decode)** nach sich zieht.
 +   # amavisd testkey domain ebersberger-liedersammlung.de
 +
 +  TESTING#6: 140224._domainkey.ebersberger-liedersammlung.de ​     => invalid (public key: OpenSSL error: bad base64 decode)
 +Die Fehlermeldung **bad base64 decode** weißt direkt auf einem Typo-Fehler im Schlüsseldaten hin!
 +
 +Das nächste Beispiel zeigt eine Abfrage, die eine weitere Fehlermeldung nach sich zieht:
 +   # amavisd testkey domain ebersberger-liedersammlung.de
 +
 +  TESTING#6: 140224._domainkey.ebersberger-liedersammlung.de => fail (OpenSSL error: data too large for key size)
 +
 +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,​ den wir verwenden, sondern schlichtweg an einem Typo-Fehler beim DNS-Eintrag unseres //​DKIM-Schlüssels//​!
 +
 +Wurde der public DKIM-Schlüssel **revoked**,​ also zurückgezogen,​ zeigt dies nachfolgende Fehlermeldung. ​
 +  TESTING#6: 140224._domainkey.piraten-it.guru ​  => invalid (public key: revoked)
 +Möchte man einen DKIM-Schlüssel zurückziehen (**revoke**),​ dann löscht man im DNS-Eintrag einfach den Teil hinter dem **//p=//**:
 +  main._domainkey.piraten-it.guru ​          ​IN ​     TXT     "​v=DKIM1;​ p="
 +
 +Wir können natürlich auch direkt den TXT-Record eines Hosts abfragen eim DNS-Server abrufen:
 +   # host -t TXT 140224._domainkey.nausch.org
 +
 +<​code>;;​ Truncated, retrying in TCP mode.
 +140224._domainkey.nausch.org descriptive text "​v=DKIM1\;​ p=" "​MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/​CruOs3fCU0ujOStc"​ "​NN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i"​ "​2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9Wa"​ "​mFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+"​ "​ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS"​ "​4ZPQ89SrK4KcHt/​XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6"​ "/​1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnI"​ "​mJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv"​ "​80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7"​ "​bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLS"​ "​cvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFb"​ "​NJSH5NJuS7GuzplNg+f20ysCAwEAAQ=="</​code>​
 +
 +
 +==== lokaler Test beim Empfänger/​Mailserver ====
 +Für die abschließenden Test aktivieren wir nun in der AMaViS-Konfigurationsdatei //​**/​etc/​amavisd.conf**//​ die anfänglich gesperrte Option //​enable_dkim_signing//​.
 +   # vim /​etc/​amavisd.conf
 +
 +   ​$enable_dkim_signing = 1;    # load DKIM signing code, keys defined by dkim_key
 +
 +Zur Aktivierung der DKIM-Signaturfunktion starten wir den AMaViS-Dämon 1x durch.
 +   # service amavisd condrestart
 +
 +  Shutting down Mail Virus Scanner (amavisd): ​               [  OK  ]
 +  Starting Mail Virus Scanner (amavisd): ​                    ​[ ​ OK  ]
 +
 +Schicken wir nun eine Test-eMail so findet der Empfänger im Mailheader die entsprechende DKIM-Signatur:​
 +<​code>​DKIM-Signature:​ v=1; a=rsa-sha256;​ c=relaxed/​simple;​ d=nausch.org;​ h=
 + content-transfer-encoding:​content-type:​content-type:​mime-version
 + :​user-agent:​from:​from:​date:​date:​message-id:​received:​received;​ s=
 + 140224; t=1394130616;​ x=1395945017;​ bh=frcCV1k9oG9oKj3dpUqdJg1Px
 + RT2RSN/​XKdLCPjaYaY=;​ b=JTAoETI+ZtTJ0xFDk4DcZqDxPAq+fOuQ+BbjyYmMx
 + izj2W0G8zJe+a5RVAKj9nFlPgPB1KtQ3rCPXmYsn59zJ/​DyS30gZjkt43KQUcydr
 + Hf3z8QmFmPWvvBx/​bLKWrs9+RwsckDsJ7OSh1u3pOvqaTzdMjOcxt3CFNFXhSBj0
 + ipOZa2FrXNeHJpAhMpAFZ9ynhxV8ekg9v000f6ZLKlzTj5MNuXzohhfdH7I1hy/​R
 + b9r+/​zTY0NjEtCvLn2k/​HBmoDxzUwx5A/​XuQGTcEfBZelFgKdJuaDTNVCdlPgmSv
 + o+LB2i8zLWNe56hrKDzEoOS872xQQvErezZ4+X7UPpMeswspcaLdnSkbeWMNGElw
 + pTpL/​h/​WN3lJiVYB7+ZrC0k/​V79KZWsui7og3KZ9PwyO9wB6HJOM80O8zIs8jH6o
 + S4Gnk0yXgrx6B9wVwytAhEguDe3dhm6stQgkzvSi0sl1I9WV85OS3+5sFfOpuvju
 + icOrI2DGNZnuFWFmbiaTLmMlw4y2QENxP/​EonCuVKCGit5CGdkuJU+Q6HVfkseGU
 + mqH8mwZRdaTcQD2M3mtGNqDYIlnCsir/​whLhkFqP/​zeqCAm9sRbJXAuYIfxrONDm
 + XkEEoELtW7aIWIKM2xWagUtmVVW/​FBbYOonMNuyLuC7Gf9q5gN5WqMwapJRjdtNQ
 + dk=
 +</​code>​
 +Der empfangende Mailserver ist mit Hilfe des **Authentication-Results://​-Header//​** in der Lage festzustellen,​ ob die eMail unverändert angekommen und somit nicht manipuliert wurde:
 +<​code>​Authentication-Results:​ mx1.tachtler.net (amavisd-new);​
 + dkim=pass (4096-bit key) header.d=nausch.org
 +</​code>​
 +
 +Wurde die Nachricht hingegen verändert, so schlägt die Überprüfung fehl und wird entsprechend quittiert:
 +<​code>​Authentication-Results:​ amavis.dmz.nausch.org (amavisd-new);​
 + dkim=fail (1024-bit key) reason="​fail (message has been altered)"​
 + header.d=controlc.de
 +</​code>​
 +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.
 +==== WEB-online ====
 +Eine sehr gute und einfache Möglichkeit die DKIM-Konfiguration zu testen, stellt die [[http://​www.brandonchecketts.com/​emailtest.php|DomainKeys,​ DKIM, SPF, SpamAssassin Email Validator]] von [[http://​www.brandonchecketts.com|Brandon Checketts]] dar.
 +Die angegebene temporäre eMailadresse kopieren wir uns und schicken an diese eine Testnachricht.
 +
 +{{ :​centos:​mail_c6:​email-validator.png?​500 |eMail Testseite}}
 +
 +Über die Schaltfläche **//[View Results]//​** erhalten wir dann die Prüfungsergebnisse unserer Testnachricht präsentiert. ​
 +
 +=== Original Message: ===
 +<​code>​Return-Path:​ <​django@nausch.org>​
 +X-Original-To:​ Dj4n90-i5-a-G33k@www.brandonchecketts.com
 +Delivered-To:​ spamapp@yen.roundsphere.com
 +Received: from mx01.nausch.org (mx01.nausch.org [217.91.103.190])
 + by yen.roundsphere.com (Postfix) with ESMTP id 7297B53300D2
 + for <​Dj4n90-i5-a-G33k@www.brandonchecketts.com>;​ Thu,  6 Mar 2014 13:42:13 -0500 (EST)
 +Received: from viruswall.dmz.nausch.org (vml000060.dmz.nausch.org [10.0.0.60])
 + by mx01.nausch.org (Postfix) with ESMTP id 691224A
 + for <​Dj4n90-i5-a-G33k@www.brandonchecketts.com>;​ Thu,  6 Mar 2014 19:42:03 +0100 (CET)
 +DKIM-Signature:​ v=1; a=rsa-sha256;​ c=relaxed/​simple;​ d=nausch.org;​ h=
 + content-transfer-encoding:​content-type:​content-type:​subject
 + :​subject:​mime-version:​user-agent:​from:​from:​date:​date:​message-id
 + :​received:​received;​ s=140224; t=1394131320;​ x=1395945721;​ bh=c0z
 + mKE3eWNgYb30A42NNvzmrD4zdGQYblGKdqriyyJM=;​ b=FM7au9fI7gUwznGnpZd
 + m2iCsFB0ufNhWGcGNadPZC82G6XhJ+9TRrXIhqgBLHWvVMZ4XvcWfoX0QEwjwU8Q
 + SuLItU4J/​+HuGFhrgEkbDO3TzYvRg1LzgTVX4CeYSfQ7rwcoOrcCmDge1li9W+kB
 + kfmk3ZSdwHJIjAU+qvb9fY706FGZpv8vMm6k5jH4fIptrNsncyT131P4bp9Kj4eF
 + kIYCz1jErtbsxicWmUMv4Jvb02+hfYfecmoT318xsq6J8IojIVNVLEeBDewkhI0s
 + ae5tjbgF8HUM8v3STvbd9q78+wVHerSV/​L3KyUJQjMlQr+dWXn2W/​6cu7+cM1QiH
 + xNlNdKlekrl1GdqGgIFxWAzQncl0qLWzvla3QZpoA/​U9YMZB59NY/​jgPIcVzLJPh
 + 1TDWALr1TqHP5Hlw9uuBKxe24JEqBf+R+Srpy1rJFXVjNhE6bskYC+mk4czfjPZL
 + LmJPRUNiVwI50scsxq6p5uYFqab0ls+kv7pBYITbxuHtZdtEFuS/​Kv65gcOAIcNh
 + l1Npp173MIWTT/​1lVCt9TZWgsEU4vxTxem0GBOxM9Lf99oVukM5MueJlAJ0fYtM2
 + ivaFQpBFqNna91f2/​Pu3MkdeKYKWf9wp9/​0U2mdZINtHVOjD0SxxL1nwRr0B4QfO
 + BiywAPRwJeqcAn2WemOdRrQA=
 +X-Virus-Scanned:​ amavisd-new at nausch.org
 +Received: from mx01.nausch.org ([10.0.0.80])
 + by viruswall.dmz.nausch.org (amavis.dmz.nausch.org [10.0.0.60]) (amavisd-new,​ port 10026)
 + with ESMTP id cQavTPLwa_If for <​Dj4n90-i5-a-G33k@www.brandonchecketts.com>;​
 + Thu,  6 Mar 2014 19:42:00 +0100 (CET)
 +Received: from pml010045.intra.nausch.org (vml000020.dmz.nausch.org [10.0.0.20])
 + (using SSLv3 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits))
 + (No client certificate requested)
 + by mx01.nausch.org (Postfix) with ESMTPSA
 + for <​Dj4n90-i5-a-G33k@www.brandonchecketts.com>;​ Thu,  6 Mar 2014 19:42:00 +0100 (CET)
 +Message-ID: <​5318C181.6020408@nausch.org>​
 +Date: Thu, 06 Mar 2014 19:42:09 +0100
 +From: "​Django [BOfH]"​ <​django@nausch.org>​
 +User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/​20130625 Thunderbird/​17.0.7
 +MIME-Version:​ 1.0
 +To: Dj4n90-i5-a-G33k@www.brandonchecketts.com
 +Subject: DKIM-Test
 +X-Enigmail-Version:​ 1.6
 +Content-Type:​ text/plain; charset=ISO-8859-15
 +Content-Transfer-Encoding:​ 7bit
 +
 +-----BEGIN PGP SIGNED MESSAGE-----
 +Hash: SHA1
 +
 +Na, dann wollen wir mal sehen,ob das Ganze auch so funktioniert,​ wie
 +wir uns das vorstellen!
 +-----BEGIN PGP SIGNATURE-----
 +Version: GnuPG v1.4.13 (GNU/Linux)
 +Comment: Using GnuPG with Thunderbird - http://​www.enigmail.net/​
 +
 +iQIcBAEBAgAGBQJTGMGAAAoJEAdOz2FQpr/​tB7kP+wbBARPsh3Tc9lLFc1AQaiwn
 +4uSwsIfcYu4iMnpjDtDk2+z3EqW/​bOHVoJa0dT8yDQG2ywjgCRrok90RiHkRnOxO
 +On4tnNlE5BgS5l6Dz4VnteBmt71NCOjSiWe2FipDsWxohjT+F+jPgeoPdk8S+OJM
 +Jtzchq8VxiMh7n1evD14/​LTWRlnL3LaX1vVAVBze0Iwb8qBSHC4aU5nGk4hm5UKX
 +z0+GTv98SYkVADVkru7a24A8GRklWnP1D9KpOQhMsFa4ip4YjW7khfsPd5oSrNOC
 +VxI70za89AeN/​0GwC8HlwDjUkYyMoxzCClYZyFPFBvVgvfK+t30qD07j0tBvvJbS
 +fzX9FKIq6Xqkvrq0T07ZWvOU33hY/​fjZu4nfKJ3LTcIqAHc9GxitXclFPKvYRqeH
 +CaQEhKbgkVK2YJvXlpmsgc10FwNcpXHilLlUDsb+fC0ZQgZNBlu0hXs+56CbWM8l
 +81r9w3nPQ7jyo4FRQmFtzKPcOffs3+272bLoPTTjAPZCNogJhIfn60zQm6JEnTYS
 +VjwACvx2JEKI7sZ26CWk4V0fVMZU8lZUCbIqK+fNpOtJ9dA8O2t9/​26M9r9ubgRl
 +vQMB1bRXgMyxItR+L+PA9FW0xdInFlNvcetHRNBXaAYkht+zq5anpUjn9FrFypTQ
 +EowtsmxX9pfKCPqBEvdT
 +=Jb01
 +-----END PGP SIGNATURE-----
 +</​code>​
 +=== DKIM Information:​ ===
 +<​code>​DKIM Signature
 +
 +Message contains this DKIM Signature:
 +DKIM-Signature:​ v=1; a=rsa-sha256;​ c=relaxed/​simple;​ d=nausch.org;​ h=
 + content-transfer-encoding:​content-type:​content-type:​subject
 + :​subject:​mime-version:​user-agent:​from:​from:​date:​date:​message-id
 + :​received:​received;​ s=140224; t=1394131320;​ x=1395945721;​ bh=c0z
 + mKE3eWNgYb30A42NNvzmrD4zdGQYblGKdqriyyJM=;​ b=FM7au9fI7gUwznGnpZd
 + m2iCsFB0ufNhWGcGNadPZC82G6XhJ+9TRrXIhqgBLHWvVMZ4XvcWfoX0QEwjwU8Q
 + SuLItU4J/​+HuGFhrgEkbDO3TzYvRg1LzgTVX4CeYSfQ7rwcoOrcCmDge1li9W+kB
 + kfmk3ZSdwHJIjAU+qvb9fY706FGZpv8vMm6k5jH4fIptrNsncyT131P4bp9Kj4eF
 + kIYCz1jErtbsxicWmUMv4Jvb02+hfYfecmoT318xsq6J8IojIVNVLEeBDewkhI0s
 + ae5tjbgF8HUM8v3STvbd9q78+wVHerSV/​L3KyUJQjMlQr+dWXn2W/​6cu7+cM1QiH
 + xNlNdKlekrl1GdqGgIFxWAzQncl0qLWzvla3QZpoA/​U9YMZB59NY/​jgPIcVzLJPh
 + 1TDWALr1TqHP5Hlw9uuBKxe24JEqBf+R+Srpy1rJFXVjNhE6bskYC+mk4czfjPZL
 + LmJPRUNiVwI50scsxq6p5uYFqab0ls+kv7pBYITbxuHtZdtEFuS/​Kv65gcOAIcNh
 + l1Npp173MIWTT/​1lVCt9TZWgsEU4vxTxem0GBOxM9Lf99oVukM5MueJlAJ0fYtM2
 + ivaFQpBFqNna91f2/​Pu3MkdeKYKWf9wp9/​0U2mdZINtHVOjD0SxxL1nwRr0B4QfO
 + BiywAPRwJeqcAn2WemOdRrQA=
 +
 +
 +Signature Information:​
 +v= Version: ​        1
 +a= Algorithm: ​      ​rsa-sha256
 +c= Method: ​         relaxed/​simple
 +d= Domain: ​         nausch.org
 +s= Selector: ​       140224
 +q= Protocol: ​       ​
 +bh=                 c0z
 + mKE3eWNgYb30A42NNvzmrD4zdGQYblGKdqriyyJM=
 +h= Signed Headers: ​ content-transfer-encoding:​content-type:​content-type:​subject
 + :​subject:​mime-version:​user-agent:​from:​from:​date:​date:​message-id
 + :​received:​received
 +b= Data:            FM7au9fI7gUwznGnpZd
 + m2iCsFB0ufNhWGcGNadPZC82G6XhJ+9TRrXIhqgBLHWvVMZ4XvcWfoX0QEwjwU8Q
 + SuLItU4J/​+HuGFhrgEkbDO3TzYvRg1LzgTVX4CeYSfQ7rwcoOrcCmDge1li9W+kB
 + kfmk3ZSdwHJIjAU+qvb9fY706FGZpv8vMm6k5jH4fIptrNsncyT131P4bp9Kj4eF
 + kIYCz1jErtbsxicWmUMv4Jvb02+hfYfecmoT318xsq6J8IojIVNVLEeBDewkhI0s
 + ae5tjbgF8HUM8v3STvbd9q78+wVHerSV/​L3KyUJQjMlQr+dWXn2W/​6cu7+cM1QiH
 + xNlNdKlekrl1GdqGgIFxWAzQncl0qLWzvla3QZpoA/​U9YMZB59NY/​jgPIcVzLJPh
 + 1TDWALr1TqHP5Hlw9uuBKxe24JEqBf+R+Srpy1rJFXVjNhE6bskYC+mk4czfjPZL
 + LmJPRUNiVwI50scsxq6p5uYFqab0ls+kv7pBYITbxuHtZdtEFuS/​Kv65gcOAIcNh
 + l1Npp173MIWTT/​1lVCt9TZWgsEU4vxTxem0GBOxM9Lf99oVukM5MueJlAJ0fYtM2
 + ivaFQpBFqNna91f2/​Pu3MkdeKYKWf9wp9/​0U2mdZINtHVOjD0SxxL1nwRr0B4QfO
 + BiywAPRwJeqcAn2WemOdRrQA=
 +Public Key DNS Lookup
 +
 +Building DNS Query for 140224._domainkey.nausch.org
 +Retrieved this publickey from DNS: v=DKIM1; p=MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuJ3/​CruOs3fCU0ujOStcNN85TJh+5HvMa9m99C5XuRBlxOr+fp5BeIEtiPO0szKvvPojwrueCq0oOuEzjR/​i2ObpRkzKRUXmAa0qVezUZwQIbKeiuKII0PnpQclDrmQrzSXcQWPT57tkPg17Q9WamFUUaHeN3+pVGtMyjYekRaAoRlV+a1gD111kXMPhiaFTMIncoRBS/​gYN8FjfekH+ezqbLHLB8DLJQBZEGUILvJjAHX0722XyqYtkn1qfv63nPRGw/​qqAW1072Gchq4ZS4ZPQ89SrK4KcHt/​XptSlztXMWtmRFQriHdvbjr1Fx7ZwXdTQ+ik2AUZLMdhMrQe6/​1GujQiMD6po81NpYbrjnfd+QF4sUbus4wPQKVNzsctiuzGlWsFexSHP4dAZtKnImJhVDnzZODQy0nSafedlr5g4VR36vgm0YPWjSyRNnC/​APHyw0DtHIrzTqfKuDeGv80uMPbEdujrw9gLbK3H8ow42iTicmgPgT3J5j70ZOo4o4FMtpZ/​AEQw+VnWpSfw7bkMjufLc29XHbtp22wfgq2Lmarr3+psaHokFaQrImkMbzdSL9CdabkLptanAilLScvq8UaKVC+G1+vHDgaweq3BhXD5+YcJnJlp4msUqqxGYlnx4RSvv8PipMU2DsVFbNJSH5NJuS7GuzplNg+f20ysCAwEAAQ==
 +Validating Signature
 +
 +result = pass
 +Details: ​
 +</​code>​
 +=== SPF Information:​ ===
 +<​code>​Using this information that I obtained from the headers
 +
 +Helo Address = mx01.nausch.org
 +From Address = django@nausch.org
 +From IP      = 217.91.103.190
 +SPF Record Lookup
 +
 +Looking up TXT SPF record for nausch.org
 +Found the following namesevers for nausch.org: ns.udagdns.de ns.udagdns.net
 +Retrieved this SPF Record: v=spf1 ip4:​217.91.103.190/​32 a mx include:​nausch.org ?all (TTL = 3600)
 +using authoritative server {ns.udagdns.de} directly for SPF Check
 +Result: pass (Mechanism '​ip4:​217.91.103.190'​ matched)
 +
 +Result code: pass
 +Local Explanation:​ nausch.org: 217.91.103.190 is authorized to use '​django@nausch.org'​ in '​mfrom'​ identity (mechanism '​ip4:​217.91.103.190'​ matched)
 +spf_header = Received-SPF:​ pass (nausch.org:​ 217.91.103.190 is authorized to use '​django@nausch.org'​ in '​mfrom'​ identity (mechanism '​ip4:​217.91.103.190'​ matched)) receiver=yen;​ identity=mailfrom;​ envelope-from="​django@nausch.org";​ helo=mx01.nausch.org;​ client-ip=217.91.103.190
 +</​code>​
 +
 +=== SPAM-Scoring:​ ===
 +<​code>​SpamAssassin Score: -1.106
 +Message is NOT marked as spam
 +Points breakdown: ​
 +-0.0 T_RP_MATCHES_RCVD ​     Envelope sender domain matches handover relay
 +                            domain
 +-0.0 SPF_PASS ​              SPF: sender matches SPF record
 + 0.9 FRT_TODAY2 ​            BODY: ReplaceTags:​ Today (2)
 +-1.9 BAYES_00 ​              BODY: Bayes spam probability is 0 to 1%
 +                            [score: 0.0000]
 +-0.1 DKIM_VALID_AU ​         Message has a valid DKIM or DK signature from author'​s
 +                            domain
 + 0.1 DKIM_SIGNED ​           Message has a DKIM or DK signature, not necessarily valid
 +-0.1 DKIM_VALID ​            ​Message has at least one valid DKIM or DK signature
 +</​code>​
 +
 +===== Besonderheit - Mailinglisten =====
 +Wie am Anfang dieses Artikels beschrieben,​ basiert [[http://​www.dkim.org/​|DKIM]] auf asymmetrischer Verschlüsselung. Die eMails werden mit zwei Signaturen versehen, die erste über ein paar Header-Zeilen der Nachricht und die zweite über den Mail-Body, also dem Inhalt einer eMail.
 +
 +Der empfangende Mail-Server ist nun in der Lage, an Hand des öffentlichen Schlüssels,​ der im TXT-Record des Domain Name System (DNS) der Domäne abrufbar ist, die beiden übermittelten DKIM-Signaturen zu  zu verifizieren. Ist die Signatur ungültig, hat der empfangende MTA1) die Möglichkeit,​ die Annahme der eMail zu verweigern bzw. die empfangene Nachricht auszusortieren. ​
 +
 +Und genau bei diesem Punkt haben wir nun bei unserem [[centos:​mail_c6:​start#​mailinglistenserver_mit_mailman|Mailinglistenserver]] unter Umständen ein Problem, da sehr oft das Headerfeld "//​Subject//"​ mit dem Namen der Mailingliste ergänzt. So wird aus der **Subject** "//​DKIM-Headertest//"​ auf der [[https://​listi.jpberlin.de/​mailman/​listinfo/​postfixbuch-users|Postfixmailingliste]] ein "​**//​[Postfixbuch-users] DKIM-Headertest//​**"​. Ebenso wird am Ende der verteilten eMail ein **Footer** angefügt, mit Hinweisen zur Mailingliste. Bei unserem Beispiel mit der 
 +[[https://​listi.jpberlin.de/​mailman/​listinfo/​postfixbuch-users|Postfixmailingliste]] wird folgendes eingefügt:
 +<​code>​-- ​
 +_______________________________________________
 +Postfixbuch-users -- http://​www.postfixbuch.de
 +Heinlein Professional Linux Support GmbH
 +
 +Postfixbuch-users@listen.jpberlin.de
 +https://​listi.jpberlin.de/​mailman/​listinfo/​postfixbuch-users ​
 +</​code>​
 +Haben wir uns die Rahmenbedingungen zum **DKIM** verinnerlicht,​ werden wir so schnell zu dem Schluß kommen, dass die Überprüfung der DKIM-Signaturen fehlschlagen muß! Damit also die eMails unserer Kunden bei den Mailservern unserer Empfänger **nicht** mit einem Malus belegt werden, haben wir zwei Möglichkeiten:​
 +  - **eMail nicht verändern**:​ Der Mailheader Subject darf eben so wenig verändert werden, wie der Mailbody nicht durch Anfügen eines Listenspezifischen Footers verändert werden.
 +  - **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.
 +
 +==== eMail nicht verändern ====
 +Eine ungültige DKIM-Signatur bekommen wir immer dann, wenn der Mailheader und/oder der Mailbody, also der Nachrichtentext,​ nach dem Signieren von jemanden manipuliert wurde. Also werden wir nun dafür Sorge tragen, dass der Mailinglistenserver weder den Mail-Header noch den Nachrichtentext manipuliert. ​
 +  * **Mailheader**:​ Über die Variable //​**subject_prefix**//​ in der **Konfigurationskategorie** **[Allgemeine Optionen]** kann man den Mailinglisten Server anweisen, in der Betreffzeile eine Zeichenfolge,​ meist der Mailinglistenkurzmane,​ voranzustellen. Über die URL  **../?​VARHELP=general/​subject_prefix** erreichen wir diese Einstellungsmöglichkeit;​ im Falle der Liste **wetterstation-pliening** wäre das dann entsprechend:​ \\ ''​https://​lists.nausch.org/​mailman/​admin/​wetterstation-pliening/?​VARHELP=general/​subject_prefix''​. \\ Wir löschen also den Inhalt der Variable und bestätigen die Konfigurationsänderung mit einem Klick auf die Schaltfläche **[Änderungen speichern]**. Diese Konfigurationsänderung ist somit sofort aktiv! {{ :​centos:​mail_c6:​bildschirmfoto_vom_2014-03-15_15_43_12.png?​nolink&​600 |Bildschirmhardcopy des Mailman Webfrontends}}
 +  ​
 +  * **Mailbody**:​ Mit Hilfe der beiden Variablen **msg_header** und **msg_footer** in der **Konfigurationskategorie** **[Non-Digest-Optionen]** kann man entweder am Anfang oder am Ende jeder Nachricht zusätzliche Hinweise einfließen lassen. So wir in aller Regel bei der Variable **msg_footer** der listenspezifische Footer mit <​code>​_______________________________________________
 +%(real_name)s mailing list
 +%(real_name)s@%(host_name)s
 +%(web_page_url)slistinfo%(cgiext)s/​%(_internal_name)s
 +</​code>​ Über die URL  **../?​VARHELP=nondigest/​msg_header** bzw. **../?​VARHELP=nondigest/​msg_footer** erreichen wir diese Einstellungsmöglichkeit;​ im Falle der Liste **wetterstation-pliening** wäre das dann entsprechend:​ \\ ''​https://​lists.nausch.org/​mailman/​admin/​wetterstation-pliening/?​VARHELP=nondigest/​msg_header''​ \\ bzw. \\ ''​https://​lists.nausch.org/​mailman/​admin/​wetterstation-pliening/?​VARHELP=nondigest/​msg_footer''​. \\ Wir löschen also den Inhalt der Variable und bestätigen die Konfigurationsänderung mit einem Klick auf die Schaltfläche **[Änderungen speichern]**. Diese Konfigurationsänderung ist somit sofort aktiv! {{ :​centos:​mail_c6:​bildschirmfoto_vom_2014-03-15_15_42_43.png?​nolink&​600 |Bildschirmhardcopy des Mailman Webfrontends}}
 +
 +  * **Default-Einstellungen**:​ Um nun nicht bei jeder neuen Mailingliste die oben genannten Änderungen vornehmen zu müssen, tragen wir in die Konfigurationsdatei unseres Mailinglistenservers nachfolgende Zeilen ein. <​code>​ # vim /​etc/​mailman/​mm_cfg.py</​code>​ <file bash /​etc/​mailman/​mm_cfg.py>​...
 +
 +# 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
 +
 +...
 +</​file>​ Zur Aktivierung unserer Änderungen starten wir den Mailinglisten-Server einmal durch. <​code>​ # service mailman condrestart</​code>​ <​code>​Shutting down mailman: ​                                    ​[ ​ OK  ]
 +Starting mailman: ​                                         [  OK  ]
 +</​code>​
 +
 +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.
 +   # ​ vim /​etc/​mailman/​mm_cfg.py
 +<file bash vim /​etc/​mailman/​mm_cfg.py>​...
 +
 +# Django : 2013-02-21
 +# Vorhandene DKIM-Header entfernen
 +REMOVE_DKIM_HEADERS = Yes
 +
 +...
 +</​file>​
 +
 +Anschließend starten wir unseren Mailinglistenserver einmal durch.
 +   # service mailman condrestart
 +
 +  Shutting down mailman: ​                                    ​[ ​ OK  ]
 +  Starting mailman: ​                                         [  OK  ]
 +
 +===== Besonderheit - DMARC =====
 +Möchten wir DMARC bei der Bewertung der anzunehmenden Nachrichten mit berücksichtigen,​ setzen wir auf das Paket **opendmarc** aus den Repository [[centos:​epel6|EPEL]] ein. Dies hat gegenüber der Signaturprüfung den entscheidenden Vorteil, dass die einzelnen Milter (SPF, DKIM und DMARC) nahtlos ineinander greifen, und so die neu hinzugefügten Haeder bei der Berwertung mit Betrachtet werden können.
 +
 +Die Installation und Konfiguration von OpenDMARC ist im Kapitel [[centos:​mail_c6:​mta_13|DMARC - Domain-based Message Authentication,​ Reporting & Conformance]] beschrieben.
 +==== Installation von OpenDKIM ====
 +Die Installation gestaltet sich sehr einfach, da wir das EPEL-Paket direkt mit **yum** installieren können.
 +   # yum install opendkim
 +
 +Was bei der Installation alles an Dateien und Verzeichnisse neu im System hinzugefügt worden sind, überprüfen wir mit Hilfe von **rpm -qil <​paketname>​**.
 +   # rpm -qil opendkim
 +<​code>​Name ​       : opendkim ​                    ​Relocations:​ (not relocatable)
 +Version ​    : 2.6.7                             ​Vendor:​ Dag Apt Repository, http://​dag.wieers.com/​apt/​
 +Release ​    : 1.el6.rf ​                     Build Date: Wed 20 Mar 2013 03:16:45 PM CET
 +Install Date: Tue 25 Mar 2014 06:04:24 PM CET      Build Host: lisse.hasselt.wieers.com
 +Group       : System Environment/​Daemons ​   Source RPM: opendkim-2.6.7-1.el6.rf.src.rpm
 +Size        : 593359 ​                          ​License:​ BSD and Sendmail
 +Signature ​  : DSA/SHA1, Wed 20 Mar 2013 04:59:26 PM CET, Key ID a20e52146b8d79e6
 +Packager ​   : Dag Wieers <​dag@wieers.com>​
 +URL         : http://​opendkim.org/​
 +Summary ​    : A DomainKeys Identified Mail (DKIM) milter to sign and/or verify mail
 +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.
 +/​etc/​opendkim
 +/​etc/​opendkim.conf
 +/​etc/​opendkim/​KeyTable
 +/​etc/​opendkim/​SigningTable
 +/​etc/​opendkim/​TrustedHosts
 +/​etc/​opendkim/​keys
 +/​etc/​rc.d/​init.d/​opendkim
 +/​etc/​sysconfig/​opendkim
 +/​etc/​tmpfiles.d/​opendkim.conf
 +/​usr/​bin/​opendkim-genkey
 +/​usr/​bin/​opendkim-genzone
 +/​usr/​bin/​opendkim-reportstats
 +/​usr/​bin/​opendkim-spam
 +/​usr/​bin/​opendkim-stats
 +/​usr/​bin/​opendkim-testadsp
 +/​usr/​bin/​opendkim-testkey
 +/​usr/​bin/​opendkim-testmsg
 +/​usr/​sbin/​opendkim
 +/​usr/​share/​doc/​opendkim-2.6.7
 +/​usr/​share/​doc/​opendkim-2.6.7/​FEATURES
 +/​usr/​share/​doc/​opendkim-2.6.7/​INSTALL
 +/​usr/​share/​doc/​opendkim-2.6.7/​KNOWNBUGS
 +/​usr/​share/​doc/​opendkim-2.6.7/​LICENSE
 +/​usr/​share/​doc/​opendkim-2.6.7/​LICENSE.Sendmail
 +/​usr/​share/​doc/​opendkim-2.6.7/​README
 +/​usr/​share/​doc/​opendkim-2.6.7/​README.opendkim-reportstats
 +/​usr/​share/​doc/​opendkim-2.6.7/​RELEASE_NOTES
 +/​usr/​share/​doc/​opendkim-2.6.7/​RELEASE_NOTES.Sendmail
 +/​usr/​share/​doc/​opendkim-2.6.7/​authheaders-check-setup-hook.lua
 +/​usr/​share/​doc/​opendkim-2.6.7/​convert_keylist.sh
 +/​usr/​share/​doc/​opendkim-2.6.7/​final.lua.sample
 +/​usr/​share/​doc/​opendkim-2.6.7/​opendkim.conf.sample
 +/​usr/​share/​doc/​opendkim-2.6.7/​opendkim.conf.simple
 +/​usr/​share/​doc/​opendkim-2.6.7/​opendkim.conf.simple-verify
 +/​usr/​share/​doc/​opendkim-2.6.7/​screen.lua.sample
 +/​usr/​share/​doc/​opendkim-2.6.7/​setup.lua.sample
 +/​usr/​share/​man/​man1/​opendkim-spam.1.gz
 +/​usr/​share/​man/​man5/​opendkim.conf.5.gz
 +/​usr/​share/​man/​man8/​opendkim-genkey.8.gz
 +/​usr/​share/​man/​man8/​opendkim-genzone.8.gz
 +/​usr/​share/​man/​man8/​opendkim-stats.8.gz
 +/​usr/​share/​man/​man8/​opendkim-testadsp.8.gz
 +/​usr/​share/​man/​man8/​opendkim-testkey.8.gz
 +/​usr/​share/​man/​man8/​opendkim-testmsg.8.gz
 +/​usr/​share/​man/​man8/​opendkim.8.gz
 +/​var/​run/​opendkim
 +/​var/​spool/​opendkim
 +</​code>​
 +
 +==== 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:​mail_c6:​mta_9#​generierung_von_dkim-signaturen|Generierung von DKIM-Signaturen]].
 +   # vim /​etc/​opendkim.conf
 +<file bash /​etc/​opendkim.conf>##​ BASIC OPENDKIM CONFIGURATION FILE
 +## See opendkim.conf(5) or /​usr/​share/​doc/​opendkim-2.6.7/​opendkim.conf.sample for more
 +
 +## 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 /​usr/​share/​doc/​opendkim-2.6.7/​INSTALL for detailed instructions.
 +
 +## CONFIGURATION OPTIONS
 +
 +# Specifies the path to the process ID file.
 +PidFile /​var/​run/​opendkim/​opendkim.pid
 +
 +# Selects operating modes. Valid modes are s (signer) and v (verifier). Default is v.
 +Mode v
 +
 +# Log activity to the system log.
 +Syslog yes
 +
 +# Log additional entries indicating successful signing or verification of messages.
 +SyslogSuccess yes
 +
 +# 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 yes
 +
 +# Attempt to become the specified user before starting operations.
 +UserID opendkim:​opendkim
 +
 +# Create a socket through which your MTA can communicate.
 +# Django: 2014-03-25
 +# default: Socket inet:​8891@localhost
 +Socket inet:​10011@127.0.0.1
 +
 +# 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.
 +#​Statistics /​var/​spool/​opendkim/​stats.dat
 +
 +## SIGNING OPTIONS
 +
 +# Selects the canonicalization method(s) to be used when signing messages.
 +Canonicalization relaxed/​simple
 +
 +# 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.
 +#​Selector default
 +
 +# Gives the location of a private key to be used for signing ALL messages.
 +#​KeyFile /​etc/​opendkim/​keys/​dkim2k.private
 +
 +# 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
 +# setting in the configuration file. 
 +#​KeyTable /​etc/​opendkim/​KeyTable
 +
 +# 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.  ​
 +#​SigningTable /​etc/​opendkim/​SigningTable
 +
 +# Identifies a set of "​external"​ hosts that may send mail through the server as one
 +# of the signing domains without credentials as such.
 +#​ExternalIgnoreList refile:/​etc/​opendkim/​TrustedHosts
 +# Django : 2014-03-25
 +ExternalIgnoreList ​    ​refile:/​etc/​opendkim/​TrustedHosts
 +
 +# Identifies a set internal hosts whose mail should be signed rather than verified.
 +#​InternalHosts refile:/​etc/​opendkim/​TrustedHosts
 +</​file>​
 +# vim /​etc/​opendkim.conf
 +Wie schon auch bei der [[centos:​mail_c6:​mta_10?&#​konfiguration|Konfiguration vom SPF-Milter]] definieren wir hier einen Port, an dem der Postfix-Daemon später den DKIM-Milter erreichen wird.
 +
 +In der Konfigurationsdatei **main.cf** unseres Postfix-Mailserver tragen wir nun noch am Ende nachfolgende Zeilen ein.
 +   # vim /​etc/​postfix/​main.cf
 +<file bash /​etc/​postfix/​main.cf>​...
 +
 +# Django : 2014-03-16
 +# SPF-Check und DKIM-Signaturüberprüfung via SMF-SPF- und DKIM-Milter einbinden.
 +smtpd_milters = 
 +# SMF-SPF-Milter: ​
 +   ​inet:​127.0.0.1:​10010,​
 +# DKIM-Milter ​  : ​
 +   ​inet:​127.0.0.1:​10011
 +...
 +</​file>​
 +==== Programmstart ====
 +=== erster manueller Start ===
 +Nun können wir das erste mal den Daemon anstarten.
 +   # service opendkim start
 +
 +  Starting OpenDKIM Milter: ​                                 [  OK  ]
 +
 +In der Prozessliste finden wir nun unseren Prozess opendkim, der mit den Rechten des Users opendkim läuft:
 +   # ps auxw | grep opendkim
 +
 +  opendkim ​ 7535  0.0  0.2 213712 ​ 2068 ?        Ssl  18:00   0:00 /​usr/​sbin/​opendkim -x /​etc/​opendkim.conf -P /​var/​run/​opendkim/​opendkim.pid
 +
 +Mittels lsof können wir nun noch überprüfen,​ welcher Port von Daemon verwendet wird.
 +   # lsof -i :10011
 +
 +  COMMAND ​  PID USER   ​FD ​  ​TYPE ​ DEVICE SIZE/OFF NODE NAME
 +  opendkim 7535 opendkim ​   3u  IPv4 2687914 ​     0t0  TCP localhost:​10011 (LISTEN)
 +
 +=== automatisches Starten des Dienste beim Systemstart ​ ===
 +Damit der OpenDKIM-Milter-Daemon automatisch bei jedem Systemstart startet, denn ohne laufenden **opendkim-daemon** verweigert nun unser **postfix** die Annahme der Nachrichten,​ kann die Einrichtung des Start-Scripte über folgenden Befehle erreicht werden:
 +   # chkconfig opendkim on
 +
 +Die Überprüfungung ob der Dienst (Daemon) smf-spfwirklich bei jedem Systemstart automatisch mit gestartet wird, kann durch folgenden Befehle erreicht werden:
 +   # chkconfig --list | grep opendkim
 +
 +  opendkim ​      ​ 0:​off 1:​off 2:​on 3:​on 4:​on 5:​on 6:​off
 +
 +Wichtig sind jeweils die Schalter **on** bei den Runleveln - **2 3 4 5**. 
 +
 +Anschließend starten wir unseren Postfix-Mailserver einmal durch, damit unsere zuvor eingetragene Konfigurationsänderung aktiv werden kann.
 +   # service postfix condrestart
 +
 +  Shutting down postfix: ​                                    ​[ ​ OK  ]
 +  Starting postfix: ​                                         [  OK  ]
 +
 +==== Tests und Logging ====
 +
 +Wurde die Nachricht unterwegs verändert,​so fällt dies bei der Überprüfung der DKIM-Signatur auf und wird entsprechend im maillog vermerkt.
 +  Mar 26 12:52:15 vml000080 opendkim[10943]:​ D2B6281: s=20120113 d=gmail.com SSL error:​04091068:​rsa routines:​INT_RSA_VERIFY:​bad signature
 +
 +Hingegen wird bei positivem Ergebnis der DKIM-Validierung im maillog vermerkt.
 +  Mar 26 18:02:48 vml000080 opendkim[7535]:​ CECDB81: message has signatures from googlegroups.com,​ gmail.com
 +  Mar 26 18:02:48 vml000080 opendkim[7535]:​ CECDB81: DKIM verification successful
 +
 +Im Mailheader einer angenommenen eMail finden sich dann entsprechend auch Hinweise zur DKIM-Signaturüberprüfung.
 +  Authentication-Results:​ mx01.nausch.org;​ dkim=pass reason="​1024-bit key"
 + header.d=piratenpartei-bayern.de header.i=@piratenpartei-bayern.de
 + header.b=WFipEQPn;​ dkim-adsp=pass
 +
 +Bei negativem Ergebnis wird entsprechend vermerkt.
 +  Authentication-Results:​ mx01.nausch.org;​ dkim=fail
 + reason="​verification failed"​
 + header.d=kitterman.com header.i=@kitterman.com header.b=g01pGD3l;​
 + dkim-adsp=none
 +====== Links ======
 +  * **[[centos:​mail_c6:​start|Zurück zum Kapitel >>​Mailserverinstallation unter CentOS 6<<​]]**
 +  * **[[wiki:​start|Zurück zu >>​Projekte und Themenkapitel<<​]]**
 +  * **[[http://​dokuwiki.nausch.org/​doku.php/​|Zurück zur Startseite]]**
 +