tachtler:postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
tachtler:postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter [2017/10/19 17:52] – [/etc/postfix/master.cf] klaus | tachtler: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 | + | Die Installation |
* [[http:// | * [[http:// | ||
* Siehe auch nachfolgenden internen Link: [[tachtler: | * Siehe auch nachfolgenden internen Link: [[tachtler: | ||
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:: | + | --> Processing Dependency: perl(DBD:: |
- | --> 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: | ---> Package perl-DBD-MySQL.x86_64 0: | ||
---> Package perl-Switch.noarch 0: | ---> Package perl-Switch.noarch 0: | ||
Zeile 68: | Zeile 68: | ||
================================================================================ | ================================================================================ | ||
Installing: | Installing: | ||
- | | + | |
Installing for dependencies: | Installing for dependencies: | ||
- | | + | |
| | ||
| | ||
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 | + | (1/4): libopendmarc-1.4.1-1.el7.x86_64.rpm |
- | (2/4): opendmarc-1.3.1-13.el7.x86_64.rpm | + | (2/4): opendmarc-1.4.1-1.el7.x86_64.rpm |
(3/4): perl-DBD-MySQL-4.023-5.el7.x86_64.rpm | (3/4): perl-DBD-MySQL-4.023-5.el7.x86_64.rpm | ||
(4/4): perl-Switch-2.16-7.el7.noarch.rpm | (4/4): perl-Switch-2.16-7.el7.noarch.rpm | ||
Zeile 93: | Zeile 93: | ||
Running transaction | Running transaction | ||
Installing : perl-Switch-2.16-7.el7.noarch | Installing : perl-Switch-2.16-7.el7.noarch | ||
- | Installing : libopendmarc-1.3.1-13.el7.x86_64 | + | Installing : libopendmarc-1.4.1-1.el7.x86_64 |
Installing : perl-DBD-MySQL-4.023-5.el7.x86_64 | Installing : perl-DBD-MySQL-4.023-5.el7.x86_64 | ||
- | Installing : opendmarc-1.3.1-13.el7.x86_64 | + | Installing : opendmarc-1.4.1-1.el7.x86_64 |
Verifying | Verifying | ||
- | Verifying | + | Verifying |
- | Verifying | + | Verifying |
Verifying | Verifying | ||
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 | + | libopendmarc.x86_64 0:1.4.1-1.el7 |
perl-Switch.noarch 0: | perl-Switch.noarch 0: | ||
Zeile 115: | Zeile 115: | ||
# rpm -qil opendmarc | # rpm -qil opendmarc | ||
Name : opendmarc | Name : opendmarc | ||
- | Version | + | Version |
- | Release | + | Release |
Architecture: | Architecture: | ||
- | Install Date: Wed 21 Oct 2015 02:44:46 PM CEST | + | Install Date: Mon 07 Jun 2021 03:08:31 PM CEST |
- | Group : | + | Group : |
- | Size : 356054 | + | Size : 250395 |
License | License | ||
- | Signature | + | Signature |
- | 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 | Packager | ||
Vendor | Vendor | ||
URL : http:// | URL : http:// | ||
+ | Bug URL : https:// | ||
Summary | Summary | ||
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 | ||
+ | / | ||
+ | / | ||
/ | / | ||
/ | / | ||
/ | / | ||
/ | / | ||
+ | / | ||
/ | / | ||
/ | / | ||
Zeile 152: | Zeile 158: | ||
/ | / | ||
/ | / | ||
- | / | + | / |
- | / | + | / |
- | / | + | / |
- | / | + | / |
- | / | + | / |
- | / | + | / |
- | / | + | |
- | / | + | |
- | / | + | |
/ | / | ||
/ | / | ||
Zeile 169: | Zeile 172: | ||
/ | / | ||
/ | / | ||
- | /var/run/opendmarc | + | /usr/share/opendmarc |
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
/ | / | ||
</ | </ | ||
Zeile 237: | Zeile 252: | ||
===== Konfiguration: | ===== Konfiguration: | ||
- | 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: | ||
</ | </ | ||
- | Als absendende Domains für die DMARC-Reports an andere, sollte ein SUB-Domain | + | :!: **WICHTIG** - **Als absendende Domains für die DMARC-Reports an andere, sollte ein __SUB-Domain__ |
* '' | * '' | ||
* '' | * '' | ||
- | Einträge besitzt. | + | **Einträge besitzt, um so __tägliche DMARC Ping-Pong Schleifen (loops) zu vermeiden__.** |
< | < | ||
Zeile 985: | Zeile 1000: | ||
Nachfolgender Eintrag sollte in den **Header-Zeilen** einer **eingehenden e-Mail** zu finden sein, um das Ergebnis der [[http:// | Nachfolgender Eintrag sollte in den **Header-Zeilen** einer **eingehenden e-Mail** zu finden sein, um das Ergebnis der [[http:// | ||
< | < | ||
- | DMARC-Filter: | + | DMARC-Filter: |
Authentication-Results: | Authentication-Results: | ||
</ | </ | ||
Zeile 1010: | Zeile 1025: | ||
Dies kann durch ein, ebenfalls im **'' | Dies kann durch ein, ebenfalls im **'' | ||
- | * ''/ | + | * ''/ |
durchgeführt werden. | durchgeführt werden. | ||
:!: **HINWEIS** - **Falls von einem HOST anstelle von '' | :!: **HINWEIS** - **Falls von einem HOST anstelle von '' | ||
- | ==== /usr/share/doc/opendmarc-1.3.1/ | + | ==== / |
:!: **HINWEIS** - Nachfolgend sollen vom HOST mit der IP-Adresse '' | :!: **HINWEIS** - Nachfolgend sollen vom HOST mit der IP-Adresse '' | ||
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, | ||
+ | ); | ||
+ | |||
+ | -- 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, | ||
); | ); | ||
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 ' |
- | aspf TINYINT NOT NULL, | + | aspf TINYINT NOT NULL DEFAULT ' |
- | policy TINYINT NOT NULL, | + | policy TINYINT NOT NULL DEFAULT ' |
- | spolicy TINYINT NOT NULL, | + | spolicy TINYINT NOT NULL DEFAULT ' |
- | pct TINYINT NOT NULL, | + | pct TINYINT NOT NULL DEFAULT ' |
- | locked TINYINT NOT NULL, | + | locked TINYINT NOT NULL DEFAULT ' |
firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | firstseen TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
lastsent TIMESTAMP NOT NULL DEFAULT ' | lastsent TIMESTAMP NOT NULL DEFAULT ' | ||
Zeile 1069: | Zeile 1122: | ||
); | ); | ||
- | -- A table for IP addresses | + | -- A table for connecting client |
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 | + | 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 |
- | domain INT NOT NULL, | + | domain INT UNSIGNED NOT NULL, |
- | pass TINYINT NOT NULL, | + | selector INT UNSIGNED |
- | error TINYINT NOT NULL, | + | pass TINYINT |
+ | error TINYINT | ||
PRIMARY KEY(id), | PRIMARY KEY(id), | ||
Zeile 1115: | Zeile 1171: | ||
-- CREATE USER ' | -- CREATE USER ' | ||
-- GRANT ALL ON opendmarc.* to ' | -- GRANT ALL ON opendmarc.* to ' | ||
- | |||
- | |||
- | -- # Tachtler - Create new users. | ||
- | CREATE USER ' | ||
- | CREATE USER ' | ||
-- # 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> | ||
+ | |||
+ | Austausch des '' | ||
* <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 '' | 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 '' | ||
< | < | ||
- | # / | + | # / |
Enter password: | Enter password: | ||
</ | </ | ||
Zeile 1205: | Zeile 1260: | ||
FILE_OPENDMARC_PERMISSION=' | FILE_OPENDMARC_PERMISSION=' | ||
REPORT_INTERVAL=' | REPORT_INTERVAL=' | ||
- | REPORT_SENDER=' | + | REPORT_SENDER=' |
REPORT_ORG=' | REPORT_ORG=' | ||
REPORT_EXPIRE=' | REPORT_EXPIRE=' | ||
Zeile 1647: | Zeile 1702: | ||
Dank der Vorarbeiten und den Skripten von [[http:// | Dank der Vorarbeiten und den Skripten von [[http:// | ||
+ | * [[http:// | ||
==== Installation: | ==== Installation: | ||
Zeile 1726: | Zeile 1782: | ||
Complete! | Complete! | ||
</ | </ | ||
- | |||
- | Nachfolgende **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | * **'' | ||
- | |||
- | Die Installation der **Skriptabhängigkeiten**, | ||
- | < | ||
- | # 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: | ||
- | ---> Package perl-Email-Date-Format.noarch 0: | ||
- | ---> Package perl-Email-MIME.noarch 0: | ||
- | ---> Package perl-Email-MIME-ContentType.noarch 0: | ||
- | ---> Package perl-Email-MIME-Encodings.noarch 0: | ||
- | ---> Package perl-Email-MessageID.noarch 0: | ||
- | ---> Package perl-Email-Simple.noarch 0: | ||
- | ---> Package perl-MIME-Types.noarch 0: | ||
- | --> Finished Dependency Resolution | ||
- | |||
- | Changes in packages about to be updated: | ||
- | |||
- | |||
- | Dependencies Resolved | ||
- | |||
- | =============================================================================== | ||
- | | ||
- | Size | ||
- | =============================================================================== | ||
- | Installing: | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | |||
- | Transaction Summary | ||
- | =============================================================================== | ||
- | Install | ||
- | |||
- | 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 | ||
- | (2/8): perl-Email-Date-Format-1.002-15.el7.noarch.rpm | ||
- | (3/8): perl-Email-MIME-1.926-1.el7.noarch.rpm | ||
- | (4/8): perl-Email-MIME-Encodings-1.315-1.el7.noarch.rpm | ||
- | (5/8): perl-Email-MIME-ContentType-1.017-1.el7.noarch.rpm | 19 kB | ||
- | (6/8): perl-Email-MessageID-1.404-1.el7.noarch.rpm | ||
- | (7/8): perl-Email-Simple-2.203-1.el7.noarch.rpm | ||
- | (8/8): perl-MIME-Types-1.38-2.el7.noarch.rpm | ||
- | ------------------------------------------------------------------------------- | ||
- | 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 | ||
- | Installing : perl-Email-MessageID-1.404-1.el7.noarch | ||
- | Installing : perl-Email-Date-Format-1.002-15.el7.noarch | ||
- | Installing : perl-Email-Simple-2.203-1.el7.noarch | ||
- | Installing : perl-Email-MIME-Encodings-1.315-1.el7.noarch | ||
- | Installing : perl-Email-MIME-ContentType-1.017-1.el7.noarch | ||
- | Installing : perl-MIME-Types-1.38-2.el7.noarch | ||
- | Installing : perl-Email-MIME-1.926-1.el7.noarch | ||
- | Verifying | ||
- | Verifying | ||
- | Verifying | ||
- | Verifying | ||
- | Verifying | ||
- | Verifying | ||
- | Verifying | ||
- | Verifying | ||
- | |||
- | Installed: | ||
- | perl-Email-Address.noarch 0: | ||
- | perl-Email-Date-Format.noarch 0: | ||
- | perl-Email-MIME.noarch 0: | ||
- | perl-Email-MIME-ContentType.noarch 0: | ||
- | perl-Email-MIME-Encodings.noarch 0: | ||
- | perl-Email-MessageID.noarch 0: | ||
- | perl-Email-Simple.noarch 0: | ||
- | perl-MIME-Types.noarch 0: | ||
- | |||
- | Complete! | ||
- | </ | ||
- | |||
Nachfolgende **'' | Nachfolgende **'' | ||
Zeile 2056: | Zeile 2005: | ||
<code perl> | <code perl> | ||
# | # | ||
- | # -*- perl -*- | ||
- | # $Header: / | ||
- | # | ||
- | # 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/ |
- | # -x read XML files rather than mail messages | + | # Über STDIN wird dem Script readdmarc die eMail übergeben, also z.B.: $ readdmarc < mailtext |
- | # -r replace existing report rather than failing | + | # 2014-05-15 : V.01 by Django |
- | + | ||
- | # Copyright 2012, 2016, Taughannock Networks. All rights reserved. | + | |
- | + | ||
- | # Redistribution and use in source and binary forms, with or without | + | |
- | # modification, | + | |
- | # 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 | + | |
- | # notice, this 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 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | + | |
- | # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | + | |
- | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | + | |
- | # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS | + | |
- | # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED | + | |
- | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | + | |
- | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 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:: | ||
use MIME:: | use MIME:: | ||
use MIME::Words qw(:all); | use MIME::Words qw(:all); | ||
use XML:: | use XML:: | ||
use DBI; | use DBI; | ||
- | use Socket qw{:addrinfo inet_ntop inet_pton AF_INET6 AF_INET}; | + | use IO:: |
+ | use Socket6; | ||
+ | use Socket qw(:DEFAULT :crlf); | ||
+ | use NetAddr::IP; | ||
use PerlIO:: | use PerlIO:: | ||
+ | #use IO:: | ||
- | 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 = " | my $db_host = " | ||
my $db_port = " | my $db_port = " | ||
Zeile 2114: | Zeile 2034: | ||
my $dbh = DBI -> connect (" | my $dbh = DBI -> connect (" | ||
- | foreach my $i (@ARGV) { | + | while (sysread(STDIN, |
- | | + | $buffer .= $input; |
- | + | } | |
- | print " | + | print " |
- | + | | |
- | if($opt_x) { | + | |
- | open(XML, $i) or die " | + | |
- | } else { | + | |
my $parser = new MIME:: | my $parser = new MIME:: | ||
$parser-> | $parser-> | ||
- | + | | |
- | | + | |
- | | + | |
my $body = $ent-> | my $body = $ent-> | ||
$zip = $body; | $zip = $body; | ||
Zeile 2170: | Zeile 2085: | ||
or die " | or die " | ||
} | } | ||
- | } | ||
my $xml = ""; | my $xml = ""; | ||
$xml .= $_ while < | $xml .= $_ while < | ||
- | close XML; | ||
$ent-> | $ent-> | ||
$zip-> | $zip-> | ||
- | | + | |
my $xs = XML:: | my $xs = XML:: | ||
- | | + | |
print "XML is ======\n$xml\n=====\n" | print "XML is ======\n$xml\n=====\n" | ||
my $ref = $xs-> | my $ref = $xs-> | ||
my %xml = %{$ref}; | my %xml = %{$ref}; | ||
- | #print join " | ||
- | #print " | ||
my $from = $xml{' | my $from = $xml{' | ||
my $to = $xml{' | my $to = $xml{' | ||
Zeile 2201: | Zeile 2112: | ||
my ($xorg, $xid, $serial) = $dbh-> | my ($xorg, $xid, $serial) = $dbh-> | ||
if($xorg) { | if($xorg) { | ||
- | if($opt_r) { | ||
- | print " | ||
- | $dbh-> | ||
- | or die " | ||
- | } else { | ||
print " | print " | ||
- | next; | ||
- | } | ||
} | } | ||
Zeile 2218: | Zeile 2122: | ||
$dbh-> | $dbh-> | ||
or die " | or die " | ||
+ | |||
$serial = $dbh-> | $serial = $dbh-> | ||
print " serial $serial "; | print " serial $serial "; | ||
my $record = $xml{' | my $record = $xml{' | ||
+ | |||
+ | |||
sub dorow($$) { | sub dorow($$) { | ||
my ($serial, | my ($serial, | ||
Zeile 2276: | Zeile 2183: | ||
next; | next; | ||
} | } | ||
+ | print " | ||
+ | |||
print " | print " | ||
$dbh-> | $dbh-> | ||
Zeile 2293: | Zeile 2202: | ||
print " | print " | ||
} | } | ||
- | } | ||
</ | </ | ||
Zeile 2316: | Zeile 2224: | ||
< | < | ||
# chown root:root / | # chown root:root / | ||
- | </ | ||
- | |||
- | ==== / | ||
- | |||
- | Das Skript **'' | ||
- | |||
- | :!: **HINWIES** - **Anpassungen müssen beim Datenbankzugriff durchgeführt werden!** | ||
- | |||
- | <code perl> | ||
- | # | ||
- | |||
- | # Script zum automatischen Verarbeiten der DMARC-Forensic-Mails in die mySQL-Datenbank dmarc | ||
- | # basierend auf den DMARC Reporting scripts (http:// | ||
- | # Ü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:: | ||
- | use MIME::Words qw(:all); | ||
- | use DBI; | ||
- | use Email:: | ||
- | use Email:: | ||
- | |||
- | my $buffer = ''; | ||
- | my $input = ''; | ||
- | my $db_host = " | ||
- | my $db_port = " | ||
- | my $db_name = " | ||
- | my $db_user = " | ||
- | my $db_pass = ""; | ||
- | my $dbh = DBI -> connect (" | ||
- | |||
- | while (sysread(STDIN, | ||
- | $buffer .= $input; | ||
- | } | ||
- | |||
- | my ($zip, $ent, $isgzip); | ||
- | my $parser = new MIME:: | ||
- | | ||
- | $ent = $parser-> | ||
- | my $body = $ent-> | ||
- | $zip = $body; | ||
- | my $mtype = $ent-> | ||
- | my $subject = decode_mimewords($ent-> | ||
- | my $date = decode_mimewords($ent-> | ||
- | my $from = decode_mimewords($ent-> | ||
- | |||
- | # Nachricht eine valider Report? | ||
- | | ||
- | my $valid_report = $1; | ||
- | if ($valid_report ne " | ||
- | print "no valid report!\n"; | ||
- | exit; | ||
- | } | ||
- | else { print " | ||
- | } | ||
- | |||
- | # Daten aus Content-Type" | ||
- | my $content_block = Email:: | ||
- | my ($fr) = grep { $_-> | ||
- | my $mfr = $fr-> | ||
- | $from =~ /< | ||
- | my $domrep = $2; | ||
- | $mfr =~ / | ||
- | my $type = $2; | ||
- | $mfr =~ / | ||
- | my $version = $2; | ||
- | $mfr =~ / | ||
- | my $useragent = $2; | ||
- | $mfr =~ / | ||
- | my $authfailure = $2; | ||
- | $mfr =~ / | ||
- | my $result = $2; | ||
- | $mfr =~ / | ||
- | my $envid = $2; | ||
- | $mfr =~ / | ||
- | my $origbox = $2; | ||
- | my $origdom = $3; | ||
- | $mfr =~ / | ||
- | my $source = $2; | ||
- | $mfr =~ / | ||
- | my $domain = $2; | ||
- | |||
- | # Daten aus Content-Type" | ||
- | my ($rfc822_headers) = grep { $_-> | ||
- | my $org_headers = $rfc822_headers-> | ||
- | | ||
- | my $frombox = $3; | ||
- | my $fromdom = $4; | ||
- | |||
- | # Daten in die mySQL-Datenbank schreiben | ||
- | |||
- | my $sql = " | ||
- | |||
- | $dbh-> | ||
- | </ | ||
- | |||
- | **__Nachfolgende Änderungen wurden am Skript durchgeführt: | ||
- | |||
- | * <code perl>my $db_host = " | ||
- | my $db_port = " | ||
- | my $db_name = " | ||
- | my $db_user = " | ||
- | my $db_pass = ""; | ||
- | my $dbh = DBI -> connect (" | ||
- | |||
- | Anpassen des Datenbankzugriffs in Bezug auf den Datenbank-Server, | ||
- | |||
- | * <code perl>my $sql = " | ||
- | |||
- | Anpassen des **Namens** der Datenbank auf **'' | ||
- | |||
- | :!: **HINWEIS** - **Die Variable '' | ||
- | |||
- | Nachfolgender Befehl setzte die **Datei**- und **Besitzrechte** für das Skript wie folgt: | ||
- | < | ||
- | # chmod 755 / | ||
- | </ | ||
- | und | ||
- | < | ||
- | # chown root:root / | ||
</ | </ | ||
Zeile 2446: | Zeile 2233: | ||
<code python> | <code python> | ||
- | #!/usr/local/bin/python | + | # |
# $Header: / | # $Header: / | ||
# 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=' | # default: db = MySQLdb.connect(user=' | ||
- | db = MySQLdb.connect(host=' | + | db = MySQLdb.connect(host=' |
MySQLdb.paramstyle=' | MySQLdb.paramstyle=' | ||
Zeile 2538: | Zeile 2325: | ||
print " | print " | ||
c.close() | c.close() | ||
+ | db.commit() | ||
| | ||
if __name__ == " | if __name__ == " | ||
Zeile 2572: | Zeile 2360: | ||
(**Nur relevanter Ausschnitt**: | (**Nur relevanter Ausschnitt**: | ||
- | < | ||
- | ... | ||
- | # Tachtler | ||
- | readdmarc | ||
- | flags=DRhu user=nobody argv=/ | ||
- | # Tachtler | ||
- | readdmarcfailure | ||
- | flags=DRhu user=nobody argv=/ | ||
- | </ | ||
- | **__ODER__** | ||
< | < | ||
... | ... | ||
Zeile 2612: | Zeile 2390: | ||
==== / | ==== / | ||
- | Zur Weiterleitung von [[http:// | + | Zur Weiterleitung von [[http:// |
(**Komplette Konfigurationsdatei**: | (**Komplette Konfigurationsdatei**: | ||
Zeile 2635: | Zeile 2413: | ||
</ | </ | ||
- | ==== **ODER** / | + | ==== **ODER |
- | :!: **HINWEIS** - Als alternative Weiterleitung von [[http:// | + | :!: **HINWEIS** - Als alternative Weiterleitung von [[http:// |
(**Nur relevanter Ausschnitt**: | (**Nur relevanter Ausschnitt**: | ||
Zeile 2643: | Zeile 2421: | ||
< | < | ||
... | ... | ||
- | dmarc-aggregate: | + | dmarc-aggregate: |
- | dmarc-incorrect: | + | dmarc-aggregate+badhd: " |
- | </ | + | dmarc-incorrect: " |
- | **__ODER__** | + | dmarc-incorrect+badhd: " |
- | < | + | |
- | ... | + | |
- | dmarc-aggregate: | + | |
- | dmarc-incorrect: | + | |
</ | </ | ||
Zeile 2684: | Zeile 2458: | ||
Anschließend kann mit nachfolgendem Befehl die DMARC Reports Web GUI [[http:// | Anschließend kann mit nachfolgendem Befehl die DMARC Reports Web GUI [[http:// | ||
< | < | ||
- | # wget -O /var/www/dmarcreports/index.php http://www.techsneeze.com/ | + | # wget https://github.com/techsneeze/dmarcts-report-viewer/ |
- | --2015-10-24 06:20:40-- | + | --2017-10-20 09: |
- | Resolving | + | Resolving github.com (github.com)... 192.30.253.112, |
- | Connecting to www.techsneeze.com (www.techsneeze.com)|74.208.243.183|:80... connected. | + | Connecting to github.com (github.com)|192.30.253.112|: |
+ | HTTP request sent, awaiting response... 302 Found | ||
+ | Location: https:// | ||
+ | --2017-10-20 | ||
+ | Resolving | ||
+ | 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: | + | Length: |
- | Saving to: ‘/var/ | + | Saving to: ‘/tmp/master.zip’ |
- | 100%[======================================> | + | 100%[======================================> |
- | 2015-10-24 06:20:41 (2.37 MB/s) - ‘/var/ | + | 2017-10-20 |
</ | </ | ||
- | ==== /var/www/dmarcreports/index.php ==== | + | Anschließend soll das soeben heruntergeladene **ZIP-Archiv** mit nachfolgendem Befehl entpackt werden: |
+ | < | ||
+ | # unzip / | ||
+ | Archive: | ||
+ | 5d97612e00bcce48d446fa85e19b392d8433376f | ||
+ | | ||
+ | | ||
+ | inflating: / | ||
+ | inflating: / | ||
+ | inflating: / | ||
+ | inflating: / | ||
+ | inflating: / | ||
+ | </ | ||
- | Bevor die in [[http:// | + | Das so entstandene Verzeichnis |
+ | * **''/ | ||
+ | kann nun mit nachfolgendem Befehl umbenannt werden: | ||
+ | < | ||
+ | # mv / | ||
+ | </ | ||
+ | |||
+ | Nachfolgender Befehl zeigt nun den Inhalt des Verzeichnisses ''/ | ||
+ | < | ||
+ | # ls -la / | ||
+ | total 68 | ||
+ | drwxr-xr-x | ||
+ | drwxr-xr-x. 10 root root 4096 Oct 20 09:21 .. | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | </ | ||
+ | |||
+ | ==== / | ||
+ | |||
+ | Bevor die in [[http:// | ||
+ | * **''/ | ||
+ | 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: | ||
+ | < | ||
+ | # cp -a / | ||
+ | </ | ||
(**Komplettes Skript**) | (**Komplettes Skript**) | ||
Zeile 2706: | Zeile 2525: | ||
<code php> | <code php> | ||
<?php | <?php | ||
- | /////////////////////////////////////////////////////////////////////////// | + | |
+ | // #################################################################### | ||
+ | // ### configuration ################################################## | ||
+ | // #################################################################### | ||
$dbhost=" | $dbhost=" | ||
Zeile 2713: | Zeile 2535: | ||
$dbpass=" | $dbpass=" | ||
- | /////////////// | + | $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($dbname) or die(mysql_error()); | + | |
- | $query_report = " | ||
- | |||
- | $result_report = mysql_query($query_report) or die(mysql_error()); | ||
- | |||
- | echo "< | ||
- | echo "< | ||
- | echo "</ | ||
- | echo "< | ||
- | echo "< | ||
- | |||
- | echo "< | ||
- | |||
- | echo "< | ||
- | |||
- | function format_date($date, | ||
- | $answer = date($format, | ||
- | return $answer; | ||
- | }; | ||
- | |||
- | echo "< | ||
- | echo "< | ||
- | |||
- | $result_report = mysql_query($query_report) or die(mysql_error()); | ||
- | |||
- | while($row = mysql_fetch_array($result_report)){ | ||
- | $array_report[] = $row; | ||
- | $message_query = " | ||
- | $message_process = mysql_query($message_query) or die(mysql_error()); | ||
- | $message_result = mysql_fetch_array($message_process); | ||
- | $date_output_format = " | ||
- | echo "< | ||
- | echo "< | ||
- | echo "</ | ||
- | echo " | ||
- | } | ||
- | echo "</ | ||
- | echo "</ | ||
- | echo " <br />"; | ||
- | echo " | ||
- | //echo " | ||
- | echo "< | ||
- | echo " <br />"; | ||
- | echo " | ||
- | ///////// | ||
- | |||
- | // Get value (if it exists) from URL | ||
- | $displayreport = 0; | ||
- | if ($_GET) { | ||
- | $displayreport = $_GET[" | ||
- | } | ||
- | |||
- | if($displayreport !== 0){ | ||
- | |||
- | $current = 0; | ||
- | |||
- | $query_date = " | ||
- | |||
- | $query_rptrecord = " | ||
- | |||
- | $result_date = mysql_query($query_date) or die(mysql_error()); | ||
- | $showdate = mysql_fetch_array($result_date); | ||
- | echo "< | ||
- | |||
- | $result_rptrecord = mysql_query($query_rptrecord) or die(mysql_error()); | ||
- | |||
- | echo "< | ||
- | echo "< | ||
- | while($row = mysql_fetch_array($result_rptrecord)){ | ||
- | $rowcolor=" | ||
- | if (($row[' | ||
- | $rowcolor=" | ||
- | } elseif (($row[' | ||
- | $rowcolor=" | ||
- | } elseif (($row[' | ||
- | $rowcolor=" | ||
- | } else { | ||
- | $rowcolor=" | ||
- | }; | ||
- | echo "< | ||
- | echo "< | ||
- | echo "</ | ||
- | echo " | ||
- | } | ||
- | echo "</ | ||
- | |||
- | echo "< | ||
- | echo "< | ||
- | } | ||
- | echo "</ | ||
- | echo "</ | ||
- | // | ||
- | // | ||
- | // | ||
?> | ?> | ||
</ | </ | ||
Zeile 2823: | Zeile 2548: | ||
Anpassung der Zugriffsdaten für die Datenbank, wie Datenbank-Server, | Anpassung der Zugriffsdaten für die Datenbank, wie Datenbank-Server, | ||
+ | |||
+ | * <code php> | ||
+ | |||
+ | 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!** | ||
+ | |||
+ | ==== / | ||
+ | |||
+ | Abschließend soll noch ein **symbolischer Link** wie folgt gesetzt werden, damit der Aufruf des PGP-Scripts/ | ||
+ | < | ||
+ | # ln -s / | ||
+ | </ | ||
+ | |||
+ | Abschließend zeigt nachfolgender Befehl nun den aktuellen Inhalt des Verzeichnisses ''/ | ||
+ | < | ||
+ | # ls -la / | ||
+ | total 76 | ||
+ | drwxr-xr-x | ||
+ | drwxr-xr-x. 10 root root 4096 Oct 20 09:21 .. | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | lrwxrwxrwx | ||
+ | -rw-r--r-- | ||
+ | -rw-r--r-- | ||
+ | </ | ||
==== / | ==== / | ||
Zeile 2882: | Zeile 2636: | ||
{{: | {{: | ||
- | |||
- | ==== Performace Verbesserung DMARC Reports Web GUI ==== | ||
- | |||
- | Um den Seitenaufbau der DMARC Reports Web GUI zu beschleunigen, | ||
- | * ''/ | ||
- | erforderlich: | ||
- | |||
- | Alle Anpassungen sind mit dem Kommentar | ||
- | <code php> | ||
- | # Tachtler | ||
- | </ | ||
- | versehen. | ||
- | |||
- | (**Nur relevanter Ausschnitt**) | ||
- | |||
- | **Funktion: '' | ||
- | <code php> | ||
- | function tmpl_reportData($reportnumber, | ||
- | |||
- | if (!$reportnumber) { | ||
- | return ""; | ||
- | } | ||
- | |||
- | $reportdata[] = ""; | ||
- | $reportdata[] = "< | ||
- | |||
- | if (isset($allowed_reports[BySerial][$reportnumber])) { | ||
- | $row = $allowed_reports[BySerial][$reportnumber]; | ||
- | $reportdata[] = "< | ||
- | } else { | ||
- | return " | ||
- | } | ||
- | |||
- | $reportdata[] = "<a id=' | ||
- | $reportdata[] = "< | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | # Tachtler - DISABLED - | ||
- | # default: $reportdata[] = " | ||
- | # $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | |||
- | $reportdata[] = " | ||
- | |||
- | global $mysqli; | ||
- | $sql = " | ||
- | $query = $mysqli-> | ||
- | while($row = $query-> | ||
- | $status=""; | ||
- | if (($row[' | ||
- | $status=" | ||
- | } elseif (($row[' | ||
- | $status=" | ||
- | } elseif (($row[' | ||
- | $status=" | ||
- | } else { | ||
- | $status=" | ||
- | }; | ||
- | |||
- | if ( $row[' | ||
- | $ip = long2ip($row[' | ||
- | } | ||
- | if ( $row[' | ||
- | $ip = inet_ntop($row[' | ||
- | } | ||
- | |||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | # Tachtler - DISABLED - | ||
- | # default: $reportdata[] = " | ||
- | # $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | $reportdata[] = " | ||
- | } | ||
- | $reportdata[] = " | ||
- | $reportdata[] = "</ | ||
- | |||
- | $reportdata[] = "< | ||
- | $reportdata[] = ""; | ||
- | |||
- | #indent generated html by 2 extra spaces | ||
- | return implode(" | ||
- | } | ||
- | </ | ||
- | |||
- | 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: '' | ||
- | <code php> | ||
- | //#################################################################### | ||
- | //### main ########################################################### | ||
- | //#################################################################### | ||
- | |||
- | // The file is expected to be in the same folder as this script, and it | ||
- | // must exist. | ||
- | include " | ||
- | |||
- | // Make a MySQL Connection using mysqli | ||
- | $mysqli = new mysqli($dbhost, | ||
- | if ($mysqli-> | ||
- | echo " | ||
- | echo " | ||
- | echo " | ||
- | exit; | ||
- | } | ||
- | |||
- | define(" | ||
- | define(" | ||
- | define(" | ||
- | |||
- | // 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 = " | ||
- | $sql = " | ||
- | $query = $mysqli-> | ||
- | while($row = $query-> | ||
- | //todo: check ACL if this row is allowed | ||
- | if (true) { | ||
- | //add data by serial | ||
- | $allowed_reports[BySerial][$row[' | ||
- | //make a list of serials by domain and by organisation | ||
- | $allowed_reports[ByDomain][$row[' | ||
- | $allowed_reports[ByOrganisation][$row[' | ||
- | } | ||
- | } | ||
- | | ||
- | if(isset($_GET[' | ||
- | $reportid=$_GET[' | ||
- | }elseif(!isset($_GET[' | ||
- | $reportid=false; | ||
- | }else{ | ||
- | die(' | ||
- | } | ||
- | // Generate Page with report list and report data (if a report is selected). | ||
- | echo tmpl_page( "" | ||
- | .tmpl_reportList($allowed_reports) | ||
- | .tmpl_reportData($reportid, | ||
- | ); | ||
- | ?> | ||
- | </ | ||
===== Test Werkzeuge ===== | ===== Test Werkzeuge ===== |
tachtler/postfix_centos_7_-_opendmarc_anbinden_opendmarc-milter.txt · Zuletzt geändert: 2021/06/12 08:21 von klaus