diff --git a/.env.example b/.env.example index a725958f..acb50c16 100644 --- a/.env.example +++ b/.env.example @@ -66,6 +66,16 @@ LISTEN_ADDR=0.0.0.0 # In Docker = 0.0.0.0, in Bare-Metal-Production = 127 # (ERR_SSL_PROTOCOL_ERROR auf den Assets). HTTPS_ENABLED=false +# SSRF-Schutz: private IP-Ranges (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, +# 192.168.0.0/16, ::1, fc00::/7, localhost) bei Provider/SMTP-Test-Connection +# blockieren. Default `false` damit On-Prem-Setups Plesk/Dovecot/Postfix auf +# 127.0.0.1 oder im internen Netz nutzen können. Für Cloud-Deployments +# (öffentlich erreichbares Backend) auf `true` setzen, sonst kann ein +# eingeloggter Admin via /email-providers/test-connection interne Services +# anpingen. Cloud-Metadata-Endpoints (169.254.169.254 etc.) sind UNABHÄNGIG +# vom Flag immer geblockt. +SSRF_BLOCK_PRIVATE_IPS=false + # ============== ADMINER (DB-UI) ============== # Theme-Auswahl. Verfügbare Designs im offiziellen adminer:latest Image: # adminer-dark, brade, bueltge, dracula, esterka, flat, galkaev, diff --git a/README.md b/README.md index d3c42b9b..7b93d59b 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,25 @@ LISTEN_ADDR=127.0.0.1 CORS_ORIGINS=https://crm.deine-domain.de ``` +### Deployment-Modus: On-Prem vs. Cloud + +OpenCRM ist primär als **On-Prem-Anwendung** designed (eigener Server / VM, +hinter Reverse-Proxy). Für **Cloud-Deployments** (öffentlich erreichbares +Backend, Shared-Infrastructure, Hyperscaler) gibt es einen zusätzlichen +SSRF-Schalter: + +```env +# Cloud-Deploy: zusätzlich alle privaten IP-Ranges für Provider-/SMTP- +# Test-Connection blockieren (127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, +# 192.168.0.0/16, ::1, fc00::/7, localhost). Default false, weil +# On-Prem-Setups oft Plesk/Dovecot auf 127.0.0.1 brauchen. +SSRF_BLOCK_PRIVATE_IPS=true +``` + +Cloud-Metadata-Endpoints (`169.254.169.254`, `metadata.google.internal` etc.) +sind UNABHÄNGIG vom Flag **immer** geblockt – das ist Mindestschutz gegen +AWS/GCP/Azure-IMDS-Diebstahl. + Plus: - **Reverse-Proxy** (Nginx/Plesk) so konfigurieren, dass `X-Forwarded-For` hart auf