Exchange-Journaling
Was Journaling macht
Abschnitt betitelt „Was Journaling macht“Eine Journalregel in Exchange Online schickt eine Kopie jeder Nachricht, einen Journal-Report, an eine Adresse, die Restow kontrolliert, bevor der Nutzer die Nachricht im Postfach verändern oder löschen kann. Restow archiviert die Originalnachricht byte-genau zusammen mit dem Umschlag, einschließlich der BCC-Empfänger, die nur der Umschlag zeigt. Diese Kopie, die entsteht, bevor jemand die Mail anfassen kann, ist der Grund, warum Journaling der primäre Erfassungsweg des Archivs ist. Das Gesamtbild steht unter Archivierung und Journaling und Archivierung. Restow ist für den GoBD-konformen Einsatz ausgelegt; ob Ihre Einrichtung Ihre Pflichten erfüllt, bestätigt Ihre Steuerberatung.
Jeder Mandant hat eine eigene Journal-Adresse. Mandanten-Administrationen sehen sie auf der Seite Archiv unter Exchange-Journaling, zusammen mit dem Status und einer kurzen Einrichtungsanleitung, die hierher verweist.
Zwei Seiten sind beteiligt:
- Sie als Betreiber der Restow-Installation richten Empfänger, DNS, Port 25 und das TLS-Zertifikat ein (Abschnitte 1 und 2).
- Die Microsoft-365-Administration des Kunden legt Connector und Journalregel an (Abschnitt 4).
1. Empfänger einrichten (Betreiber)
Abschnitt betitelt „1. Empfänger einrichten (Betreiber)“-
Tragen Sie in der
.envdes Release-Stacks ein:Terminal-Fenster JOURNAL_SMTP_PORT=25JOURNAL_SMTP_BIND=0.0.0.0JOURNAL_HOSTNAME=archive.example.comJOURNAL_HOSTNAMEist nur der Hostname: ohne Schema, Pfad, Port und Mailadresse.JOURNAL_SMTP_BIND=0.0.0.0veröffentlicht den Port auf jeder Adresse des Hosts. Ohne diese Angabe bildet der Release-Stack den Port nur auf dem Loopback-Interface ab, und Exchange Online kann ihn nicht erreichen. -
Veröffentlichen Sie den Hostnamen im DNS: ein A- oder AAAA-Eintrag, der auf diesen Server zeigt, oder ein MX-Eintrag auf einen Host, der einen hat. Die Domain der Journal-Adresse darf keine akzeptierte Domäne des Microsoft-365-Mandanten sein.
-
Öffnen Sie TCP-Port 25 eingehend aus dem Internet. Exchange Online stellt ausschließlich an Port 25 zu und muss den Empfänger direkt erreichen, nicht über Caddy. Lauscht der Empfänger auf einem anderen Port (
JOURNAL_SMTP_PORT), leiten Sie Port 25 der öffentlichen Adresse auf diesen Port weiter. -
Legen Sie das TLS-Zertifikat bereit (nächster Abschnitt) und starten Sie dann die Rolle
apineu. Der Empfänger liest Port, Edition und Zertifikat beim Start.
Restow kann DNS und Erreichbarkeit von außen nicht prüfen. Die Archiv-Seite zeigt deshalb nur, was sich aus der Konfiguration ergibt (Port, TLS, Hostname) und was tatsächlich angekommen ist.
2. TLS-Zertifikat
Abschnitt betitelt „2. TLS-Zertifikat“Exchange Online stellt Journal-Reports nur über TLS zu: Der Connector steht auf „TLS immer“. Der Empfänger startet deshalb nur mit einem eigenen Zertifikat und nimmt nie Mail ohne TLS an. Er verwendet nie das Testzertifikat, das die SMTP-Bibliothek mitbringt. Dessen privater Schlüssel ist öffentlich bekannt, eine damit „verschlüsselte“ Verbindung schützt also nichts und sieht trotzdem geschützt aus.
Dateien und Anforderungen
JOURNAL_TLS_CERT_PATH: die Zertifikatskette, PEM, Blatt zuerst.JOURNAL_TLS_KEY_PATH: der private Schlüssel, PEM, nicht mit einer Passphrase verschlüsselt.- Beide müssen gesetzt sein. Das Zertifikat muss von einer öffentlich vertrauten Stelle stammen und zu
JOURNAL_HOSTNAMEpassen, sonst weist Exchange Online die Zustellung ab.
Im Release-Stack
Das Verzeichnis JOURNAL_TLS_DIR (Standard ./journal-tls neben der docker-compose.yml) ist schreibgeschützt im Container api unter /etc/restow/journal-tls eingehängt. Eingehängt ist das Verzeichnis, nicht zwei einzelne Dateien, damit ein Erneuerungsclient, der Dateien ersetzt, bemerkt wird. Legen Sie fullchain.pem und privkey.pem dorthin und setzen Sie:
JOURNAL_TLS_CERT_PATH=/etc/restow/journal-tls/fullchain.pemJOURNAL_TLS_KEY_PATH=/etc/restow/journal-tls/privkey.pemWoher das Zertifikat kommt
-
Derselbe Host wie die App (
JOURNAL_HOSTNAMEgleichRESTOW_APP_DOMAIN): Kopieren Sie das Zertifikat, das der Caddy des Stacks ohnehin hält. Caddy erneuert rund 30 Tage vor Ablauf, und der Empfänger übernimmt die Kopie selbst. Ein täglicher Cron-Job im Verzeichnis derdocker-compose.ymlgenügt:Terminal-Fenster docker compose exec caddy ls /data/caddy/certificates # Verzeichnis der CA ermittelndocker compose cp "caddy:/data/caddy/certificates/<CA-Verzeichnis>/<host>/<host>.crt" ./journal-tls/fullchain.pemdocker compose cp "caddy:/data/caddy/certificates/<CA-Verzeichnis>/<host>/<host>.key" ./journal-tls/privkey.pemFür einen anderen Hostnamen hält Caddy kein Zertifikat.
-
Ein anderer Hostname: Stellen Sie das Zertifikat auf dem Host mit einem anderen ACME-Client aus (certbot, acme.sh, lego). Nutzen Sie die DNS-Challenge, weil Caddy Port 80 belegt. Ein Deploy-Hook kopiert die Dateien mit
cp -LnachJOURNAL_TLS_DIR, sodass Sie die Dateien kopieren und nicht die Symlinks aus dem Verzeichnislive/von certbot:Terminal-Fenster cp -L /etc/letsencrypt/live/archive.example.com/fullchain.pem ./journal-tls/fullchain.pemcp -L /etc/letsencrypt/live/archive.example.com/privkey.pem ./journal-tls/privkey.pem
Prüfung beim Start
Beide Dateien müssen lesbar und PEM sein, der Schlüssel muss zum Zertifikat gehören, und das Zertifikat muss gültig und nicht abgelaufen sein. Sonst startet kein Listener, und Port 25 bleibt zu. Die Archiv-Seite zeigt Empfänger läuft nicht mit einem von drei Gründen, und das API-Log nennt die Datei:
- kein TLS-Zertifikat konfiguriert (
tls_not_configured), - Zertifikat oder Schlüssel nicht verwendbar (
tls_invalid), - Zertifikat abgelaufen (
tls_expired).
Die API läuft weiter. Starten Sie sie neu, nachdem Sie die Dateien behoben haben.
STARTTLS ist Pflicht
Mit Zertifikat bietet der Empfänger STARTTLS an (mindestens TLS 1.2) und weist jede Sitzung, die nicht umgestellt hat, bei MAIL FROM mit 530 Must issue a STARTTLS command first ab. Weder ein Empfänger noch ein Nachrichtenkörper wird im Klartext angenommen.
Erneuerung ohne Neustart
Die API liest beide Dateien alle fünf Minuten neu und verwendet ein neues Zertifikat für neue Sitzungen, sobald Zertifikat und Schlüssel zusammen gültig sind. Ein halb geschriebener oder kaputter Austausch ändert nichts: Der Empfänger bleibt beim bisherigen Zertifikat, und das API-Log sagt es. Läuft das Zertifikat ab, ohne dass ein gültiger Ersatz da ist, wechselt der Status auf „Zertifikat abgelaufen“ und zurück, sobald die Dateien erneuert sind.
Nur lokale Entwicklung
JOURNAL_ALLOW_INSECURE=true startet den Empfänger ohne Zertifikat und ohne STARTTLS anzubieten. Exchange Online stellt an so einen Empfänger nicht zu, und Mail liefe unverschlüsselt durchs Netz. Nie in Produktion. Die Option gilt nur, solange kein Zertifikat konfiguriert ist: Ein konfiguriertes, aber kaputtes Zertifikat führt nie zu Klartext.
3. Die Journal-Adresse und ihr Status
Abschnitt betitelt „3. Die Journal-Adresse und ihr Status“Die Adresse lautet journal+<token>@<Journal-Host>. Der Token ist je Mandant zufällig: 32 Zeichen, nur Kleinbuchstaben und Ziffern, weil Mailsysteme die Groß-/Kleinschreibung des lokalen Teils nicht zuverlässig erhalten. Die erste Ansicht des Abschnitts erzeugt die Adresse und schreibt archive.journal.address_created ins Audit-Log. Ist JOURNAL_HOSTNAME nicht gesetzt oder ungültig, zeigt Restow keine vollständige Adresse und sagt das ausdrücklich.
| Status | Bedeutung |
|---|---|
| Empfang läuft | Der Empfänger lauscht, und der letzte Report ist höchstens 24 Stunden alt. |
| Seit mehr als 24 Stunden kein Report | Es kamen Reports, aber keine mehr. Bei einem Mandanten mit Mailverkehr ist das ein Fehler auf dem Weg: Connector, Regel, Firewall oder Zertifikat. |
| Noch keine Reports | Der Empfänger lauscht, es ist nichts angekommen. |
| Empfänger läuft nicht | Wird mit einem Grund angezeigt. Siehe Fehlerbehebung. |
Der Zeitpunkt des letzten Reports und die Zähler für 24 Stunden und 7 Tage kommen aus dem Archiv selbst, nicht aus einem eigenen Zähler.
4. Microsoft 365 (Administration des Kunden)
Abschnitt betitelt „4. Microsoft 365 (Administration des Kunden)“- Connector. Öffnen Sie im Exchange Admin Center E-Mail-Fluss, dann Connectors, und fügen Sie einen Connector von Office 365 zu Partnerorganisation hinzu. Nutzen Sie ihn nur für E-Mail an die Domäne des Journal-Hosts, leiten Sie über den Journal-Host als Smarthost, und stellen Sie ihn auf TLS immer mit dem Zertifikat einer vertrauenswürdigen Stelle, deren Name passt. Überprüfen Sie den Connector: Microsoft fragt nach einer Adresse, tragen Sie die Journal-Adresse ein. Die Testmail kommt als nicht lesbarer Journal-Report an und wird mit der Markierung „Journal-Report konnte nicht gelesen werden“ (
report-unparseable) archiviert. Das ist erwartet. - Postfach für nicht zustellbare Journalberichte. Öffnen Sie im Microsoft-Purview-Portal Datenlebenszyklusverwaltung, dann Exchange (Legacy), dann Journalregeln. Tragen Sie unter Nicht zustellbare Journalberichte senden an ein echtes Postfach ein, das jemand liest, zum Beispiel ein freigegebenes Postfach. Dorthin schickt Exchange Online Reports, die nicht a Restow zugestellt werden konnten, hier fällt also eine Lücke auf.
- Journalregel. Legen Sie auf derselben Seite eine Regel an, die Journalberichte an die Journal-Adresse sendet, für Nachrichten von oder an alle, vom Typ Alle Nachrichten (intern, extern und BCC). Schalten Sie die Regel ein.
- Test. Senden Sie eine Nachricht innerhalb der Organisation. Der Report kommt meist innerhalb weniger Minuten an. Der Status auf der Archiv-Seite wechselt auf Empfang läuft, die Nachricht steht in der Archivsuche mit der Quelle Exchange-Online-Journal, und die Kettenprüfung bleibt intakt.
5. Adresse erneuern
Abschnitt betitelt „5. Adresse erneuern“Adresse erneuern auf der Archiv-Seite (mit Rückfrage) erzeugt einen neuen Token. Die alte Adresse ist sofort ungültig: Der Empfänger löst den Token bei jedem RCPT TO in der Datenbank auf und weist die alte Adresse mit 550 ab. Ändern Sie den Empfänger der Journalregel und die Adresse, mit der Sie den Connector überprüft haben, sofort auf die neue Adresse. Bis dahin werden Reports abgewiesen und nicht archiviert, und Exchange Online schickt sie an das Postfach für nicht zustellbare Journalberichte.
Anlass sind ein offengelegter Token oder ein Wechsel des Journal-Hosts. Das Audit-Log hält archive.journal.address_created und archive.journal.address_rotated mit einem Fingerabdruck des Tokens fest, nie mit dem Token selbst.
6. Grenzen
Abschnitt betitelt „6. Grenzen“- Journaling erfasst ab dem Moment, in dem die Regel eingeschaltet ist. Was vorher im Postfach lag, kommt über den Graph-Sync ins Archiv und ist als nachträglich erfasst markiert.
- Restow prüft DNS und Erreichbarkeit von außen nicht, nur was die Konfiguration zeigt und was angekommen ist.
- Die Prüfung des Absenders (SPF, Microsoft-Adressbereiche) ist noch nicht umgesetzt. Der Empfänger nimmt nur bekannte Journal-Adressen an, begrenzt die Rate je Absender-IP-Adresse und begrenzt die Größe.
- Reports bis
JOURNAL_MAX_SIZE_MB(Standard 150 MB) werden angenommen. Größere Reports werden abgewiesen. - Der Empfänger verlangt STARTTLS und startet nicht ohne gültiges Zertifikat (siehe TLS-Zertifikat).
Fehlerbehebung
Abschnitt betitelt „Fehlerbehebung“- Der Status lautet „Empfänger läuft nicht“. Die Seite nennt den Grund.
JOURNAL_SMTP_PORTnicht gesetzt: auf25setzen und dieapineu starten. Die Lizenz enthält den Empfänger, aber dieapistartete vor der Installation des Schlüssels: neu starten. Der Listener konnte nicht starten (Port belegt, keine Berechtigung für Port 25): Das API-Log nennt die Ursache. Kein Zertifikat, Zertifikat nicht verwendbar oder abgelaufen: siehe TLS-Zertifikat. In diesem Prozess nicht gestartet: Seite neu laden, dann dieapineu starten und ihr Log lesen. - „Noch keine Reports“, obwohl die Regel eingeschaltet ist. Prüfen Sie in dieser Reihenfolge: DNS für den Hostnamen, TCP-Port 25 aus dem Internet erreichbar (Firewall, Portweiterleitung,
JOURNAL_SMTP_BIND=0.0.0.0), den Connector (nur für die Journal-Domäne, Journal-Host als Smarthost, TLS immer) und ob die Journalregel eingeschaltet ist. Überprüfen Sie den Connector erneut mit der Journal-Adresse. - Exchange Online meldet einen TLS- oder Zertifikatsfehler. Das Zertifikat muss von einer öffentlich vertrauten Stelle stammen, zu
JOURNAL_HOSTNAMEpassen und als vollständige Kette geliefert werden, Blatt zuerst. Ein selbstsigniertes Zertifikat wird abgewiesen. - „Seit mehr als 24 Stunden kein Report“. Sehen Sie zuerst im Postfach für nicht zustellbare Journalberichte nach: Was dort liegt, wurde nicht a Restow zugestellt. Prüfen Sie danach Zertifikatsablauf, Firewall und Journalregel.
- Reports werden mit
550abgewiesen. Die Journal-Adresse ist unbekannt. Meist wurde sie erneuert, und die Journalregel nennt noch die alte, oder die Adresse hat einen Tippfehler. - Reports werden mit
552abgewiesen. Ein Report ist größer alsJOURNAL_MAX_SIZE_MB. 530 Must issue a STARTTLS command first. Der Absender hat kein TLS verwendet. Der Exchange-Online-Connector muss auf TLS immer stehen.
Siehe auch Umgebungsvariablen und Ports und Rollen.