Dateien nach "/" hochladen
This commit is contained in:
@@ -0,0 +1,247 @@
|
||||
# SMTPGraphRelay V1
|
||||
|
||||
Ein kleiner nativer Windows-/PowerShell-Relay:
|
||||
|
||||
```text
|
||||
Drucker / NAS / Server / Monitoring
|
||||
|
|
||||
| SMTP (lokal)
|
||||
v
|
||||
SMTPGraphRelay
|
||||
|
|
||||
| HTTPS / OAuth2 / Microsoft Graph
|
||||
v
|
||||
Microsoft 365
|
||||
```
|
||||
|
||||
## Was V1 kann
|
||||
|
||||
- SMTP-Listener auf konfigurierbarer IP / Port
|
||||
- `EHLO`, `HELO`, `MAIL FROM`, mehrere `RCPT TO`, `DATA`, `RSET`, `NOOP`, `QUIT`
|
||||
- IPv4-Allowlist per CIDR
|
||||
- maximale Mailgröße
|
||||
- lokale Store-and-Forward Queue
|
||||
- Retry bei Graph-/Netzwerkfehlern
|
||||
- Failed-Queue nach Max-Retries
|
||||
- Microsoft Graph `sendMail`
|
||||
- MIME-Mail wird als MIME an Graph weitergegeben
|
||||
- App-only OAuth mit Zertifikat
|
||||
- First-Run erzeugt:
|
||||
- selbstsigniertes Zertifikat in `LocalMachine\My`
|
||||
- Entra ID App Registration
|
||||
- Service Principal
|
||||
- Microsoft Graph `Mail.Send` Application Permission
|
||||
- Admin Consent
|
||||
- `config.json`
|
||||
- Windows-Firewallregel
|
||||
- Scheduled Task als `SYSTEM`
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Windows 10/11 oder Windows Server
|
||||
- Windows PowerShell 5.1
|
||||
- PowerShell als Administrator
|
||||
- Internetzugang zu Microsoft Graph / Entra
|
||||
- M365-/Entra-Admin, der App-Registrierungen und App Permissions vergeben darf
|
||||
- bestehendes Exchange-Online-Postfach für den konfigurierten Absender
|
||||
|
||||
## Installation
|
||||
|
||||
1. ZIP entpacken, z. B.:
|
||||
|
||||
```powershell
|
||||
C:\Program Files\SMTPGraphRelay
|
||||
```
|
||||
|
||||
2. Windows PowerShell **als Administrator** öffnen.
|
||||
|
||||
3. Setup starten:
|
||||
|
||||
```powershell
|
||||
Set-ExecutionPolicy -Scope Process Bypass
|
||||
cd "C:\Program Files\SMTPGraphRelay"
|
||||
.\Setup-SMTPGraphRelay.ps1
|
||||
```
|
||||
|
||||
Das Setup fragt u. a.:
|
||||
|
||||
- App-Name
|
||||
- M365-Absenderpostfach
|
||||
- Listen-IP
|
||||
- SMTP-Port
|
||||
- erlaubte Quellnetze
|
||||
|
||||
Danach wird die Entra-App automatisch erstellt.
|
||||
|
||||
## Standard
|
||||
|
||||
Port:
|
||||
|
||||
```text
|
||||
2525/TCP
|
||||
```
|
||||
|
||||
Default-Allowlist:
|
||||
|
||||
```text
|
||||
127.0.0.1/32
|
||||
10.0.0.0/8
|
||||
172.16.0.0/12
|
||||
192.168.0.0/16
|
||||
```
|
||||
|
||||
Der Absender wird standardmäßig immer auf das konfigurierte M365-Postfach umgeschrieben:
|
||||
|
||||
```json
|
||||
"ForceSender": true
|
||||
```
|
||||
|
||||
Das verhindert, dass ein internes Gerät beliebige `From:`-Adressen durchreichen kann.
|
||||
|
||||
## Start / Stop
|
||||
|
||||
Start:
|
||||
|
||||
```powershell
|
||||
Start-ScheduledTask -TaskName "SMTPGraphRelay"
|
||||
```
|
||||
|
||||
Stop:
|
||||
|
||||
```powershell
|
||||
Stop-ScheduledTask -TaskName "SMTPGraphRelay"
|
||||
```
|
||||
|
||||
Status:
|
||||
|
||||
```powershell
|
||||
Get-ScheduledTask -TaskName "SMTPGraphRelay" | Get-ScheduledTaskInfo
|
||||
```
|
||||
|
||||
## Test vom Relay-PC
|
||||
|
||||
Wenn `Send-MailMessage` noch vorhanden ist:
|
||||
|
||||
```powershell
|
||||
Send-MailMessage `
|
||||
-SmtpServer 127.0.0.1 `
|
||||
-Port 2525 `
|
||||
-From "test@local.invalid" `
|
||||
-To "dein.name@example.com" `
|
||||
-Subject "SMTPGraphRelay Test" `
|
||||
-Body "Hallo aus SMTPGraphRelay"
|
||||
```
|
||||
|
||||
Alternativ kann jedes SMTP-Testtool verwendet werden.
|
||||
|
||||
## Verzeichnisse
|
||||
|
||||
```text
|
||||
SMTPGraphRelay\
|
||||
├── SMTPGraphRelay.ps1
|
||||
├── Setup-SMTPGraphRelay.ps1
|
||||
├── config.json
|
||||
├── config.example.json
|
||||
├── queue\
|
||||
├── failed\
|
||||
└── logs\
|
||||
└── SMTPGraphRelay.log
|
||||
```
|
||||
|
||||
## Queue
|
||||
|
||||
Nach vollständigem SMTP-`DATA` wird die Nachricht zunächst lokal gespeichert.
|
||||
|
||||
Erst **danach** bekommt der SMTP-Client:
|
||||
|
||||
```text
|
||||
250 2.0.0 Queued
|
||||
```
|
||||
|
||||
Der Queue-Worker sendet die Nachricht anschließend über Microsoft Graph.
|
||||
|
||||
Standard-Retry:
|
||||
|
||||
```text
|
||||
1 min
|
||||
5 min
|
||||
15 min
|
||||
30 min
|
||||
60 min
|
||||
120 min
|
||||
240 min
|
||||
480 min
|
||||
```
|
||||
|
||||
Nach acht Fehlern wandert die Mail nach `failed`.
|
||||
|
||||
## Sicherheit
|
||||
|
||||
### Kein offenes Relay
|
||||
|
||||
Die SMTP-Seite besitzt eine IP-Allowlist. Bitte die Standard-RFC1918-Netze auf die tatsächlich benötigten Subnetze reduzieren.
|
||||
|
||||
Beispiel:
|
||||
|
||||
```json
|
||||
"AllowedNetworks": [
|
||||
"10.60.10.0/24",
|
||||
"10.20.30.15"
|
||||
]
|
||||
```
|
||||
|
||||
### Kein Client Secret
|
||||
|
||||
Das Setup erzeugt ein nicht exportierbares RSA-Zertifikat in:
|
||||
|
||||
```text
|
||||
Cert:\LocalMachine\My
|
||||
```
|
||||
|
||||
Der Scheduled Task läuft als `SYSTEM` und lädt dieses Zertifikat direkt aus dem Maschinen-Zertifikatsspeicher.
|
||||
|
||||
### Graph-Berechtigung
|
||||
|
||||
Die V1 vergibt ausschließlich:
|
||||
|
||||
```text
|
||||
Microsoft Graph
|
||||
Application
|
||||
Mail.Send
|
||||
```
|
||||
|
||||
Keine `Mail.ReadWrite`, `Directory.Read.All`, SMTP-/IMAP- oder Exchange-Full-Access-Permission ist für den Relaybetrieb nötig.
|
||||
|
||||
**Wichtig:** `Mail.Send` als Application Permission ist grundsätzlich eine weitreichende Berechtigung. Die V1 erzwingt zwar lokal das konfigurierte Senderpostfach, beschränkt die Entra-/Exchange-Berechtigung aber noch nicht serverseitig auf genau dieses Postfach.
|
||||
|
||||
Für eine nächste Version sollte zusätzlich **Exchange Online Application RBAC** bzw. die jeweils aktuelle Microsoft-Methode zur Ressourcenscope-Begrenzung integriert werden.
|
||||
|
||||
## Bekannte Grenzen von V1
|
||||
|
||||
- SMTP-Verbindungen werden seriell verarbeitet
|
||||
- kein SMTP AUTH
|
||||
- kein STARTTLS auf der internen SMTP-Seite
|
||||
- IPv4-Allowlist; IPv6 wird nicht freigegeben
|
||||
- kein Web-/GUI-Frontend
|
||||
- keine DSN/Bounce-Erzeugung
|
||||
- Envelope-Empfänger werden protokolliert; Graph erhält primär die Empfänger aus den MIME-Headern
|
||||
- kein serverseitiges Exchange-Mailbox-Scoping im Setup
|
||||
|
||||
Für typische Drucker, Scanner, NAS, Monitoring- und Server-Alerts sollte diese V1 als Test-/Pilotversion ausreichen.
|
||||
|
||||
## Deinstallation
|
||||
|
||||
Task stoppen/löschen:
|
||||
|
||||
```powershell
|
||||
Stop-ScheduledTask -TaskName "SMTPGraphRelay" -ErrorAction SilentlyContinue
|
||||
Unregister-ScheduledTask -TaskName "SMTPGraphRelay" -Confirm:$false
|
||||
```
|
||||
|
||||
Firewallregel entfernen (Port ggf. anpassen):
|
||||
|
||||
```powershell
|
||||
Remove-NetFirewallRule -DisplayName "SMTPGraphRelay TCP 2525"
|
||||
```
|
||||
|
||||
Die Entra-App und das Zertifikat werden absichtlich **nicht automatisch gelöscht**, damit bei einer Deinstallation keine Cloud-Credentials versehentlich entfernt werden.
|
||||
Reference in New Issue
Block a user