Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
tachtler:postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter [2017/10/19 17:51] – [**ODER** /etc/aliases] klaustachtler:postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter [2021/06/12 08:21] (aktuell) – [/usr/share/opendmarc/db/schema.mysql] klaus
Zeile 19: Zeile 19:
 ===== Voraussetzungen ==== ===== Voraussetzungen ====
  
-Die Instalaltion und korrekt Konfiguration von nachfolgneden Diensten/Daemon bzw. **MILTER** ist erforderlich, da **__ohne__ diese [[http://www.trusteddomain.org/opendmarc/|OpenDMARC]] __nicht__ funktionieren kann!**+Die Installation und korrekt Konfiguration von nachfolgenden Diensten/Daemon bzw. **MILTER** ist erforderlich, da **__ohne__ diese [[http://www.trusteddomain.org/opendmarc/|OpenDMARC]] __nicht__ funktionieren kann!**
   * [[http://www.openspf.org/|SPF]],    * [[http://www.openspf.org/|SPF]], 
     * Siehe auch nachfolgenden internen Link: [[tachtler:postfix_centos_7_-_spf_anbinden_spf-milter|Postfix CentOS 7 - SPF anbinden (spf-milter)]]     * Siehe auch nachfolgenden internen Link: [[tachtler:postfix_centos_7_-_spf_anbinden_spf-milter|Postfix CentOS 7 - SPF anbinden (spf-milter)]]
Zeile 48: Zeile 48:
 Resolving Dependencies Resolving Dependencies
 --> Running transaction check --> Running transaction check
----> Package opendmarc.x86_64 0:1.3.1-13.el7 will be installed +---> Package opendmarc.x86_64 0:1.4.1-1.el7 will be installed 
---> Processing Dependency: libopendmarc(x86-64) = 1.3.1-13.el7 for package: opendmarc-1.3.1-13.el7.x86_64 +--> Processing Dependency: libopendmarc(x86-64) = 1.4.1-1.el7 for package: opendmarc-1.4.1-1.el7.x86_64 
---> Processing Dependency: perl(Switch) for package: opendmarc-1.3.1-13.el7.x86_64 +--> Processing Dependency: perl(Switch) for package: opendmarc-1.4.1-1.el7.x86_64 
---> Processing Dependency: perl(DBD::mysql) for package: opendmarc-1.3.1-13.el7.x86_64 +--> Processing Dependency: perl(DBD::mysql) for package: opendmarc-1.4.1-1.el7.x86_64 
---> Processing Dependency: libopendmarc.so.2()(64bit) for package: opendmarc-1.3.1-13.el7.x86_64+--> Processing Dependency: libopendmarc.so.2()(64bit) for package: opendmarc-1.4.1-1.el7.x86_64
 --> Running transaction check --> Running transaction check
----> Package libopendmarc.x86_64 0:1.3.1-13.el7 will be installed+---> Package libopendmarc.x86_64 0:1.4.1-1.el7 will be installed
 ---> Package perl-DBD-MySQL.x86_64 0:4.023-5.el7 will be installed ---> Package perl-DBD-MySQL.x86_64 0:4.023-5.el7 will be installed
 ---> Package perl-Switch.noarch 0:2.16-7.el7 will be installed ---> Package perl-Switch.noarch 0:2.16-7.el7 will be installed
Zeile 68: Zeile 68:
 ================================================================================ ================================================================================
 Installing: Installing:
- opendmarc              x86_64         1.3.1-13.el7          epel         121 k+ opendmarc              x86_64         1.4.1-1.el7           epel         121 k
 Installing for dependencies: Installing for dependencies:
- libopendmarc           x86_64         1.3.1-13.el7          epel          27 k+ libopendmarc           x86_64         1.4.1-1.el7           epel          27 k
  perl-DBD-MySQL         x86_64         4.023-5.el7           base         140 k  perl-DBD-MySQL         x86_64         4.023-5.el7           base         140 k
  perl-Switch            noarch         2.16-7.el7            base          22 k  perl-Switch            noarch         2.16-7.el7            base          22 k
Zeile 82: Zeile 82:
 Is this ok [y/d/N]: y Is this ok [y/d/N]: y
 Downloading packages: Downloading packages:
-(1/4): libopendmarc-1.3.1-13.el7.x86_64.rpm                |  27 kB   00:00      +(1/4): libopendmarc-1.4.1-1.el7.x86_64.rpm                 |  27 kB   00:00      
-(2/4): opendmarc-1.3.1-13.el7.x86_64.rpm                   | 121 kB   00:00     +(2/4): opendmarc-1.4.1-1.el7.x86_64.rpm                    | 121 kB   00:00     
 (3/4): perl-DBD-MySQL-4.023-5.el7.x86_64.rpm               | 140 kB   00:00      (3/4): perl-DBD-MySQL-4.023-5.el7.x86_64.rpm               | 140 kB   00:00     
 (4/4): perl-Switch-2.16-7.el7.noarch.rpm                    22 kB   00:00      (4/4): perl-Switch-2.16-7.el7.noarch.rpm                    22 kB   00:00     
Zeile 93: Zeile 93:
 Running transaction Running transaction
   Installing : perl-Switch-2.16-7.el7.noarch                                1/4    Installing : perl-Switch-2.16-7.el7.noarch                                1/4 
-  Installing : libopendmarc-1.3.1-13.el7.x86_64                             2/4 +  Installing : libopendmarc-1.4.1-1.el7.x86_64                              2/4 
   Installing : perl-DBD-MySQL-4.023-5.el7.x86_64                            3/4    Installing : perl-DBD-MySQL-4.023-5.el7.x86_64                            3/4 
-  Installing : opendmarc-1.3.1-13.el7.x86_64                                4/4 +  Installing : opendmarc-1.4.1-1.el7.x86_64                                 4/4 
   Verifying  : perl-DBD-MySQL-4.023-5.el7.x86_64                            1/4    Verifying  : perl-DBD-MySQL-4.023-5.el7.x86_64                            1/4 
-  Verifying  : opendmarc-1.3.1-13.el7.x86_64                                2/4  +  Verifying  : opendmarc-1.4.1-1.el7.x86_64                                 2/4  
-  Verifying  : libopendmarc-1.3.1-13.el7.x86_64                             3/4 +  Verifying  : libopendmarc-1.4.1-1.el7.x86_64                              3/4 
   Verifying  : perl-Switch-2.16-7.el7.noarch                                4/4    Verifying  : perl-Switch-2.16-7.el7.noarch                                4/4 
  
 Installed: Installed:
-  opendmarc.x86_64 0:1.3.1-13.el7                                               +  opendmarc.x86_64 0:1.4.1-1.el7                                               
  
 Dependency Installed: Dependency Installed:
-  libopendmarc.x86_64 0:1.3.1-13.el7     perl-DBD-MySQL.x86_64 0:4.023-5.el7    +  libopendmarc.x86_64 0:1.4.1-1.el7     perl-DBD-MySQL.x86_64 0:4.023-5.el7    
   perl-Switch.noarch 0:2.16-7.el7          perl-Switch.noarch 0:2.16-7.el7       
  
Zeile 115: Zeile 115:
 # rpm -qil opendmarc # rpm -qil opendmarc
 Name        : opendmarc Name        : opendmarc
-Version     : 1.3.1 +Version     : 1.4.1 
-Release     : 13.el7+Release     : 1.el7
 Architecture: x86_64 Architecture: x86_64
-Install Date: Wed 21 Oct 2015 02:44:46 PM CEST +Install Date: Mon 07 Jun 2021 03:08:31 PM CEST 
-Group       : System Environment/Daemons +Group       : Unspecified 
-Size        : 356054+Size        : 250395
 License     : BSD and Sendmail License     : BSD and Sendmail
-Signature   : RSA/SHA256, Thu 30 Apr 2015 03:55:25 PM CEST, Key ID 6a2faea2352c64e5 +Signature   : RSA/SHA256, Sat 22 May 2021 08:49:51 PM CEST, Key ID 6a2faea2352c64e5 
-Source RPM  : opendmarc-1.3.1-13.el7.src.rpm +Source RPM  : opendmarc-1.4.1-1.el7.src.rpm 
-Build Date  : Thu 30 Apr 2015 02:54:59 AM CEST +Build Date  : Sat 22 May 2021 08:44:46 PM CEST 
-Build Host  : buildvm-17.phx2.fedoraproject.org+Build Host  : buildhw-x86-06.iad2.fedoraproject.org
 Relocations : (not relocatable) Relocations : (not relocatable)
 Packager    : Fedora Project Packager    : Fedora Project
 Vendor      : Fedora Project Vendor      : Fedora Project
 URL         : http://www.trusteddomain.org/opendmarc.html URL         : http://www.trusteddomain.org/opendmarc.html
 +Bug URL     : https://bugz.fedoraproject.org/opendmarc
 Summary     : A Domain-based Message Authentication, Reporting & Conformance (DMARC) milter and library Summary     : A Domain-based Message Authentication, Reporting & Conformance (DMARC) milter and library
 Description : Description :
Zeile 140: Zeile 141:
 The DMARC sender authentication system is still a draft standard, working The DMARC sender authentication system is still a draft standard, working
 towards RFC status. towards RFC status.
 +
 +The database schema required for some functions is provided in
 +/usr/share/opendmarc/db. The rddmarc tools are provided in
 +/usr/share/opendmarc/contrib/rddmarc.
 /etc/opendmarc /etc/opendmarc
 /etc/opendmarc.conf /etc/opendmarc.conf
 /etc/sysconfig/opendmarc /etc/sysconfig/opendmarc
 /etc/tmpfiles.d/opendmarc.conf /etc/tmpfiles.d/opendmarc.conf
 +/run/opendmarc
 /usr/lib/systemd/system/opendmarc.service /usr/lib/systemd/system/opendmarc.service
 /usr/sbin/opendmarc /usr/sbin/opendmarc
Zeile 152: Zeile 158:
 /usr/sbin/opendmarc-params /usr/sbin/opendmarc-params
 /usr/sbin/opendmarc-reports /usr/sbin/opendmarc-reports
-/usr/share/doc/opendmarc-1.3.1 +/usr/share/doc/opendmarc-1.4.1 
-/usr/share/doc/opendmarc-1.3.1/README +/usr/share/doc/opendmarc-1.4.1/README 
-/usr/share/doc/opendmarc-1.3.1/README.schema +/usr/share/doc/opendmarc-1.4.1/RELEASE_NOTES 
-/usr/share/doc/opendmarc-1.3.1/RELEASE_NOTES +/usr/share/licenses/opendmarc-1.4.1 
-/usr/share/doc/opendmarc-1.3.1/draft-dmarc-base-13.txt +/usr/share/licenses/opendmarc-1.4.1/LICENSE 
-/usr/share/doc/opendmarc-1.3.1/schema.mysql +/usr/share/licenses/opendmarc-1.4.1/LICENSE.Sendmail
-/usr/share/licenses/opendmarc-1.3.1 +
-/usr/share/licenses/opendmarc-1.3.1/LICENSE +
-/usr/share/licenses/opendmarc-1.3.1/LICENSE.Sendmail+
 /usr/share/man/man5/opendmarc.conf.5.gz /usr/share/man/man5/opendmarc.conf.5.gz
 /usr/share/man/man8/opendmarc-check.8.gz /usr/share/man/man8/opendmarc-check.8.gz
Zeile 169: Zeile 172:
 /usr/share/man/man8/opendmarc-reports.8.gz /usr/share/man/man8/opendmarc-reports.8.gz
 /usr/share/man/man8/opendmarc.8.gz /usr/share/man/man8/opendmarc.8.gz
-/var/run/opendmarc+/usr/share/opendmarc 
 +/usr/share/opendmarc/contrib 
 +/usr/share/opendmarc/contrib/rddmarc 
 +/usr/share/opendmarc/contrib/rddmarc/README.rddmarc 
 +/usr/share/opendmarc/contrib/rddmarc/dmarcfail.py 
 +/usr/share/opendmarc/contrib/rddmarc/dmarcfail.pyc 
 +/usr/share/opendmarc/contrib/rddmarc/dmarcfail.pyo 
 +/usr/share/opendmarc/contrib/rddmarc/mkdmarc 
 +/usr/share/opendmarc/contrib/rddmarc/mysql_ip6.c 
 +/usr/share/opendmarc/contrib/rddmarc/rddmarc 
 +/usr/share/opendmarc/db 
 +/usr/share/opendmarc/db/README.schema 
 +/usr/share/opendmarc/db/schema.mysql
 /var/spool/opendmarc /var/spool/opendmarc
 </code> </code>
Zeile 237: Zeile 252:
 ===== Konfiguration: DNS ===== ===== Konfiguration: DNS =====
  
-Damit bei ausgehenden e-Mails auch unsere DMARC-Übrprüfung erfolgreich ist, wir nachfolgender Eintrag im **DNS** benötigt, damit der Abfragende bestimmen kann, wie er mit Nachrichten von uns selbst umgehen soll, wenn die DMACR-Überprüfung seinerseits fehl schlägt.+Damit bei ausgehenden e-Mails auch unsere DMARC-Übrprüfung erfolgreich ist, wir nachfolgender Eintrag im **DNS** benötigt, damit der Abfragende bestimmen kann, wie er mit Nachrichten von uns selbst umgehen soll, wenn die DMARC-Überprüfung seinerseits fehl schlägt.
  
 Unter nachfolgendem externen Link, kann ein TXT-Record, welcher DMARC-Informationen enthalten soll, komfortabel erstellt werden: Unter nachfolgendem externen Link, kann ein TXT-Record, welcher DMARC-Informationen enthalten soll, komfortabel erstellt werden:
Zeile 286: Zeile 301:
 </code> </code>
  
-Als absendende Domains für die DMARC-Reports an andere, sollte ein SUB-Domain verwendet werden, welche selbst keine +:!: **WICHTIG** - **Als absendende Domains für die DMARC-Reports an andere, sollte ein __SUB-Domain__ verwendet werden, welche selbst __keine__** 
   * ''rua''   * ''rua''
   * ''ruf''   * ''ruf''
-Einträge besitzt.+**Einträge besitzt, um so __tägliche DMARC Ping-Pong Schleifen (loops) zu vermeiden__.**
  
 <code> <code>
Zeile 985: Zeile 1000:
 Nachfolgender Eintrag sollte in den **Header-Zeilen** einer **eingehenden e-Mail** zu finden sein, um das Ergebnis der [[http://www.trusteddomain.org/opendmarc/|OpenDMARC]] - **''opendmarc-milter''** Überprüfung zu zeigen: Nachfolgender Eintrag sollte in den **Header-Zeilen** einer **eingehenden e-Mail** zu finden sein, um das Ergebnis der [[http://www.trusteddomain.org/opendmarc/|OpenDMARC]] - **''opendmarc-milter''** Überprüfung zu zeigen:
 <code> <code>
-DMARC-Filter: OpenDMARC Filter v1.3.1 mx1.tachtler.net EDCFE1800089+DMARC-Filter: OpenDMARC Filter v1.4.1 mx1.tachtler.net EDCFE1800089
 Authentication-Results: mx1.tachtler.net/EDCFE1800089; dmarc=pass header.from=nausch.org Authentication-Results: mx1.tachtler.net/EDCFE1800089; dmarc=pass header.from=nausch.org
 </code> </code>
Zeile 1010: Zeile 1025:
  
 Dies kann durch ein, ebenfalls im **''rpm''**-Paket mitgeliefertes Skript, welches in nachfolgendem Verzeichnis mit nachfolgendem Namen zu finden ist: Dies kann durch ein, ebenfalls im **''rpm''**-Paket mitgeliefertes Skript, welches in nachfolgendem Verzeichnis mit nachfolgendem Namen zu finden ist:
-  * ''/usr/share/doc/opendmarc-1.3.1/schema.mysql''+  * ''/usr/share/opendmarc/db/schema.mysql''
 durchgeführt werden. durchgeführt werden.
  
 :!: **HINWEIS** - **Falls von einem HOST anstelle von ''localhost'' Daten in die Datenbank geschrieben werden sollen, muss das Skript entsprechend erweitert bzw. angepasst werden!** :!: **HINWEIS** - **Falls von einem HOST anstelle von ''localhost'' Daten in die Datenbank geschrieben werden sollen, muss das Skript entsprechend erweitert bzw. angepasst werden!**
  
-==== /usr/share/doc/opendmarc-1.3.1/schema.mysql ====+==== /usr/share/opendmarc/db/schema.mysql ====
  
 :!: **HINWEIS** - Nachfolgend sollen vom HOST mit der IP-Adresse ''192.168.0.70'' die Daten in die Datenbank geschrieben werden und nicht von ''localhost'' wie dies standardmäßig der Fall ist! :!: **HINWEIS** - Nachfolgend sollen vom HOST mit der IP-Adresse ''192.168.0.70'' die Daten in die Datenbank geschrieben werden und nicht von ''localhost'' wie dies standardmäßig der Fall ist!
Zeile 1024: Zeile 1039:
 -- OpenDMARC database schema -- OpenDMARC database schema
 -- --
--- Copyright (c) 2012, The Trusted Domain Project.+-- Copyright (c) 2012, 2016, 2018, 2021, The Trusted Domain Project.
 -- All rights reserved. -- All rights reserved.
  
Zeile 1038: Zeile 1053:
  PRIMARY KEY(id),  PRIMARY KEY(id),
  UNIQUE KEY(name)  UNIQUE KEY(name)
 +);
 +
 +-- A table for logging encountered ARC selectors
 +CREATE TABLE IF NOT EXISTS selectors (
 + id INT NOT NULL AUTO_INCREMENT,
 + domain INT NOT NULL,
 + name VARCHAR(255) NOT NULL,
 + firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 +
 + PRIMARY KEY(id),
 + KEY(name),
 + UNIQUE KEY(name, domain)
 +);
 +
 +-- A table for logging ARC-Authentication-Results information
 +CREATE TABLE IF NOT EXISTS arcauthresults (
 + id INT NOT NULL AUTO_INCREMENT,
 + message INT UNSIGNED NOT NULL,
 + instance INT UNSIGNED NOT NULL,
 + arc_client_addr VARCHAR(64) NOT NULL DEFAULT '',
 +
 + PRIMARY KEY(id),
 + KEY(message),
 + UNIQUE KEY(message, instance)
 +);
 +
 +-- A table for logging ARC-Seal information
 +CREATE TABLE IF NOT EXISTS arcseals (
 + id INT NOT NULL AUTO_INCREMENT,
 + message INT UNSIGNED NOT NULL,
 + domain INT UNSIGNED NOT NULL,
 + selector INT UNSIGNED NOT NULL,
 + instance INT UNSIGNED NOT NULL,
 + firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 +
 + PRIMARY KEY(id),
 + KEY(message),
 + UNIQUE KEY(message, domain, selector, instance)
 ); );
  
Zeile 1044: Zeile 1097:
  id INT NOT NULL AUTO_INCREMENT,  id INT NOT NULL AUTO_INCREMENT,
  domain INT NOT NULL,  domain INT NOT NULL,
- repuri VARCHAR(255) NOT NULL, + repuri VARCHAR(255) NOT NULL DEFAULT ''
-        adkim TINYINT NOT NULL, + adkim TINYINT NOT NULL DEFAULT '0'
-        aspf TINYINT NOT NULL, + aspf TINYINT NOT NULL DEFAULT '0'
-        policy TINYINT NOT NULL, + policy TINYINT NOT NULL DEFAULT '0'
-        spolicy TINYINT NOT NULL, + spolicy TINYINT NOT NULL DEFAULT '0'
-        pct TINYINT NOT NULL, + pct TINYINT NOT NULL DEFAULT '0'
-        locked TINYINT NOT NULL,+ locked TINYINT NOT NULL DEFAULT '0',
  firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,  firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  lastsent TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',  lastsent TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
Zeile 1069: Zeile 1122:
 ); );
  
--- A table for IP addresses+-- A table for connecting client IP addresses
 CREATE TABLE IF NOT EXISTS ipaddr ( CREATE TABLE IF NOT EXISTS ipaddr (
  id INT NOT NULL AUTO_INCREMENT,  id INT NOT NULL AUTO_INCREMENT,
Zeile 1091: Zeile 1144:
  from_domain INT UNSIGNED NOT NULL,  from_domain INT UNSIGNED NOT NULL,
  policy_domain INT UNSIGNED NOT NULL,  policy_domain INT UNSIGNED NOT NULL,
- spf TINYINT UNSIGNED NOT NULL,+ spf TINYINT NOT NULL,
  align_dkim TINYINT UNSIGNED NOT NULL,  align_dkim TINYINT UNSIGNED NOT NULL,
  align_spf TINYINT UNSIGNED NOT NULL,  align_spf TINYINT UNSIGNED NOT NULL,
  sigcount TINYINT UNSIGNED NOT NULL,  sigcount TINYINT UNSIGNED NOT NULL,
 + arc TINYINT UNSIGNED NOT NULL,
 + arc_policy TINYINT UNSIGNED NOT NULL,
  
  PRIMARY KEY(id),  PRIMARY KEY(id),
Zeile 1104: Zeile 1159:
 CREATE TABLE IF NOT EXISTS signatures ( CREATE TABLE IF NOT EXISTS signatures (
  id INT NOT NULL AUTO_INCREMENT,  id INT NOT NULL AUTO_INCREMENT,
- message INT NOT NULL, + message INT UNSIGNED NOT NULL, 
- domain INT NOT NULL, + domain INT UNSIGNED NOT NULL, 
- pass TINYINT NOT NULL, + selector INT UNSIGNED NOT NULL, 
- error TINYINT NOT NULL,+ pass TINYINT UNSIGNED NOT NULL, 
 + error TINYINT UNSIGNED NOT NULL,
  
  PRIMARY KEY(id),  PRIMARY KEY(id),
Zeile 1115: Zeile 1171:
 -- CREATE USER 'opendmarc'@'localhost' IDENTIFIED BY 'changeme'; -- CREATE USER 'opendmarc'@'localhost' IDENTIFIED BY 'changeme';
 -- GRANT ALL ON opendmarc.* to 'opendmarc'@'localhost'; -- GRANT ALL ON opendmarc.* to 'opendmarc'@'localhost';
- 
- 
--- # Tachtler - Create new users. 
-CREATE USER 'opendmarc_user'@'192.168.0.70' IDENTIFIED BY 'password'; 
-CREATE USER 'opendmarc_user'@'server70.idmz.tachtler.net' IDENTIFIED BY 'password'; 
  
 -- # Tachtler - Grant ALL privileges to new users. -- # Tachtler - Grant ALL privileges to new users.
Zeile 1130: Zeile 1181:
  
 **__Nachfolgende Änderungen wurden am Skript durchgeführt:__** **__Nachfolgende Änderungen wurden am Skript durchgeführt:__**
 +
 +  * <code mysql>lastsent TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',</code>
 +
 +Austausch des ''TIMESTAMP'' von '''1970-01-01 00:00:00''' zu '''0000-00-00 00:00:00''', da es sonst zu einer Fehlermeldung kommt, das '''1970-01-01 00:00:00''' **__kein__** gültiger ''DEFAULT''-Wert ist.
  
   * <code mysql>-- # Tachtler - Create new users.   * <code mysql>-- # Tachtler - Create new users.
Zeile 1150: Zeile 1205:
 Die Ausführung des Skriptes und die damit verbunden Anlage der Datenbank, der Tabellen und Felder und der Nutzer, kann durch Ausführung des nachfolgenden Befehls durchgeführt werden, **zudem jedoch das Kennwort zum Datenbankbenutzer ''root'' erforderlich ist!**: Die Ausführung des Skriptes und die damit verbunden Anlage der Datenbank, der Tabellen und Felder und der Nutzer, kann durch Ausführung des nachfolgenden Befehls durchgeführt werden, **zudem jedoch das Kennwort zum Datenbankbenutzer ''root'' erforderlich ist!**:
 <code> <code>
-# /usr/bin/mysql -u root -p < /usr/share/doc/opendmarc-1.3.1/schema.mysql+# /usr/bin/mysql -u root -p < /usr/share/opendmarc/db/schema.mysql
 Enter password: Enter password:
 </code> </code>
Zeile 1205: Zeile 1260:
 FILE_OPENDMARC_PERMISSION='660' FILE_OPENDMARC_PERMISSION='660'
 REPORT_INTERVAL='86400' REPORT_INTERVAL='86400'
-REPORT_SENDER='dmarc-sender@dmarcreports.tachtler.net'+REPORT_SENDER='postmaster@dmarcreports.tachtler.net'
 REPORT_ORG='tachtler.net' REPORT_ORG='tachtler.net'
 REPORT_EXPIRE='90' REPORT_EXPIRE='90'
Zeile 1647: Zeile 1702:
  
 Dank der Vorarbeiten und den Skripten von [[http://www.taugh.com/rddmarc/|John Levine]], ist die Einbindung einfacher möglich geworden, da hier sonst keine Unterstützung von Seiten [[http://www.trusteddomain.org/opendmarc/|OpenDMARC]] geboten wird. Dank der Vorarbeiten und den Skripten von [[http://www.taugh.com/rddmarc/|John Levine]], ist die Einbindung einfacher möglich geworden, da hier sonst keine Unterstützung von Seiten [[http://www.trusteddomain.org/opendmarc/|OpenDMARC]] geboten wird.
 +  * [[http://www.taugh.com/rddmarc/|DMARC-Skripte]]
  
 ==== Installation: Skriptabhängigkeiten ==== ==== Installation: Skriptabhängigkeiten ====
Zeile 1726: Zeile 1782:
 Complete! Complete!
 </code> </code>
- 
-Nachfolgende **''rpm''**-Pakete müssen als Abhängigkeiten zum Skript **''readdmarcfailure.pl''** zusätzlich installiert werden: 
-  * **''perl-DBI''** - ist im ''base''-Repository von [[http://www.centos.org|CentOS]] enthalten 
-  * **''perl-Email-Address''** - ist im ''base''-Repository von [[http://www.centos.org|CentOS]] enthalten 
-  * **''perl-Email-Date-Format''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-Email-MIME''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-Email-MIME-ContentType''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-Email-MIME-Encodings''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-Email-MessageID''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-Email-Simple''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten  
-  * **''perl-MIME-tools''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-MIME-Types''** - ist im ''epel''-Repository des Drittanbieters [[https://fedoraproject.org/wiki/EPEL|EPEL]] enthalten 
-  * **''perl-XML-Parser''** - ist im ''base''-Repository von [[http://www.centos.org|CentOS]] enthalten 
- 
-Die Installation der **Skriptabhängigkeiten**, kann durch ausführen des nachfolgenden Befehls durchgeführt werden: 
-<code> 
-# yum install perl-DBI perl-Email-Address perl-Email-Date-Format perl-Email-MIME perl-Email-MIME-ContentType  
-perl-Email-MIME-Encodings perl-Email-MessageID perl-Email-Simple perl-MIME-tools perl-MIME-Types perl-XML- 
-Parser 
-Loaded plugins: changelog, priorities 
-149 packages excluded due to repository priority protections 
-Package perl-DBI-1.627-4.el7.x86_64 already installed and latest version 
-Package perl-MIME-tools-5.505-1.el7.noarch already installed and latest version 
-Package perl-XML-Parser-2.41-10.el7.x86_64 already installed and latest version 
-Resolving Dependencies 
---> Running transaction check 
----> Package perl-Email-Address.noarch 0:1.898-3.el7 will be installed 
----> Package perl-Email-Date-Format.noarch 0:1.002-15.el7 will be installed 
----> Package perl-Email-MIME.noarch 0:1.926-1.el7 will be installed 
----> Package perl-Email-MIME-ContentType.noarch 0:1.017-1.el7 will be installed 
----> Package perl-Email-MIME-Encodings.noarch 0:1.315-1.el7 will be installed 
----> Package perl-Email-MessageID.noarch 0:1.404-1.el7 will be installed 
----> Package perl-Email-Simple.noarch 0:2.203-1.el7 will be installed 
----> Package perl-MIME-Types.noarch 0:1.38-2.el7 will be installed 
---> Finished Dependency Resolution 
- 
-Changes in packages about to be updated: 
- 
- 
-Dependencies Resolved 
- 
-=============================================================================== 
- Package                         Arch       Version             Repository 
-                                                                          Size 
-=============================================================================== 
-Installing: 
- perl-Email-Address              noarch     1.898-3.el7         base      39 k 
- perl-Email-Date-Format          noarch     1.002-15.el7        epel      17 k 
- perl-Email-MIME                 noarch     1.926-1.el7         epel      45 k 
- perl-Email-MIME-ContentType     noarch     1.017-1.el7         epel      19 k 
- perl-Email-MIME-Encodings       noarch     1.315-1.el7         epel      18 k 
- perl-Email-MessageID            noarch     1.404-1.el7         epel      18 k 
- perl-Email-Simple               noarch     2.203-1.el7         epel      33 k 
- perl-MIME-Types                 noarch     1.38-2.el7          epel      38 k 
- 
-Transaction Summary 
-=============================================================================== 
-Install  8 Packages 
- 
-Total download size: 227 k 
-Installed size: 426 k 
-Is this ok [y/d/N]: y 
-Downloading packages: 
-(1/8): perl-Email-Address-1.898-3.el7.noarch.rpm          |  39 kB   00:00      
-(2/8): perl-Email-Date-Format-1.002-15.el7.noarch.rpm      17 kB   00:00      
-(3/8): perl-Email-MIME-1.926-1.el7.noarch.rpm              45 kB   00:00      
-(4/8): perl-Email-MIME-Encodings-1.315-1.el7.noarch.rpm    18 kB   00:00      
-(5/8): perl-Email-MIME-ContentType-1.017-1.el7.noarch.rpm |  19 kB   00:00      
-(6/8): perl-Email-MessageID-1.404-1.el7.noarch.rpm        |  18 kB   00:00      
-(7/8): perl-Email-Simple-2.203-1.el7.noarch.rpm            33 kB   00:00      
-(8/8): perl-MIME-Types-1.38-2.el7.noarch.rpm              |  38 kB   00:00      
-------------------------------------------------------------------------------- 
-Total                                             536 kB/s | 227 kB  00:00      
-Running transaction check 
-Running transaction test 
-Transaction test succeeded 
-Running transaction 
-  Installing : perl-Email-Address-1.898-3.el7.noarch                       1/ 
-  Installing : perl-Email-MessageID-1.404-1.el7.noarch                     2/ 
-  Installing : perl-Email-Date-Format-1.002-15.el7.noarch                  3/8  
-  Installing : perl-Email-Simple-2.203-1.el7.noarch                        4/8  
-  Installing : perl-Email-MIME-Encodings-1.315-1.el7.noarch                5/8  
-  Installing : perl-Email-MIME-ContentType-1.017-1.el7.noarch              6/8  
-  Installing : perl-MIME-Types-1.38-2.el7.noarch                           7/ 
-  Installing : perl-Email-MIME-1.926-1.el7.noarch                          8/8  
-  Verifying  : perl-MIME-Types-1.38-2.el7.noarch                           1/ 
-  Verifying  : perl-Email-MIME-1.926-1.el7.noarch                          2/8  
-  Verifying  : perl-Email-MIME-ContentType-1.017-1.el7.noarch              3/8  
-  Verifying  : perl-Email-MessageID-1.404-1.el7.noarch                     4/ 
-  Verifying  : perl-Email-MIME-Encodings-1.315-1.el7.noarch                5/8  
-  Verifying  : perl-Email-Simple-2.203-1.el7.noarch                        6/8  
-  Verifying  : perl-Email-Address-1.898-3.el7.noarch                       7/ 
-  Verifying  : perl-Email-Date-Format-1.002-15.el7.noarch                  8/8  
- 
-Installed: 
-  perl-Email-Address.noarch 0:1.898-3.el7                                       
-  perl-Email-Date-Format.noarch 0:1.002-15.el7                                  
-  perl-Email-MIME.noarch 0:1.926-1.el7                                          
-  perl-Email-MIME-ContentType.noarch 0:1.017-1.el7                              
-  perl-Email-MIME-Encodings.noarch 0:1.315-1.el7                                
-  perl-Email-MessageID.noarch 0:1.404-1.el7                                     
-  perl-Email-Simple.noarch 0:2.203-1.el7                                        
-  perl-MIME-Types.noarch 0:1.38-2.el7                                           
- 
-Complete! 
-</code> 
- 
  
 Nachfolgende **''rpm''**-Pakete müssen als Abhängigkeiten zum Skript **''readdmarcfailure.py''** zusätzlich installiert werden: Nachfolgende **''rpm''**-Pakete müssen als Abhängigkeiten zum Skript **''readdmarcfailure.py''** zusätzlich installiert werden:
Zeile 2056: Zeile 2005:
 <code perl> <code perl>
 #!/usr/bin/perl #!/usr/bin/perl
-# -*- perl -*- 
-# $Header: /home/johnl/hack/dmarc/RCS/rddmarc,v 1.6 2016/05/01 21:43:40 johnl Exp $ 
-# 
-# Script to read DMARC aggregate reports and put summary info 
-# into a database 
  
-Options: +Script zum automatischen Verarbeiten der DMARC-Reportmails in die mySQL-Datenbank dmarc 
--d print debug info +basierend auf den DMARC Reporting scripts (http://www.taugh.com/rddmarc) von John Levine (http://www.johnlevine.com/) 
--x read XML files rather than mail messages +Über STDIN wird dem Script readdmarc die eMail übergebenalso z.B.: $ readdmarc < mailtext 
--r replace existing report rather than failing +2014-05-15 : V.01 by Django (django@mailserver.guru- mit freundlicher Unterstützung von Klaus (klaus@tachtler.net)
- +
-# Copyright 2012, 2016, Taughannock NetworksAll rights reserved. +
- +
-# Redistribution and use in source and binary forms, with or without +
-# modification, are permitted provided that the following conditions +
-# are met: +
- +
-# Redistributions of source code must retain the above copyright +
-# notice, this list of conditions and the following disclaimer. +
- +
-Redistributions in binary form must reproduce the above copyright +
-# noticethis list of conditions and the following disclaimer in the +
-# documentation and/or other materials provided with the distribution. +
- +
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +
-# A PARTICULAR PURPOSE ARE DISCLAIMEDIN NO EVENT SHALL THE COPYRIGHT +
-# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +
-# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +
-# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTIONHOWEVER CAUSED +
-# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISEARISING IN ANY +
-# WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +
-# POSSIBILITY OF SUCH DAMAGE.+
  
 use strict; use strict;
-use Getopt::Std; 
 use MIME::Parser; use MIME::Parser;
 use MIME::Words qw(:all); use MIME::Words qw(:all);
 use XML::Simple; use XML::Simple;
 use DBI; use DBI;
-use Socket qw{:addrinfo inet_ntop inet_pton AF_INET6 AF_INET};+use IO::Socket::INET6; 
 +use Socket6; 
 +use Socket qw(:DEFAULT :crlf); 
 +use NetAddr::IP;
 use PerlIO::gzip; use PerlIO::gzip;
 +#use IO::Compress;
  
-use vars qw{$opt_d $opt_r $opt_x}+my $buffer = ''
- +my $input = ''; 
-getopts('drx'); +Debugmeldungen ausgeben? Wenn ja, dann $opt_d = 1 
- +my $opt_d = 0;
-Tachtler+
 my $db_host = "mariadb.idmz.tachtler.net"; my $db_host = "mariadb.idmz.tachtler.net";
 my $db_port = "3306"; my $db_port = "3306";
Zeile 2114: Zeile 2034:
 my $dbh = DBI -> connect ("DBI:mysql:database=$db_name;host=$db_host;port=$db_port","$db_user",'geheim') or die "Cannot connect to database\n"; my $dbh = DBI -> connect ("DBI:mysql:database=$db_name;host=$db_host;port=$db_port","$db_user",'geheim') or die "Cannot connect to database\n";
  
-foreach my $i (@ARGV) { +while (sysread(STDIN, $input, 1024) > 0) { 
-    my ($zip, $ent, $isgzip)+    $buffer .= $input
- +} 
-    print "parsing $i\n"; +        print "parsing \n"; 
- +        my ($zip, $ent, $isgzip);
-    if($opt_x) { +
-        open(XML, $ior die "Cannot open XML file $i"; +
-    } else {+
         my $parser = new MIME::Parser;         my $parser = new MIME::Parser;
         $parser->output_dir("/tmp");         $parser->output_dir("/tmp");
- +        $ent = $parser->parse_data($buffer);
-        $ent = $parser->parse_open($i); +
-    +
         my $body = $ent->bodyhandle;         my $body = $ent->bodyhandle;
         $zip = $body;         $zip = $body;
Zeile 2170: Zeile 2085:
                 or die "cannot unzip $zip->path";                 or die "cannot unzip $zip->path";
         }         }
-    } 
     my $xml = "";     my $xml = "";
     $xml .= $_ while <XML>;     $xml .= $_ while <XML>;
-    close XML; 
     $ent->purge if $ent;     $ent->purge if $ent;
     $zip->purge if $zip;     $zip->purge if $zip;
-    +   
     my $xs = XML::Simple->new();     my $xs = XML::Simple->new();
-    +   
     print "XML is ======\n$xml\n=====\n" if $opt_d;     print "XML is ======\n$xml\n=====\n" if $opt_d;
  
     my $ref = $xs->XMLin($xml, SuppressEmpty => '');     my $ref = $xs->XMLin($xml, SuppressEmpty => '');
     my %xml = %{$ref};     my %xml = %{$ref};
-    #print join "\n",keys %xml; 
-    #print "\n"; 
     my $from = $xml{'report_metadata'}->{'date_range'}->{'begin'};     my $from = $xml{'report_metadata'}->{'date_range'}->{'begin'};
     my $to = $xml{'report_metadata'}->{'date_range'}->{'end'};     my $to = $xml{'report_metadata'}->{'date_range'}->{'end'};
Zeile 2201: Zeile 2112:
     my ($xorg, $xid, $serial) = $dbh->selectrow_array(qq{SELECT org,reportid,serial FROM report WHERE reportid=?}, undef, $id);     my ($xorg, $xid, $serial) = $dbh->selectrow_array(qq{SELECT org,reportid,serial FROM report WHERE reportid=?}, undef, $id);
     if($xorg) {     if($xorg) {
-        if($opt_r) { 
-            print "Replacing $xorg $xid\n"; 
-            $dbh->do(qq{DELETE from rptrecord WHERE serial=?}, undef, $serial) 
-                    or die "cannot delete old records" . $dbh->errstr; 
-        } else { 
             print "Already have $xorg $xid, skipped\n";             print "Already have $xorg $xid, skipped\n";
-            next; 
-        } 
     }     }
  
Zeile 2218: Zeile 2122:
     $dbh->do($sql, undef, $from, $to, $domain, $org, $id, $email, $extra, $policy_adkim, $policy_aspf, $policy_p, $policy_sp, $policy_pct)     $dbh->do($sql, undef, $from, $to, $domain, $org, $id, $email, $extra, $policy_adkim, $policy_aspf, $policy_p, $policy_sp, $policy_pct)
             or die "cannot make report" . $dbh->errstr;             or die "cannot make report" . $dbh->errstr;
 +
     $serial = $dbh->{'mysql_insertid'} ||  $dbh->{'insertid'} unless $xorg;     $serial = $dbh->{'mysql_insertid'} ||  $dbh->{'insertid'} unless $xorg;
     print " serial $serial ";     print " serial $serial ";
     my $record = $xml{'record'};     my $record = $xml{'record'};
 +
 +
     sub dorow($$) {     sub dorow($$) {
         my ($serial,$recp) = @_;         my ($serial,$recp) = @_;
Zeile 2276: Zeile 2183:
             next;             next;
         }         }
 +        print "$iptype = $ipval\n" if $opt_d;
 +
         print "$iptype = $ipval, spf $spf_align, dkim $dkim_align\n" if $opt_d;         print "$iptype = $ipval, spf $spf_align, dkim $dkim_align\n" if $opt_d;
         $dbh->do(qq{INSERT INTO rptrecord(serial,$iptype,rcount,disposition,spf_align,dkim_align,reason,dkimdomain,dkimresult,spfdomain,spfresult,identifier_hfrom)         $dbh->do(qq{INSERT INTO rptrecord(serial,$iptype,rcount,disposition,spf_align,dkim_align,reason,dkimdomain,dkimresult,spfdomain,spfresult,identifier_hfrom)
Zeile 2293: Zeile 2202:
         print "mystery type " . ref($record) . "\n";         print "mystery type " . ref($record) . "\n";
     }     }
-} 
 </code> </code>
  
Zeile 2316: Zeile 2224:
 <code> <code>
 # chown root:root /usr/local/bin/readdmarc.pl # chown root:root /usr/local/bin/readdmarc.pl
-</code> 
- 
-==== /usr/local/bin/readdmarcfailure.pl ==== 
- 
-Das Skript **''readdmarcfailure.pl''** liest eine eingehende e-Mail, welche einen Fehlerreport in einer **ZIP**-Datei enthält direkt vom [[http://www.postfix.org|Postfix]] dadurch ein, das [[http://www.postfix.org|Postfix]] die e-Mail direkt an das Skript übergibt und dieses dann alle Informationen extrahiert und in die Datenbank schreibt. 
- 
-:!: **HINWIES** - **Anpassungen müssen beim Datenbankzugriff durchgeführt werden!** 
- 
-<code perl> 
-#!/usr/bin/perl 
- 
-# Script zum automatischen Verarbeiten der DMARC-Forensic-Mails in die mySQL-Datenbank dmarc 
-# basierend auf den DMARC Reporting scripts (http://www.taugh.com/rddmarc) von John Levine (http://www.johnlevine.com/) 
-# Über STDIN wird dem Script readdmarcfailure die eMail übergeben, also z.B.: $ readdmarcfailure < mailtext 
-# 2014-05-17 : V.01 by Django (django@mailserver.guru) 
- 
-use strict; 
-use MIME::Parser; 
-use MIME::Words qw(:all); 
-use DBI; 
-use Email::Address; 
-use Email::MIME; 
- 
-my $buffer = ''; 
-my $input = ''; 
-my $db_host = "mariadb.idmz.tachtler.net"; 
-my $db_port = "3306"; 
-my $db_name = "dmarc"; 
-my $db_user = "dmarc_user"; 
-my $db_pass = ""; 
-my $dbh = DBI -> connect ("DBI:mysql:database=$db_name;host=$db_host;port=$db_port","$db_user",'geheim') or die "Cannot connect to database\n"; 
- 
-while (sysread(STDIN, $input, 1024) > 0) { 
-    $buffer .= $input; 
-} 
- 
-my ($zip, $ent, $isgzip); 
-my $parser = new MIME::Parser; 
-   $parser->output_dir("/tmp"); 
-   $ent = $parser->parse_data($buffer); 
-my $body = $ent->bodyhandle; 
-   $zip = $body; 
-my $mtype = $ent->mime_type; 
-my $subject = decode_mimewords($ent->get('subject')); 
-my $date = decode_mimewords($ent->get('date')); 
-my $from = decode_mimewords($ent->get('from')); 
- 
-# Nachricht eine valider Report? 
-   $buffer =~ /(Content-Type:\smessage\/feedback-report)/; 
-my $valid_report = $1; 
-if ($valid_report ne "Content-Type: message/feedback-report") { 
-        print "no valid report!\n"; 
-        exit; 
-        } 
-        else { print "Parsing eMail (Header & Body)\n\n"; 
-} 
- 
-# Daten aus Content-Type"message/feedback-report" extrahieren: 
-my $content_block = Email::MIME->new($buffer); 
-my ($fr) = grep { $_->content_type =~ m{^message/feedback-report} } $content_block->subparts; 
-my $mfr = $fr->body; 
-   $from =~ /<(.+?)@(.+?)>/; 
-my $domrep = $2; 
-   $mfr =~ /(Feedback-Type:\ )(.*)/; 
-my $type = $2; 
-   $mfr =~ /(Version:\s)(.*)/; 
-my $version = $2; 
-   $mfr =~ /(User-Agent:\s)(.*)/; 
-my $useragent = $2; 
-   $mfr =~ /(Auth-Failure:\s)(.*)/; 
-my $authfailure = $2; 
-   $mfr =~ /(Authentication-Results:\s)(.*)/; 
-my $result = $2; 
-   $mfr =~ /(Original-Envelope-Id:\s)(.*)/; 
-my $envid = $2; 
-   $mfr =~ /(Original-Mail-From:\s)(.*)@(.*)/; 
-my $origbox = $2; 
-my $origdom = $3; 
-   $mfr =~ /(Source-IP:\s)(.*)/; 
-my $source = $2; 
-   $mfr =~ /(Reported-Domain:\s)(.*)/; 
-my $domain = $2; 
- 
-# Daten aus Content-Type"test/rfc822-headers" extrahieren: 
-my ($rfc822_headers) = grep { $_->content_type =~ m{^text/rfc822-headers} } $content_block->subparts; 
-my $org_headers = $rfc822_headers->body; 
-   $org_headers =~ /(From:\s)(.*<)(.+?)@(.+?)(>)/; 
-my $frombox = $3; 
-my $fromdom = $4; 
- 
-# Daten in die mySQL-Datenbank schreiben 
- 
-my $sql = "INSERT INTO `dmarc`.`failure` (`serial`, `reporter`, `domain`, `type`, `authfailure`, `result`, `messageid`, `bouncedomain`, `bouncebox`, `fromdomain`, `frombox`, `arrival`, `sourceip`, `headers`) VALUES (NULL, '$domrep', '$domain', '$type', '$authfailure', '$result', '$envid', '$origdom', '$origbox', '$fromdom', '$frombox', NOW(), '$source', '$org_headers')"; 
- 
-$dbh->do($sql) or die "cannot store report to database!" . $dbh->errstr; 
-</code> 
- 
-**__Nachfolgende Änderungen wurden am Skript durchgeführt:__** 
- 
-  * <code perl>my $db_host = "mariadb.idmz.tachtler.net"; 
-my $db_port = "3306"; 
-my $db_name = "dmarc"; 
-my $db_user = "dmarc_user"; 
-my $db_pass = ""; 
-my $dbh = DBI -> connect ("DBI:mysql:database=$db_name;host=$db_host;port=$db_port","$db_user",'geheim') or die "Cannot connect to database\n";</code> 
- 
-Anpassen des Datenbankzugriffs in Bezug auf den Datenbank-Server, Datenbank-Port, den Benutzernamen und das Passwort. 
- 
-  * <code perl>my $sql = "INSERT INTO `dmarc`.`failure` (`serial`, `reporter`, `domain`, `type`, `authfailure`, `result`, `messageid`, `bouncedomain`, `bouncebox`, `fromdomain`, `frombox`, `arrival`, `sourceip`, `headers`) VALUES (NULL, '$domrep', '$domain', '$type', '$authfailure', '$result', '$envid', '$origdom', '$origbox', '$fromdom', '$frombox', NOW(), '$source', '$org_headers')";</code> 
- 
-Anpassen des **Namens** der Datenbank auf **''dmarc''** (nach "INSERT INTO `dmarc`...). 
- 
-:!: **HINWEIS** - **Die Variable ''$db_pass'' wird hier nicht genutzt, sondern das Passwort wird direkt in den Verbindungsaufbau eingetragen, da bei komplexen __Passwörtern mit Sonderzeichenkombinationen__ sonst Probleme auftreten könnten!** 
- 
-Nachfolgender Befehl setzte die **Datei**- und **Besitzrechte** für das Skript wie folgt: 
-<code> 
-# chmod 755 /usr/local/bin/readdmarcfailure.pl 
-</code> 
-und 
-<code> 
-# chown root:root /usr/local/bin/readdmarcfailure.pl 
 </code> </code>
  
Zeile 2446: Zeile 2233:
  
 <code python> <code python>
-#!/usr/local/bin/python+#!/usr/bin/python
 # $Header: /home/johnl/hack/dmarc/RCS/dmarcfail.py,v 1.2 2015/05/02 20:15:02 johnl Exp $ # $Header: /home/johnl/hack/dmarc/RCS/dmarcfail.py,v 1.2 2015/05/02 20:15:02 johnl Exp $
 # parse DMARC failure reports, add it to the mysql database # parse DMARC failure reports, add it to the mysql database
Zeile 2488: Zeile 2275:
 # Tachtler # Tachtler
 # default: db = MySQLdb.connect(user='dmarc',passwd='x',db='dmarc', use_unicode=True) # default: db = MySQLdb.connect(user='dmarc',passwd='x',db='dmarc', use_unicode=True)
-db = MySQLdb.connect(host='mariadb.idmz.tachtler.net',port=3306,user='dmarc_user',passwd='geheim',db='dmarc', use_unicode=True)+db = MySQLdb.connect(host='mariadb.idmz.tachtler.net',port=3306,user='dmarc_user',passwd='geheim',db='dmarc',
 MySQLdb.paramstyle='format' MySQLdb.paramstyle='format'
  
Zeile 2538: Zeile 2325:
     print "Inserted failure report %s" % c.lastrowid     print "Inserted failure report %s" % c.lastrowid
     c.close()     c.close()
 +    db.commit()
          
 if __name__ == "__main__": if __name__ == "__main__":
Zeile 2577: Zeile 2365:
 readdmarc      unix  -                               pipe readdmarc      unix  -                               pipe
   flags=DRhu user=nobody argv=/usr/local/bin/readdmarc.pl   flags=DRhu user=nobody argv=/usr/local/bin/readdmarc.pl
-# Tachtler 
-readdmarcfailure      unix  -                               pipe 
-  flags=DRhu user=nobody argv=/usr/local/bin/readdmarcfailure.pl 
-</code> 
-**__ODER__** 
-<code> 
 # Tachtler # Tachtler
 readdmarcfailure      unix  -                               pipe readdmarcfailure      unix  -                               pipe
Zeile 2608: Zeile 2390:
 ==== /etc/postfix/transport_maps ==== ==== /etc/postfix/transport_maps ====
  
-Zur Weiterleitung von [[http://www.postfix.org|Postfix]] an die Skripte ''/usr/local/bin/readddmarc.pl'' und ''/usr/local/bin/readddmarcfailure.pl'', ist es erforderlich diese in der ''/etc/postfix/transport_maps'' entsprechend zu definieren, wie nachfolgend gezeigt:+Zur Weiterleitung von [[http://www.postfix.org|Postfix]] an die Skripte ''/usr/local/bin/readddmarc.pl'' und ''/usr/local/bin/readddmarcfailure.py'', ist es erforderlich diese in der ''/etc/postfix/transport_maps'' entsprechend zu definieren, wie nachfolgend gezeigt:
  
 (**Komplette Konfigurationsdatei**:) (**Komplette Konfigurationsdatei**:)
Zeile 2631: Zeile 2413:
 </code> </code>
  
-==== **ODER** /etc/aliases ====+==== **ODER BESSER** /etc/aliases ====
  
-:!: **HINWEIS** - Als alternative Weiterleitung von [[http://www.postfix.org|Postfix]] an die Skripte ''/usr/local/bin/eadddmarc.pl'' und ''/usr/local/bin/readddmarcfailure.pl'', ist es ebenfalls möglich **__anstelle von ''/etc/postfix/transport_maps'', ''/etc/postfix/main.cf'' und ''/etc/postfix/master.cf''__** diese in der ''/etc/aliases'' entsprechend zu definieren, wie nachfolgend gezeigt:+:!: **HINWEIS** - Als alternative Weiterleitung von [[http://www.postfix.org|Postfix]] an die Skripte ''/usr/local/bin/readddmarc.pl'' und ''/usr/local/bin/readddmarcfailure.py'', ist es ebenfalls möglich **__anstelle von ''/etc/postfix/transport_maps'', ''/etc/postfix/main.cf'' und ''/etc/postfix/master.cf''__** diese in der ''/etc/aliases'' entsprechend zu definieren, wie nachfolgend gezeigt:
  
 (**Nur relevanter Ausschnitt**:) (**Nur relevanter Ausschnitt**:)
Zeile 2639: Zeile 2421:
 <code> <code>
 ... ...
-dmarc-aggregate: "|/usr/local/bin/readdmarc.pl" +dmarc-aggregate:        "|/usr/local/bin/readdmarc.pl" 
-dmarc-incorrect: "|/usr/local/bin/readdmarcfailure.pl" +dmarc-aggregate+badhd "|/usr/local/bin/readdmarc.pl" 
-</code> +dmarc-incorrect       "|/usr/local/bin/readdmarcfailure.py
-**__ODER__** +dmarc-incorrect+badhd "|/usr/local/bin/readdmarcfailure.py"
-<code> +
-... +
-dmarc-aggregate: "|/usr/local/bin/readdmarc.pl+
-dmarc-incorrect: "|/usr/local/bin/readdmarcfailure.py"+
 </code> </code>
  
Zeile 2680: Zeile 2458:
 Anschließend kann mit nachfolgendem Befehl die DMARC Reports Web GUI [[http://www.techsneeze.com/dmarc-report|DMARC Reports]] **direkt** in das neu erstellte Verzeichnis heruntergeladen und **umbenannt** werden: Anschließend kann mit nachfolgendem Befehl die DMARC Reports Web GUI [[http://www.techsneeze.com/dmarc-report|DMARC Reports]] **direkt** in das neu erstellte Verzeichnis heruntergeladen und **umbenannt** werden:
 <code> <code>
-# wget -O /var/www/dmarcreports/index.php http://www.techsneeze.com/files/dmarcts-index.txt +# wget https://github.com/techsneeze/dmarcts-report-viewer/archive/master.zip -P /tmp/ 
---2015-10-24 06:20:40--  http://www.techsneeze.com/files/dmarcts-index.txt +--2017-10-20 09:15:54--  https://github.com/techsneeze/dmarcts-report-viewer/archive/master.zip 
-Resolving www.techsneeze.com (www.techsneeze.com)... 74.208.243.1832607:f1c0:830:6800::4d:9c7e +Resolving github.com (github.com)... 192.30.253.112, 192.30.253.113 
-Connecting to www.techsneeze.com (www.techsneeze.com)|74.208.243.183|:80... connected.+Connecting to github.com (github.com)|192.30.253.112|:443... connected. 
 +HTTP request sent, awaiting response... 302 Found 
 +Location: https://codeload.github.com/techsneeze/dmarcts-report-viewer/zip/master [following] 
 +--2017-10-20 09:15:54--  https://codeload.github.com/techsneeze/dmarcts-report-viewer/zip/master 
 +Resolving codeload.github.com (codeload.github.com)... 192.30.253.121192.30.253.120 
 +Connecting to codeload.github.com (codeload.github.com)|192.30.253.121|:443... connected.
 HTTP request sent, awaiting response... 200 OK HTTP request sent, awaiting response... 200 OK
-Length: 4253 (4.2K) [text/plain+Length: 18293 (18K) [application/zip
-Saving to: ‘/var/www/dmarcreports/index.php+Saving to: ‘/tmp/master.zip
  
-100%[======================================>4,253       --.-K/  in 0.002s  +100%[======================================>18,293      --.-K/  in 0.1s    
  
-2015-10-24 06:20:41 (2.37 MB/s) - ‘/var/www/dmarcreports/index.php’ saved [4253/4253]+2017-10-20 09:15:55 (133 KB/s) - ‘/tmp/master.zip’ saved [18293/18293
  
 </code> </code>
  
-==== /var/www/dmarcreports/index.php ====+Anschließend soll das soeben heruntergeladene **ZIP-Archiv** mit nachfolgendem Befehl entpackt werden: 
 +<code> 
 +# unzip /tmp/master.zip -d /var/www/ 
 +Archive:  /tmp/master.zip 
 +5d97612e00bcce48d446fa85e19b392d8433376f 
 +   creating: /var/www/dmarcts-report-viewer-master/ 
 + extracting: /var/www/dmarcts-report-viewer-master/.gitignore   
 +  inflating: /var/www/dmarcts-report-viewer-master/LICENSE   
 +  inflating: /var/www/dmarcts-report-viewer-master/README.md   
 +  inflating: /var/www/dmarcts-report-viewer-master/default.css   
 +  inflating: /var/www/dmarcts-report-viewer-master/dmarcts-report-viewer-config.php.sample   
 +  inflating: /var/www/dmarcts-report-viewer-master/dmarcts-report-viewer.php 
 +</code>
  
-Bevor die in [[http://www.php.net/|PHP Net]] geschriebene DMARC Reports Web GUI [[http://www.techsneeze.com/dmarc-report|DMARC Reports]] genutzt werden kann, ist es noch erforderlich die am Anfang des Skripts befindlichen Variablen anzupassen, damit ein Zugriff auf die Datenbank durch das Skript durchgeführt werden kann.+Das so entstandene Verzeichnis  
 +  * **''/var/www/dmarcts-report-viewer-master/''** 
 +kann nun mit nachfolgendem Befehl umbenannt werden: 
 +<code> 
 +# mv /var/www/dmarcts-report-viewer-master /var/www/dmarcreports 
 +</code>  
 + 
 +Nachfolgender Befehl zeigt nun den Inhalt des Verzeichnisses ''/var/www/dmarcreports'': 
 +<code> 
 +# ls -la /var/www/dmarcreports 
 +total 68 
 +drwxr-xr-x   2 root root   149 Oct  2 20:34 . 
 +drwxr-xr-x. 10 root root  4096 Oct 20 09:21 .. 
 +-rw-r--r--   1 root root  1307 Oct  2 20:34 default.css 
 +-rw-r--r--   1 root root   358 Oct  2 20:34 dmarcts-report-viewer-config.php.sample 
 +-rw-r--r--   1 root root 11254 Oct  2 20:34 dmarcts-report-viewer.php 
 +-rw-r--r--   1 root root    47 Oct  2 20:34 .gitignore 
 +-rw-r--r--   1 root root 35141 Oct  2 20:34 LICENSE 
 +-rw-r--r--   1 root root  2132 Oct  2 20:34 README.md 
 +</code> 
 + 
 +==== /var/www/dmarcreports/dmarcts-report-viewer-config.php.==== 
 + 
 +Bevor die in [[http://www.php.net/|PHP Net]] geschriebene DMARC Reports Web GUI [[http://www.techsneeze.com/dmarc-report|DMARC Reports]] genutzt werden kann, ist es noch erforderlich die **Beispielkonfigurationsdatei** 
 +  * **''/var/www/dmarcreports/dmarcts-report-viewer-config.php.sample''** 
 +zu **kopieren** und die darin befindlichen Variablen anzupassen, damit ein Zugriff auf die Datenbank durch das Skript durchgeführt werden kann, was mit nachfolgendem Befehl durchgeführt werden kann: 
 +<code> 
 +# cp -a /var/www/dmarcreports/dmarcts-report-viewer-config.php.sample /var/www/dmarcreports/dmarcts-report-viewer-config.php 
 +</code>
  
 (**Komplettes Skript**) (**Komplettes Skript**)
Zeile 2702: Zeile 2525:
 <code php> <code php>
 <?php <?php
-///////////////////////////////////////////////////////////////////////////+ 
 +// #################################################################### 
 +// ### configuration ################################################## 
 +// ####################################################################
  
 $dbhost="mariadb.idmz.tachtler.net"; $dbhost="mariadb.idmz.tachtler.net";
Zeile 2709: Zeile 2535:
 $dbpass="geheim"; $dbpass="geheim";
  
-/////////////// NO CHANGES BELOW ////////////////////////////////////////// +$default_lookup = 0 # 1= on 0=off (on is old behaviour )
-/////////////////////////////////////////////////////////////////////////// +
-// Make a MySQL Connection +
-mysql_connect($dbhost, $dbuser, $dbpass) or die(mysql_error()); +
-mysql_select_db($dbnameor die(mysql_error());+
  
-$query_report = "SELECT * FROM report ORDER BY mindate";  
-   
-$result_report = mysql_query($query_report) or die(mysql_error()); 
- 
-echo "<title>DMARC Report</title>"; 
-echo "<head>\n"; 
-echo "</head>\n"; 
-echo "<html>\n"; 
-echo "<body>\n"; 
- 
-echo "<center><h1>DMARC Reports</h1></center>\n"; 
- 
-echo "<hr align=center width=90% noshade>\n"; 
-   
-function format_date($date, $format){ 
-                    $answer = date($format, strtotime($date)); 
-                    return $answer; 
-        }; 
- 
-echo "<table align=center border=0 cellpadding=3>\n"; 
-echo "<thead><tr><th>Start Date</th><th>End Date</th><th>Domain</th><th>Reporting Organization</th><th>Report ID</th><th>Messages</th></tr></thead><tbody>\n"; 
- 
-$result_report = mysql_query($query_report) or die(mysql_error()); 
- 
-while($row = mysql_fetch_array($result_report)){ 
- $array_report[] = $row; 
- $message_query = "SELECT *, SUM(rcount) FROM rptrecord WHERE serial = {$row['serial']}"; 
- $message_process = mysql_query($message_query) or die(mysql_error()); 
- $message_result = mysql_fetch_array($message_process); 
- $date_output_format = "r"; 
- echo "<tr align=center>"; 
- echo "<td align=right>". format_date($row['mindate'], $date_output_format). "</td><td align=right>". format_date($row['maxdate'], $date_output_format). "</td><td>". $row['domain']. "</td><td>". $row['org']. "</td><td><a href=?report=". $row['serial']. "#rpt". $row['serial']. ">". $row['reportid']. "</a></td><td>". $message_result['SUM(rcount)']. "</td>"; 
- echo "</tr>"; 
- echo "\n"; 
-} 
-echo "</tbody>"; 
-echo "</table>"; 
-echo " <br />"; 
-echo "\n"; 
-//echo "-------------------------------------------------------------------------------------"; 
-echo "<hr align=center width=90% noshade>"; 
-echo " <br />"; 
-echo "\n"; 
-/////////Start Lower Section 
- 
-// Get value (if it exists) from URL 
-$displayreport = 0; 
-if ($_GET) { 
- $displayreport = $_GET["report"]; 
-} 
- 
-if($displayreport !== 0){ 
- 
-$current = 0; 
- 
-$query_date = "SELECT * FROM report where serial = $displayreport"; 
- 
-$query_rptrecord = "SELECT * FROM rptrecord where serial = $displayreport"; 
- 
-$result_date = mysql_query($query_date) or die(mysql_error()); 
-$showdate = mysql_fetch_array($result_date); 
-echo "<br/><center><strong>". format_date($showdate['mindate'], r ). "</strong></center><br />\n"; 
- 
-$result_rptrecord = mysql_query($query_rptrecord) or die(mysql_error()); 
- 
-echo "<table align=center border=0 cellpadding=2>"; 
-echo "<th>IP Address</th><th>Host Name</th><th>Message Count</th><th>Disposition</th><th>Reason</th><th>DKIM Domain</th><th>DKIM Result</th><th>SPF Domain</th><th>SPF Result</th>\n"; 
-while($row = mysql_fetch_array($result_rptrecord)){ 
- $rowcolor="FFFFFF"; 
- if (($row['dkimresult'] == "fail") && ($row['spfresult'] == "fail")){ 
- $rowcolor="FF0000"; //red 
- } elseif (($row['dkimresult'] == "fail") || ($row['spfresult'] == "fail")){ 
- $rowcolor="FFA500"; //orange 
- } elseif (($row['dkimresult'] == "pass") && ($row['spfresult'] == "pass")){ 
- $rowcolor="00FF00"; //lime 
- } else { 
- $rowcolor="FFFF00"; //yellow 
- }; 
- echo "<tr align=center bgcolor=". $rowcolor. ">"; 
-        echo "<td><a name=rpt". $row['serial'].">". long2ip($row['ip']). "</td><td>". gethostbyaddr(long2ip($row['ip'])). "</td><td>". $row['rcount']. "</td><td>". $row['disposition']. "</td><td>". $row['reason']. "</td><td>". $row['dkimdomain']. "</td><td>". $row['dkimresult']. "</td><td>". $row['spfdomain']. "</td><td>". $row['spfresult']. "</td>"; 
-        echo "</tr>"; 
- echo "\n"; 
-} 
-echo "</table>"; 
- 
-echo "<hr align=center width=90% noshade>"; 
-echo "<center><h5>Brought to you by <a href=http://www.techsneeze.com>TechSneeze.com</a> - <a href=mailto:dave@techsneeze.com>dave@techsneeze.com</a></h5></center><br />\n"; 
-} 
-echo "</body>"; 
-echo "</html>"; 
-//var_dump($array_report); 
-//var_dump($message_result); 
-//print_r(array_keys($array_report[5])); 
 ?> ?>
 </code> </code>
Zeile 2819: Zeile 2548:
  
 Anpassung der Zugriffsdaten für die Datenbank, wie Datenbank-Server, Benutzername und das Passwort. Anpassung der Zugriffsdaten für die Datenbank, wie Datenbank-Server, Benutzername und das Passwort.
 +
 +  * <code php>$default_lookup = 0;  # 1= on 0=off (on is old behaviour )</code>
 +
 +Standardmäßig keine DNS-Anfragen (lookups) zur Ermittelung der Host-Namen (DNS-Namensauflösung) basierend auf den IP-Adressen durchführen.
 +
 +:!: **HINWEIS** - **Dies sollte deaktiviert werden, da sonst viele DSN-Anfrage den Seitenaufbau extrem verlangsamen können!**
 +
 +==== /var/www/dmarcreports/index.php ====
 +
 +Abschließend soll noch ein **symbolischer Link** wie folgt gesetzt werden, damit der Aufruf des PGP-Scripts/Seite ''/var/www/dmarcreports/dmarcts-report-viewer.php'' via ''/var/www/dmarcreports/index.php'' erfolgen kann. Dies ist nicht unbedingt notwendig, aber schöner und ggf. auch bei Standard Webserver-Konfigurationen besser anzuwenden:
 +<code>
 +# ln -s /var/www/dmarcreports/dmarcts-report-viewer.php index.php
 +</code>
 +
 +Abschließend zeigt nachfolgender Befehl nun den aktuellen Inhalt des Verzeichnisses ''/var/www/dmarcreports'':
 +<code>
 +# ls -la /var/www/dmarcreports
 +total 76
 +drwxr-xr-x   2 root root  4096 Oct 20 09:32 .
 +drwxr-xr-x. 10 root root  4096 Oct 20 09:21 ..
 +-rw-r--r--   1 root root  1307 Oct  2 20:34 default.css
 +-rw-r--r--   1 root root   378 Oct 20 07:58 dmarcts-report-viewer-config.php
 +-rw-r--r--   1 root root   358 Oct  2 20:34 dmarcts-report-viewer-config.php.sample
 +-rw-r--r--   1 root root 11254 Oct  2 20:34 dmarcts-report-viewer.php
 +-rw-r--r--   1 root root    47 Oct  2 20:34 .gitignore
 +lrwxrwxrwx   1 root root    47 Oct 20 09:32 index.php -> /var/www/dmarcreports/dmarcts-report-viewer.php
 +-rw-r--r--   1 root root 35141 Oct  2 20:34 LICENSE
 +-rw-r--r--   1 root root  2132 Oct  2 20:34 README.md
 +</code>
  
 ==== /etc/httpd/conf.d/vhost.conf ==== ==== /etc/httpd/conf.d/vhost.conf ====
Zeile 2878: Zeile 2636:
  
 {{:tachtler:opendmarc:opendmarc_dmarc_reports_web_gui.png|DMARC Reports Web GUI }} {{:tachtler:opendmarc:opendmarc_dmarc_reports_web_gui.png|DMARC Reports Web GUI }}
- 
-==== Performace Verbesserung DMARC Reports Web GUI ==== 
- 
-Um den Seitenaufbau der DMARC Reports Web GUI zu beschleunigen, kann auf die **DNS-Auflösung der IP-Adresse verzichtet werden**. Dazu sind nachfolgende Änderungen in der HTML-Seite unter: 
-  * ''/var/www/dmarcreports/index.php'' 
-erforderlich: 
- 
-Alle Anpassungen sind mit dem Kommentar 
-<code php> 
-# Tachtler 
-</code> 
-versehen. 
- 
-(**Nur relevanter Ausschnitt**) 
- 
-**Funktion: ''function tmpl_reportData($reportnumber, $allowed_reports)''** - (ab Zeile 80) 
-<code php> 
-function tmpl_reportData($reportnumber, $allowed_reports) { 
- 
-        if (!$reportnumber) { 
-                return ""; 
-        } 
- 
-        $reportdata[] = ""; 
-        $reportdata[] = "<!-- Start of report rata -->"; 
- 
-        if (isset($allowed_reports[BySerial][$reportnumber])) { 
-                $row = $allowed_reports[BySerial][$reportnumber]; 
-                $reportdata[] = "<div class='center reportdesc'><p> Report from ".$row['org']." for ".$row['domain']."<br>(". format_date($row['mindate'], "r" ). " - ".format_date($row['maxdate'], "r" ).")</p></div>"; 
-        } else { 
-                return "Unknown report number!"; 
-        } 
- 
-        $reportdata[] = "<a id='rpt".$reportnumber."'></a>"; 
-        $reportdata[] = "<table class='reportdata'>"; 
-        $reportdata[] = "  <thead>"; 
-        $reportdata[] = "    <tr>"; 
-        $reportdata[] = "      <th>IP Address</th>"; 
-        # Tachtler - DISABLED - 
-        # default: $reportdata[] = "      <th>Host Name</th>"; 
-        # $reportdata[] = "      <th>Host Name</th>"; 
-        $reportdata[] = "      <th>Message Count</th>"; 
-        $reportdata[] = "      <th>Disposition</th>"; 
-        $reportdata[] = "      <th>Reason</th>"; 
-        $reportdata[] = "      <th>DKIM Domain</th>"; 
-        $reportdata[] = "      <th>Raw DKIM Result</th>"; 
-        $reportdata[] = "      <th>SPF Domain</th>"; 
-        $reportdata[] = "      <th>Raw SPF Result</th>"; 
-        $reportdata[] = "    </tr>"; 
-        $reportdata[] = "  </thead>"; 
- 
-        $reportdata[] = "  <tbody>"; 
- 
-        global $mysqli; 
-        $sql = "SELECT * FROM rptrecord where serial = $reportnumber"; 
-        $query = $mysqli->query($sql) or die("Query failed: ".$mysqli->error." (Error #" .$mysqli->errno.")"); 
-        while($row = $query->fetch_assoc()) { 
-                $status=""; 
-                if (($row['dkimresult'] == "fail") && ($row['spfresult'] == "fail")) { 
-                        $status="red"; 
-                } elseif (($row['dkimresult'] == "fail") || ($row['spfresult'] == "fail")) { 
-                        $status="orange"; 
-                } elseif (($row['dkimresult'] == "pass") && ($row['spfresult'] == "pass")) { 
-                        $status="lime"; 
-                } else { 
-                        $status="yellow"; 
-                }; 
- 
-                if ( $row['ip'] ) { 
-                        $ip = long2ip($row['ip']); 
-                } 
-                if ( $row['ip6'] ) { 
-                        $ip = inet_ntop($row['ip6']); 
-                } 
- 
-                $reportdata[] = "    <tr class='".$status."'>"; 
-                $reportdata[] = "      <td>". $ip. "</td>"; 
-                # Tachtler - DISABLED - 
-                # default: $reportdata[] = "      <td>". gethostbyaddr($ip). "</td>"; 
-                # $reportdata[] = "      <td>". gethostbyaddr($ip). "</td>"; 
-                $reportdata[] = "      <td>". $row['rcount']. "</td>"; 
-                $reportdata[] = "      <td>". $row['disposition']. "</td>"; 
-                $reportdata[] = "      <td>". $row['reason']. "</td>"; 
-                $reportdata[] = "      <td>". $row['dkimdomain']. "</td>"; 
-                $reportdata[] = "      <td>". $row['dkimresult']. "</td>"; 
-                $reportdata[] = "      <td>". $row['spfdomain']. "</td>"; 
-                $reportdata[] = "      <td>". $row['spfresult']. "</td>"; 
-                $reportdata[] = "    </tr>"; 
-        } 
-        $reportdata[] = "  </tbody>"; 
-        $reportdata[] = "</table>"; 
- 
-        $reportdata[] = "<!-- End of report rata -->"; 
-        $reportdata[] = ""; 
- 
-        #indent generated html by 2 extra spaces 
-        return implode("\n  ",$reportdata); 
-} 
-</code> 
- 
-Die Sortierreihenfolge der DMARC Reports Web GUI von Absteigend auf Aufsteigen - neuster Eintrag als erster Eintrag - kann mit nachfolgender Anpassung durchgeführt werden: 
- 
-(**Nur relevanter Ausschnitt**) 
- 
-**Funktion: ''main''** - (ab Zeile 179) 
-<code php> 
-//#################################################################### 
-//### main ########################################################### 
-//#################################################################### 
- 
-// The file is expected to be in the same folder as this script, and it 
-// must exist. 
-include "dmarcts-report-viewer-config.php"; 
- 
-// Make a MySQL Connection using mysqli 
-$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
-if ($mysqli->connect_errno) { 
-        echo "Error: Failed to make a MySQL connection, here is why: \n"; 
-        echo "Errno: " . $mysqli->connect_errno . "\n"; 
-        echo "Error: " . $mysqli->connect_error . "\n"; 
-        exit; 
-} 
- 
-define("BySerial", 1); 
-define("ByDomain", 2); 
-define("ByOrganisation", 3); 
- 
-// Get allowed reports and cache them - using serial as key 
-$allowed_reports = array(); 
-# Include the rcount via left join, so we do not have to make an sql query for every single report. 
-# Tachtler - CHANGE ORDER to DESCending - 
-# default: $sql = "SELECT report.* , sum(rptrecord.rcount) as rcount FROM `report` LEFT Join rptrecord on report.serial = rptrecord.serial group by serial order by mindate"; 
-$sql = "SELECT report.* , sum(rptrecord.rcount) as rcount FROM `report` LEFT Join rptrecord on report.serial = rptrecord.serial group by serial order by mindate DESC"; 
-$query = $mysqli->query($sql) or die("Query failed: ".$mysqli->error." (Error #" .$mysqli->errno.")"); 
-while($row = $query->fetch_assoc()) { 
-        //todo: check ACL if this row is allowed 
-        if (true) { 
-                //add data by serial 
-                $allowed_reports[BySerial][$row['serial']] = $row; 
-                //make a list of serials by domain and by organisation 
-                $allowed_reports[ByDomain][$row['domain']][] = $row['serial']; 
-                $allowed_reports[ByOrganisation][$row['org']][] = $row['serial']; 
-        } 
-} 
-   
-if(isset($_GET['report']) && is_numeric($_GET['report'])){ 
-        $reportid=$_GET['report']; 
-}elseif(!isset($_GET['report'])){ 
-        $reportid=false; 
-}else{   
-        die('Invalid Report ID'); 
-} 
-// Generate Page with report list and report data (if a report is selected). 
-echo tmpl_page( "" 
-        .tmpl_reportList($allowed_reports) 
-        .tmpl_reportData($reportid, $allowed_reports ) 
-); 
-?> 
-</code> 
  
 ===== Test Werkzeuge ===== ===== Test Werkzeuge =====
tachtler/postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter.1508428312.txt.gz · Zuletzt geändert: 2017/10/19 17:51 von klaus