Dies ist eine alte Version des Dokuments!
aktuell in Bearbeitung!
DKIM - Domain Key Identified Mail unter CentOS 7.x
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 RFC 4870 veröffentlicht. Im RFC 4871 wurde dies unter dem Titel DomainKeys Identified Mail (DKIM) Signatures über- und in der aktuellen Version RFC 6376 weitergeführt.
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 RFC 4871 oder in der Dokumentation von 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 MTA1) 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 ADSP2) 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 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 Grundinstallation von AMaViS unter CentOS 7.x beschrieben. In unserer Postofficeumgebung nutzen wir den AMaVis-Daemon in der Version amavisd-new-2.9.x. 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 Postfix-Mailserver wie auch der Viren- und SPAM-Schutz mit Hilfe von AMaViS zur Verfügung steht.
Wertvolle Hinweise zur Konfiguration und Nutzung von DKIM entnimmt man am besten der original AMaViS-Dokumentation Setting up DKIM mail signing and verification.
Konfiguration
Wertvolle Hinweise zur Konfiguration und Nutzung von DKIM entnimmt man am besten der original AMaViS-Dokumentation Setting up DKIM mail signing and verification.
Überprüfung der DKIM-Signaturen
Damit unsere AMaViS-installation die Überprüfung von DKIM-Signaturen im Mailheader vornimmt bedarf es keiner großen Konfiguration. Wie in der 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. Diese Variable findet sich in der Sektion DKIM - Domain Key Identified Mail wieder.
# vim /etc/amavisd.conf
################################################################################ ## DKIM - Domain Key Identified Mail # # DKIM-Signaturen verifizieren $enable_dkim_verification = 1; ...
domain_maps
# yum install perl-DBD-MySQL -y
# mysql -h localhost -u root -p
Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 170683 Server version: 5.1.73 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> CREATE USER 'amavisd'@'vml000067.dmz.nausch.org' IDENTIFIED BY 'hT1ojlODbxckhcn16Uy7Lk5wMO'; Query OK, 0 rows affected (0.01 sec) mysql> CREATE USER 'amavisd'@'10.0.0.67' IDENTIFIED BY 'hT1ojlODbxckhcn16Uy7Lk5wMO'; Query OK, 0 rows affected (0.01 sec) mysql> GRANT ALL PRIVILEGES ON postfix.* TO 'amavisd'@'vml000067.dmz.nausch.org' IDENTIFIED BY 'hT1ojlODbxckhcn16Uy7Lk5wMO' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; Query OK, 0 rows affected (0.01 sec) mysql> GRANT ALL PRIVILEGES ON postfix.* TO 'amavisd'@'10.0.0.67' IDENTIFIED BY 'hT1ojlODbxckhcn16Uy7Lk5wMO' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; Query OK, 0 rows affected (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) mysql> exit Bye
# vim /root/bin/generate_local_domains_map
- root/bin/generate_local_domains_map
#!/usr/bin/perl 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;password=hT1ojlODbxckhcn16Uy7Lk5wMO") || 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;
# chmod +x /root/bin/generate_local_domains_map
# vim /etc/crontab
- /etc/crontab
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- 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,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed # Django : 2014-11-22 # jede Stunde alle Maildomains in configfile für amavisd schreiben 0 * * * * root /root/bin/generate_local_domains_map