Dateien nach "/" hochladen
This commit is contained in:
@@ -1,104 +1,137 @@
|
||||
# SMTPGraphRelay V1.4 – Zertifikats-Lifecycle
|
||||
# SMTPGraphRelay V1.5 – Log-Rotation
|
||||
|
||||
V1.4 erweitert V1.3 um Zertifikatsüberwachung und sichere Rotation.
|
||||
V1.5 erweitert V1.4 um automatische Log-Rotation und Log-Aufbewahrung.
|
||||
|
||||
## Relay: automatische Zertifikatsüberwachung
|
||||
## Standardverhalten
|
||||
|
||||
Beim Start wird das Zertifikat aus `Graph.CertificateThumbprint` geprüft:
|
||||
Ohne Änderungen an `config.json` gelten:
|
||||
|
||||
- Zertifikat vorhanden
|
||||
- privater Schlüssel vorhanden
|
||||
- Ablaufdatum
|
||||
```text
|
||||
MaxFileSizeMB = 10
|
||||
RetentionDays = 30
|
||||
CleanupHours = 12
|
||||
```
|
||||
|
||||
Standardwerte:
|
||||
Das aktive Log bleibt:
|
||||
|
||||
- Warnung ab 60 Tagen Restlaufzeit
|
||||
- kritisch ab 14 Tagen
|
||||
- erneute Prüfung alle 12 Stunden
|
||||
```text
|
||||
logs\SMTPGraphRelay.log
|
||||
```
|
||||
|
||||
Optional in `config.json`:
|
||||
Sobald es 10 MB erreicht, wird es z. B. umbenannt in:
|
||||
|
||||
```text
|
||||
logs\SMTPGraphRelay-20260813-231500.log
|
||||
```
|
||||
|
||||
Danach wird automatisch eine neue `SMTPGraphRelay.log` begonnen.
|
||||
|
||||
Archiv-Logs, die älter als 30 Tage sind, werden automatisch entfernt.
|
||||
|
||||
## Optionale Konfiguration
|
||||
|
||||
Die bestehende Config funktioniert unverändert.
|
||||
|
||||
Optional kann auf Root-Ebene ergänzt werden:
|
||||
|
||||
```json
|
||||
"Graph": {
|
||||
"TenantId": "...",
|
||||
"ClientId": "...",
|
||||
"CertificateThumbprint": "...",
|
||||
"SenderMailbox": "info@example.com",
|
||||
"ForceSender": true,
|
||||
"CertificateWarningDays": 60,
|
||||
"CertificateCriticalDays": 14,
|
||||
"CertificateCheckHours": 12
|
||||
"Logging": {
|
||||
"MaxFileSizeMB": 10,
|
||||
"RetentionDays": 30,
|
||||
"CleanupHours": 12
|
||||
}
|
||||
```
|
||||
|
||||
Die zusätzlichen Werte sind optional; bestehende Configs funktionieren unverändert.
|
||||
Beispiel:
|
||||
|
||||
## Rotation
|
||||
|
||||
`Renew-SMTPGraphRelayCertificate.ps1` muss als Administrator mit
|
||||
**Windows PowerShell 5.1** ausgeführt werden.
|
||||
|
||||
```powershell
|
||||
cd "C:\Program Files\SMTPGraphRelay"
|
||||
.\Renew-SMTPGraphRelayCertificate.ps1
|
||||
```json
|
||||
{
|
||||
"Smtp": {
|
||||
"ListenAddress": "0.0.0.0",
|
||||
"Port": 2525,
|
||||
"Hostname": "SMTPRELAY01",
|
||||
"AllowedNetworks": [
|
||||
"127.0.0.1/32",
|
||||
"10.0.0.0/8"
|
||||
],
|
||||
"MaxMessageSizeMB": 25,
|
||||
"ClientTimeoutSeconds": 120,
|
||||
"MaxConcurrentClients": 20
|
||||
},
|
||||
"Graph": {
|
||||
"TenantId": "...",
|
||||
"ClientId": "...",
|
||||
"CertificateThumbprint": "...",
|
||||
"SenderMailbox": "info@example.com",
|
||||
"ForceSender": true
|
||||
},
|
||||
"Queue": {
|
||||
"PollSeconds": 10,
|
||||
"MaxRetries": 8,
|
||||
"RetryMinutes": [1,5,15,30,60,120,240,480]
|
||||
},
|
||||
"Paths": {
|
||||
"Queue": "queue",
|
||||
"Failed": "failed",
|
||||
"Logs": "logs"
|
||||
},
|
||||
"Logging": {
|
||||
"MaxFileSizeMB": 10,
|
||||
"RetentionDays": 30,
|
||||
"CleanupHours": 12
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Ablauf:
|
||||
## Parallel-sicher
|
||||
|
||||
1. bestehende Config lesen
|
||||
2. neues nicht exportierbares Zertifikat in `LocalMachine\My` erzeugen
|
||||
3. Entra-Admin interaktiv anmelden
|
||||
4. bestehende App über ihre ClientId finden
|
||||
5. neues Zertifikat **zusätzlich** in `keyCredentials` hinterlegen
|
||||
6. App-only Login mit dem neuen Zertifikat testen
|
||||
7. erst danach `config.json` atomar auf den neuen Thumbprint umstellen
|
||||
8. Relay-Scheduled-Task neu starten
|
||||
9. optional altes Cloud- und lokales Zertifikat entfernen
|
||||
|
||||
Exchange Application RBAC muss nicht neu aufgebaut werden, weil die App/ClientId
|
||||
bei der Rotation unverändert bleibt.
|
||||
|
||||
## Warum das alte Zertifikat zunächst erhalten bleibt
|
||||
|
||||
Die sichere Reihenfolge ist:
|
||||
V1.5 verwendet weiterhin den benannten Mutex:
|
||||
|
||||
```text
|
||||
OLD funktioniert
|
||||
|
|
||||
NEW erzeugen
|
||||
|
|
||||
OLD + NEW in Entra
|
||||
|
|
||||
NEW Auth testen
|
||||
|
|
||||
Config -> NEW
|
||||
|
|
||||
Relay neu starten
|
||||
|
|
||||
erst dann optional OLD entfernen
|
||||
Local\SMTPGraphRelay-Log
|
||||
```
|
||||
|
||||
So gibt es während der Rotation keinen Zeitpunkt ohne gültiges Credential und ein
|
||||
Rollback bleibt möglich.
|
||||
Rotation und Schreiben passieren innerhalb desselben Locks. Dadurch können parallele
|
||||
SMTP-Runspaces und der Queue-/Graph-Worker nicht gleichzeitig dieselbe Logdatei
|
||||
rotieren oder beschreiben.
|
||||
|
||||
## Update von V1.3
|
||||
|
||||
Task stoppen:
|
||||
## Update von V1.4
|
||||
|
||||
```powershell
|
||||
Stop-ScheduledTask -TaskName "SMTPGraphRelay"
|
||||
|
||||
Copy-Item `
|
||||
"C:\Program Files\SMTPGraphRelay\SMTPGraphRelay.ps1" `
|
||||
"C:\Program Files\SMTPGraphRelay\SMTPGraphRelay-V1.4-backup.ps1"
|
||||
```
|
||||
|
||||
V1.3 sichern und V1.4 als `SMTPGraphRelay.ps1` ablegen, dann:
|
||||
Dann V1.5 als:
|
||||
|
||||
```text
|
||||
C:\Program Files\SMTPGraphRelay\SMTPGraphRelay.ps1
|
||||
```
|
||||
|
||||
ablegen und:
|
||||
|
||||
```powershell
|
||||
Start-ScheduledTask -TaskName "SMTPGraphRelay"
|
||||
```
|
||||
|
||||
Die `config.json` muss nicht geändert werden.
|
||||
|
||||
Im Log erscheint bei einem gesunden Zertifikat beim Start beispielsweise:
|
||||
Im Log sollte beim Start u. a. erscheinen:
|
||||
|
||||
```text
|
||||
Graph-Zertifikat gültig bis 2028-08-13 23:00:00 (729 Tage verbleibend).
|
||||
SMTPGraphRelay V1.5 gestartet ...
|
||||
Log-Rotation: max. 10 MB pro Datei, Aufbewahrung 30 Tage.
|
||||
```
|
||||
|
||||
## Hinweis
|
||||
|
||||
Nur archivierte Dateien im Muster
|
||||
|
||||
```text
|
||||
SMTPGraphRelay-*.log
|
||||
```
|
||||
|
||||
werden automatisch gelöscht.
|
||||
|
||||
Die aktuell aktive `SMTPGraphRelay.log` wird nie durch die Retention-Regel gelöscht.
|
||||
|
||||
Reference in New Issue
Block a user