Cloudflare Access¶
Cloudflare Access ist ein Zero-Trust-Authentifizierungsdienst, der die easySale-Dokumentation vor unberechtigtem Zugriff schützt – ohne eigenes Login-System, ohne Passwörter, nur E-Mail + One-Time-PIN.
Auf einen Blick
- Kostenlos bis 50 Benutzer/Monat
- Keine Passwörter – Login per E-Mail-OTP
- Automatisches Setup für Client-Projekte vorhanden
- DSGVO-konform und mit Audit-Logs
1. Grundlagen¶
Was ist Cloudflare Access?¶
Cloudflare Access fungiert als Login-Gateway vor jeder geschützten Domain. Benutzer müssen sich authentifizieren, bevor die Dokumentation ausgeliefert wird.
Authentifizierungs-Flow¶
1. Benutzer öffnet docs.easysale.de
↓
2. Cloudflare Access Login-Seite
↓
3. E-Mail-Adresse eingeben
↓
4. One-Time-PIN (OTP) per E-Mail
↓
5. Session aktiv (Standard: 24h)
↓
6. Zugriff auf Dokumentation ✅
Vorteile¶
| Vorteil | Bedeutung |
|---|---|
| Kein eigenes Login-System | Weniger Code, weniger Angriffsfläche |
| Keine Passwörter | Kein Passwort-Reset, kein Credential-Leak |
| Granulare Policies | Pro Domain / Client individuell |
| Audit-Logs | Compliance-fähig |
| Free Plan | Bis 50 User kostenlos |
2. Ersteinrichtung (einmalig)¶
Wann brauche ich das?
Nur beim erstmaligen Aufsetzen der Hauptdomain docs.easysale.de. Für Client-Subdomains gibt es eine automatisierte Lösung (siehe Abschnitt 4).
2.1 Voraussetzungen¶
- Cloudflare Account mit aktiviertem Zero Trust
- Cloudflare Pages Projekt angelegt
- Custom Domain konfiguriert
2.2 Zero Trust aktivieren¶
- one.dash.cloudflare.com öffnen
- Falls noch nicht aktiv: „Get started" → Free Plan
- Team-Domain wählen (z. B.
tech-schuppen.cloudflareaccess.com)
2.3 Access Applications anlegen¶
Es werden zwei separate Access-Applications benötigt – eine pro Doku-Site:
App 1 – Entwickler-Handbuch (docs.easysale.de)¶
Access → Applications → „Add an application" → „Self-hosted"
| Feld | Wert |
|---|---|
| Application name | easySale Entwickler-Handbuch |
| Session duration | 24 hours |
| Application domain | docs.easysale.de |
Policy – Action: ✅ Allow
| Regel | Typ | Wert |
|---|---|---|
| Team | Emails ending in | @tech-schuppen.de |
Restriktiv: nur das interne Team. Keine Kunden.
App 2 – Benutzer-Handbuch (handbuch.easysale.de)¶
Access → Applications → „Add an application" → „Self-hosted"
| Feld | Wert |
|---|---|
| Application name | easySale Benutzer-Handbuch |
| Session duration | 24 hours |
| Application domain | handbuch.easysale.de |
Policy – Action: ✅ Allow
| Regel | Typ | Wert |
|---|---|---|
| Team | Emails ending in | @tech-schuppen.de |
| Kunden | Emails | kunde@beispiel.de, partner@firma.at |
| Kundendomäne (optional) | Emails ending in | @kunde-firma.de |
Rule Connection: OR – jede Regel erlaubt separat Zugang.
Locker: Team und Kunden. Kunden sehen ausschließlich das Benutzer-Handbuch.
2.4 Trennung verstehen¶
| Wer | docs.easysale.de (Entwickler) |
handbuch.easysale.de (Benutzer) |
|---|---|---|
dev@tech-schuppen.de |
✅ Zugriff | ✅ Zugriff |
kunde@firma.de |
❌ Access Denied | ✅ Zugriff |
| Unbekannte E-Mail | ❌ kein OTP | ❌ kein OTP |
Da es zwei eigenständige MkDocs-Builds und zwei Cloudflare-Pages-Projekte gibt, sind die Inhalte physisch getrennt – Kunden können Entwickler-URLs nicht erraten, weil sie auf der Kunden-Site gar nicht existieren.
2.5 Speichern¶
„Save application" → Access ist sofort aktiv.
3. Nutzung & Tests¶
Zugriff testen¶
https://docs.easysale.deim Inkognito-Fenster öffnen- E-Mail-Adresse eingeben → OTP-Code aus Postfach eingeben
- Zugriff erhalten ✅
Erwartetes Verhalten¶
- ✅ OTP-Code wird gesendet
- ✅ Zugriff gewährt
- ✅ Session 24 h aktiv
- ❌ Kein OTP-Code
- ❌ Fehlermeldung „Access Denied"
Aktive Sessions einsehen¶
Zero Trust Dashboard → Logs → Access → Filter auf Application
4. Automatisiertes Client-Setup¶
Für neue Kundenprojekte gibt es ein Skript, das Pages, Custom Domain und Access Policy in einem Rutsch anlegt.
4.1 Skript ausführen¶
cd onboarding/client_onboarding/steps/setup
CLIENT_DIR=/path/to/easysale-client-foo \
CLIENT_NAME="Foo GmbH" \
CLIENT_EMAILS="kunde@foo.de,support@foo.de" \
CLOUDFLARE_API_TOKEN="xxx" \
CLOUDFLARE_ACCOUNT_ID="yyy" \
./06_setup_cloudflare_access.sh
Credentials via Org Secrets
Wenn CLOUDFLARE_API_TOKEN und CLOUDFLARE_ACCOUNT_ID als GitHub Org Secrets gesetzt sind, werden sie automatisch geladen – keine Angabe in der Kommandozeile nötig.
4.2 Was das Skript erledigt¶
| Schritt | Ergebnis |
|---|---|
| Pages-Projekt anlegen | easysale-{slug}-docs |
| Fallback-Domain | easysale-{slug}-docs.pages.dev |
| Custom Domain | {slug}-docs.easysale.de |
| Access Application | {Client Name} Documentation |
| Access Policies | @tech-schuppen.de + alle CLIENT_EMAILS |
| GitHub Variable | CLOUDFLARE_PAGES_PROJECT für CI/CD |
4.3 Nach dem Skript: DNS setzen (Strato)¶
Das Skript gibt den benötigten CNAME-Eintrag aus. Beispiel:
4.4 Deployment auslösen¶
4.5 Vollständiges Beispiel¶
Client „Gemüsebau Steiner" – komplettes Setup
Aufruf:
CLIENT_DIR=../easysale-client-gemuesebau-steiner \
CLIENT_NAME="Gemüsebau Steiner" \
CLIENT_EMAILS="info@gemuesebau-steiner.at,buchhaltung@gemuesebau-steiner.at" \
./06_setup_cloudflare_access.sh
Ergebnis:
Project name: easysale-gemuesebau-steiner-docs
Fallback-Domain: easysale-gemuesebau-steiner-docs.pages.dev
Custom-Domain: gemuesebau-steiner-docs.easysale.de
Access Policy:
- @tech-schuppen.de
- info@gemuesebau-steiner.at
- buchhaltung@gemuesebau-steiner.at
DNS bei Strato:
Testen:
5. Benutzer verwalten¶
Hinzufügen¶
Alle @tech-schuppen.de-Adressen haben automatisch Zugang – keine Einzelpflege.
- Access → Applications → App auswählen → Edit
- Policies → Rule
Emails→ Adresse ergänzen - Save policy
Entfernen¶
- Access → Applications → App → Policies
- Adresse aus der Liste löschen
- Save policy
Session läuft weiter
Bereits angemeldete Benutzer bleiben bis zum Session-Ende (24 h) eingeloggt. Für sofortigen Entzug: Session manuell über Logs → Access → Revoke beenden.
6. Erweiterte Policies¶
Session-Dauer anpassen¶
Access → Applications → App → Session duration
| Anwendungsfall | Empfehlung |
|---|---|
| Interne Team-Docs | 7 days |
| Kunden-Docs | 24 hours (Standard) |
| Hochsensible Docs | 1 hour |
Weitere Rule-Typen¶
| Rule Type | Wert | Effekt |
|---|---|---|
IP ranges |
203.0.113.0/24 |
Nur aus IP-Bereich |
Country |
AT, DE, CH |
Nur aus DACH |
Kombination (AND) |
Domain + Country | Strenger Zugriff |
Beispiel – nur Team aus Österreich:
7. Audit & Compliance¶
Zugriffsprotokolle¶
Zero Trust → Logs → Access
| Information | Details |
|---|---|
| Benutzer-E-Mail | Wer hat zugegriffen |
| Zeitstempel | Wann |
| IP-Adresse | Von wo |
| User-Agent | Welcher Browser |
| Land | Geo-Lokation |
| Erfolg/Fehler | Status |
Aufbewahrung: Free Plan 24 h, Paid Plans 30+ Tage.
DSGVO¶
- E-Mail-Adressen zur Authentifizierung
- IP-Adressen für Security-Logs (24 h)
- Cloudflare ist GDPR-konform zertifiziert
Baustein für die Datenschutzerklärung
8. Troubleshooting¶
OTP-E-Mail kommt nicht an
- Spam-Ordner prüfen (Absender:
no-reply@cloudflareaccess.com) - Policy kontrollieren – E-Mail/Domain wirklich erlaubt?
- E-Mail-Server →
cloudflareaccess.comauf Whitelist
„Access Denied" trotz korrekter E-Mail
- Policy-Rules verifizieren (Access → Applications → Policies)
- Tippfehler prüfen
- Inkognito-Fenster / Browser-Cache leeren
Session läuft zu früh ab
Ursache: Browser löscht Cookies oder „Do Not Track" aktiv.
Lösung: Cookies für cloudflareaccess.com erlauben.
Rate limit exceeded
- 15 Minuten warten
- Bei dauerhaftem Problem: Support für höhere Limits kontaktieren
9. Kosten¶
- ✅ Bis zu 50 Benutzer/Monat
- ✅ Unbegrenzte Applications
- ✅ E-Mail-OTP Authentication
- ✅ 24 h Log-Retention
Ausreichend für: Interne Docs, kleine bis mittlere Kundenbasis.
- Mehr als 50 Benutzer
- Extended Log-Retention (30+ Tage)
- SAML / OIDC Integration
- Multi-Factor Authentication (Hardware-Keys)
- SLA & Support
10. Best Practices¶
Security¶
- Policy-Reviews – vierteljährlich Benutzer prüfen, Ausgeschiedene entfernen
- Session-Dauer – nicht länger als nötig; sensible Docs ≤ 8 h
- Admin-Zugriff – Cloudflare Dashboard nur von Firmen-IP
Monitoring¶
- Alerts: Zero Trust → Logs → Configure Alerts → z. B. >10 Fehllogins/Stunde
- Log-Reviews: wöchentlich auf ungewöhnliche Muster prüfen (Geo, Zeit)
Onboarding-Template¶
E-Mail an neuen Benutzer
Weiterführende Links¶
Cloudflare Access¶
Cloudflare Access ist ein Zero-Trust-Authentifizierungsdienst, der die easySale-Dokumentation vor unberechtigtem Zugriff schützt.
Übersicht¶
Was ist Cloudflare Access?
Cloudflare Access fungiert als Login-Gateway vor der Dokumentation. Benutzer müssen sich authentifizieren, bevor sie Zugriff erhalten.
Funktionsweise:
1. Benutzer öffnet docs.easysale.de
↓
2. Cloudflare Access Login-Bildschirm erscheint
↓
3. Benutzer gibt E-Mail-Adresse ein
↓
4. One-Time-PIN (OTP) wird per E-Mail gesendet
↓
5. Nach Code-Eingabe: Session aktiv (24h)
↓
6. Zugriff auf Dokumentation gewährt ✅
Vorteile:
- ✅ Kein eigenes Login-System erforderlich
- ✅ Keine Passwörter - nur E-Mail + OTP
- ✅ Granulare Zugriffskontrolle
- ✅ Audit-Logs für Compliance
- ✅ Kostenlos bis 50 Benutzer/Monat
Ersteinrichtung¶
Voraussetzungen¶
- Cloudflare Account mit aktiviertem Zero Trust
- Cloudflare Pages Projekt ist erstellt
- Custom Domain ist konfiguriert
Schritt 1: Zero Trust aktivieren¶
- Öffnen Sie one.dash.cloudflare.com
- Falls noch nicht aktiviert: "Get started" klicken
- Free Plan auswählen
- Team-Domain wählen (z.B.
tech-schuppen.cloudflareaccess.com) - Diese Domain wird für den Login verwendet
- Ist nicht öffentlich sichtbar
Schritt 2: Access Application erstellen¶
- Zero Trust Dashboard → Access → Applications
- "Add an application" klicken
- "Self-hosted" auswählen
Schritt 3: Application konfigurieren¶
Basic Configuration:
| Feld | Wert |
|---|---|
| Application name | easySale Documentation |
| Session duration | 24 hours |
| Application domain | docs.easysale.de |
Optional: - Application logo: Upload eines Logos (wird beim Login angezeigt) - App Launcher visibility: Visible (zeigt App im User-Portal)
Schritt 4: Access Policy erstellen¶
Policy Name: Tech-Schuppen Team & Authorized Clients
Action: ✅ Allow
Configure rules:
Rule 1 - Tech-Schuppen Team¶
Rule 2 - Spezifische Kunden (optional)¶
Rule Connection: OR (Standard)
→ Jede Regel erlaubt separat Zugang
Schritt 5: Speichern & Aktivieren¶
- "Save application" klicken
- Access ist sofort aktiv ✅
Zugriff testen¶
Test-Prozedur¶
- Öffnen Sie
https://docs.easysale.dein einem Inkognito-Fenster - Sie werden zur Cloudflare Access Login-Seite weitergeleitet
- Geben Sie eine erlaubte E-Mail-Adresse ein
- Prüfen Sie Ihr E-Mail-Postfach für den OTP-Code
- Nach Code-Eingabe: Zugriff auf die Dokumentation ✅
Erwartetes Verhalten¶
Erlaubte E-Mail (@tech-schuppen.de): - ✅ OTP-Code wird gesendet - ✅ Zugriff wird gewährt - ✅ Session bleibt 24 Stunden aktiv
Nicht erlaubte E-Mail: - ❌ Kein OTP-Code wird gesendet - ❌ Zugriff wird verweigert - ❌ Fehlermeldung: "Access Denied"
Benutzer verwalten¶
Neuen Benutzer hinzufügen¶
Option 1: Domain-basiert (empfohlen für Team)¶
Option 2: Spezifische E-Mail-Adresse¶
- Access → Applications →
easySale Documentation→ Edit - Policies → Policy bearbeiten
- Add include → Rule type:
Emails - E-Mail-Adresse eingeben (z.B.
kunde@beispiel.de) - Save policy
Benutzer entfernen¶
- Access → Applications →
easySale Documentation→ Edit - Policies → Policy bearbeiten
- E-Mail-Adresse aus der Liste entfernen
- Save policy
Session-Timeout
Bereits angemeldete Benutzer bleiben bis zum Session-Ende (24h) eingeloggt. Um sofortigen Entzug zu erzwingen, muss die Session manuell beendet werden.
Aktive Sessions anzeigen¶
- Zero Trust Dashboard → Logs → Access
- Hier sehen Sie:
- Wer hat sich eingeloggt
- Wann erfolgte der Zugriff
- Von welcher IP-Adresse
Access Policies anpassen¶
Session-Dauer ändern¶
- Access → Applications →
easySale Documentation→ Edit - Session duration anpassen (z.B.
8 hours,7 days) - Save application
Empfohlene Werte:
Erweiterte Access Rules¶
IP-basierte Einschränkung¶
→ Nur von bestimmten IP-Bereichen erlaubtCountry-basierte Einschränkung¶
→ Nur aus DACH-Region erlaubtMehrere Bedingungen kombinieren¶
→ Nur Team-Mitglieder aus ÖsterreichTroubleshooting¶
Problem: OTP-E-Mail kommt nicht an¶
Mögliche Ursachen:
- Spam-Ordner prüfen
-
E-Mail von
no-reply@cloudflareaccess.comsuchen -
E-Mail-Adresse nicht in Policy
- Verifizieren Sie, dass die Domain/E-Mail erlaubt ist
-
Access → Applications → Policy überprüfen
-
E-Mail-Server blockiert Cloudflare
- Whitelist hinzufügen:
cloudflareaccess.com
Problem: "Access Denied" trotz korrekter E-Mail¶
Lösungen:
-
Policy überprüfen
-
Tippfehler in E-Mail-Adresse
-
Exakte Schreibweise prüfen (Groß-/Kleinschreibung egal)
-
Cache leeren
- Inkognito-Fenster verwenden
- Browser-Cache löschen
Problem: Session läuft zu früh ab¶
Ursache:
Browser-Cookies werden gelöscht oder "Do Not Track" ist aktiviert.
Lösung:
1. Cloudflare Access Domain in Cookie-Whitelist aufnehmen
2. Browser-Einstellungen: Cookies für cloudflareaccess.com erlauben
Problem: Zu viele Login-Versuche¶
Fehlermeldung:
Rate limit exceeded
Lösung: - Warten Sie 15 Minuten - Cloudflare blockiert temporär bei zu vielen Anfragen - Kontaktieren Sie Support für höhere Limits
Client-spezifische Dokumentation¶
Automatisiertes Setup für neue Kunden¶
Für neue Client-Projekte kann die komplette Cloudflare-Konfiguration automatisiert werden:
Setup-Skript¶
cd onboarding/lib/client_only
CLIENT_DIR=/path/to/easysale-client-foo \
CLIENT_NAME="Foo GmbH" \
CLIENT_EMAILS="kunde@foo.de,support@foo.de" \
CLOUDFLARE_API_TOKEN="xxx" \
CLOUDFLARE_ACCOUNT_ID="yyy" \
./06_setup_cloudflare_access.sh
Was das Skript automatisch erledigt¶
- Cloudflare Pages Projekt
- Projektname:
easysale-{slug}-docs - Standard-Domain:
easysale-{slug}-docs.pages.dev -
Custom-Domain:
{slug}-docs.easysale.de -
Custom Domain Konfiguration
- Fügt Custom Domain automatisch zum Pages-Projekt hinzu
-
Gibt CNAME-Eintrag für Strato aus (muss manuell gesetzt werden)
-
Cloudflare Access Application
- Application Name:
{Client Name} Documentation - Domain Protection: Aktiviert auf Custom Domain
-
Session Duration: 24 Stunden
-
Access Policies
- ✅ @tech-schuppen.de (automatisch)
-
✅ Alle in
CLIENT_EMAILSangegebenen Adressen -
GitHub Variables
CLOUDFLARE_PAGES_PROJECT→ für Deployment-Workflow
Credentials bereitstellen¶
Option 1: Umgebungsvariablen
Option 2: GitHub Org Secrets (bevorzugt)
Wenn CLOUDFLARE_API_TOKEN und CLOUDFLARE_ACCOUNT_ID als Org Secrets gesetzt sind, werden sie automatisch geladen.
Beispiel: Kunde "Gemüsebau Steiner"¶
CLIENT_DIR=../easysale-client-gemuesebau-steiner \
CLIENT_NAME="Gemüsebau Steiner" \
CLIENT_EMAILS="info@gemuesebau-steiner.at,buchhaltung@gemuesebau-steiner.at" \
./06_setup_cloudflare_access.sh
Ergebnis:
- Pages-Projekt: easysale-gemuesebau-steiner-docs
- Fallback-Domain: easysale-gemuesebau-steiner-docs.pages.dev
- Custom-Domain: gemuesebau-steiner-docs.easysale.de ✨
- Zugriff für:
- @tech-schuppen.de
- info@gemuesebau-steiner.at
- buchhaltung@gemuesebau-steiner.at
DNS bei Strato setzen:
Domain: easysale.de
Typ: CNAME
Name: gemuesebau-steiner-docs
Wert: easysale-gemuesebau-steiner-docs.pages.dev
TTL: 3600
Nach dem Setup¶
-
DNS-Eintrag bei Strato setzen:
-
DNS-Propagation abwarten (~5-15 Minuten)
-
Deployment auslösen:
-
Access testen:
Zusammenfassung¶
Project name: easysale-gemuesebau-steiner-docs
Fallback-Domain: easysale-gemuesebau-steiner-docs.pages.dev
Custom-Domain: gemuesebau-steiner-docs.easysale.de
Access Policy:
- @tech-schuppen.de
- info@gemuesebau-steiner.at
- buchhaltung@gemuesebau-steiner.at
DNS bei Strato:
Manuelles Setup für Client-Projekte¶
Falls Sie die Konfiguration manuell vornehmen müssen:
Beispiel: Gemüsebau Steiner
Project name: easysale-gemuesebau-steiner-docs
Domain: easysale-gemuesebau-steiner-docs.pages.dev
Access Policy:
- @tech-schuppen.de
- info@gemuesebau-steiner.at
- buchhaltung@gemuesebau-steiner.at
Vorteile: - Jeder Client sieht nur seine eigene Dokumentation - Unterschiedliche Zugriffsrechte pro Client - Individuelle Session-Dauern konfigurierbar
Audit & Compliance¶
Zugriffsprotokolle¶
Abruf:
1. Zero Trust Dashboard → Logs → Access
2. Filter nach Application: easySale Documentation
Verfügbare Informationen: - Benutzer-E-Mail - Zeitstempel - IP-Adresse - User-Agent (Browser) - Land - Erfolg/Fehlschlag
Aufbewahrung: - Free Plan: 24 Stunden - Paid Plans: 30+ Tage
DSGVO-Konformität¶
Datenverarbeitung: - E-Mail-Adressen werden zur Authentifizierung gespeichert - IP-Adressen für Security-Logs (24h) - Cloudflare ist GDPR-konform zertifiziert
Datenschutzerklärung:
Zum Schutz unserer Dokumentation verwenden wir Cloudflare Access.
Dabei werden E-Mail-Adressen zur Authentifizierung und IP-Adressen
für Sicherheitsprotokolle vorübergehend verarbeitet.
Weitere Informationen: https://www.cloudflare.com/privacypolicy/
Kosten¶
Free Plan¶
✅ Bis zu 50 Benutzer/Monat
✅ Unbegrenzte Applications
✅ E-Mail OTP Authentication
✅ 24h Log-Retention
Ausreichend für: - Interne Team-Dokumentation - Kleine bis mittlere Kundenbasis - Standard-Sicherheitsanforderungen
Paid Plans¶
Ab $7/Monat pro User (Enterprise Features): - Mehr als 50 Benutzer - Extended Log-Retention (30+ Tage) - SAML/OIDC Integration - Multi-Factor Authentication (Hardware-Keys) - SLA & Support
Best Practices¶
Security¶
- Regelmäßige Policy-Reviews
- Vierteljährlich Benutzer-Liste prüfen
-
Ausgeschiedene Mitarbeiter entfernen
-
Session-Dauer angemessen wählen
- Nicht länger als notwendig
-
Sensible Docs: max. 8 hours
-
IP-Whitelisting für Admin-Zugriff
- Cloudflare Dashboard nur von Firmen-IP
- Zero Trust → Settings → Authentication
Monitoring¶
-
E-Mail-Alerts einrichten
-
Wöchentliche Log-Reviews
- Ungewöhnliche Zugriffsmuster erkennen
- Geografisch unerwartete Zugriffe prüfen
Onboarding neuer Benutzer¶
Prozess:
- Benutzer zu Access Policy hinzufügen
- E-Mail an Benutzer senden:
- Bei Problemen: Logs überprüfen