TP49 — CF-Access: login_method:github im include der Terpenfinder-Policy — ✅ behoben (require statt include)
#76
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Steuerungs-SSoT: Index/Status hier in Gitea; Prosa/Detail im Repo unter
docs/teilprojekte.md(AbschnittTP49).⚠️ Korrigierte Lage (live geprüft 2026-10-06)
Der Ursprungsfund (2026-07-10) beschrieb einen
login_method-Include am internen Wildcard*.emsenhuber.net. Dieser Teil ist behoben — TP41 hat den Wildcard auf Access-Groups umgestellt:16aaec78bf-userszt-humans= drei einzelne E-Mail-Adressenbf4zt-home=ip:90.146.33.177/32claude-mcpzt-automation= service_token✅ Kein
login_methodmehr an der kritischen Infrastruktur (hass,grafana,portainer,pve).🔴 Was offen ist — der einzige echte Fund
Sweep über alle 9 Access-Apps ergab eine App mit
login_method-Includes:420.teilzeitladen.xyz(Terpenfinder, öffentlich), Policieschristophundgeli.72c1291b-a38d-4bc7-af97-5dee04a4f84a9024c7a6-2d1f-4432-9f48-51593acd1361Scharf ist nur
login_method:githubin Policychristophauf420.teilzeitladen.xyz.Auswirkung: Der Terpenfinder ist eine öffentliche App (kein Teil der internen Infrastruktur).
Ein beliebiger GitHub-Account sieht ihn. Kein Zugriff auf
hass/pve/portainer— der Schadenist Begrenztheit, nicht Kompromittierung der Infrastruktur. Aber: die App liegt auf einer
öffentlichen Domain und war als „nur für uns" gedacht.
Fix
login_method:githubaus dem Include entfernen — dieonetimepin-Einträge können bleiben(sie sind der gewünschte E-Mail-Login). Danach prüfen, dass
christophundgeliweiterhinüber ihre E-Mail-Adressen hineinkommen.
⚠️ Vorher abstimmen, wer Zugang braucht — Christoph-Entscheid von 2026-07-10 („user-gated").
Eine Aussperrung wäre der teurere Fehler.
Gotchas (live bestätigt, spart Suchzeit)
16aaec78liefert12045 invalid_application_id. Volle ID erst perGET /accounts/{id}/access/appsholen.(Dieselbe Falle wie „truncated Record-ID" bei DNS.)
CF_API_TOKEN/curl; dercloudflare-MCP (OAuth) ist read-only.CF_API_TOKENist am 2026-10-06 alsactiveverifiziert (lesen + schreiben).Account-ID/Token in
mcp/cloudflare/.env.policies:[{id,precedence}]) detachbar — nicht via/policies-DELETE. Policy-precedencemuss eindeutig sein.Abgrenzung
Nicht TP41 (abgeschlossen — hat genau diesen Wildcard bereits saniert).
Nicht TP44 (Dokumentation). Verwandt: TP46 (#72), TP34.2 (#73).
⚠️
420.teilzeitladen.xyzgehört zum Projekt blaueblüten — Änderung dort nur nach Absprachemit Christoph (Projektgrenze).
Prosa/Detail:
docs/teilprojekte.md→### TP49.❌ WIDERLEGT am 2026-10-06 — kein Handlungsbedarf. Geschlossen.
Der Befund war falsch
Der Titel („öffnet alle internen Dienste für jeden GitHub/Google-User") und der Body dieses
Issues behaupteten,
login_method:githubimincludeder Policychristophlasse jedenGitHub-Account durch. Das stimmt nicht.
Gegenbeweis (Christoph, live getestet 2026-10-06):
testus@emsenhuber.comwirdabgelehnt. Nur explizit freigeschaltete Adressen kommen durch — die E-Mail-Bindung der
Policy gilt,
login_methodhebelt sie nicht aus.Wie der Fehler entstand
Die Doku-Aussage zu
login_method(„asks which identity service was used for authentication")wurde so gelesen, als ersetze der Include die danebenstehende
email-Zeile.includeistein OR — die Zeilen sind Alternativen, nicht Bedingungen. Aus „GitHub ist eine Alternative
zur E-Mail" wurde fälschlich „GitHub allein genügt". Belegt war das nie.
Es stand trotzdem fünf Tage als „🔴 ABSOLUTE PRIORITÄT" in der Akte (Fund 2026-07-10 → heute),
gestützt allein auf einen Lese-Schluss. Der Test dauerte zwei Minuten.
Belegte Gegenlage
config72c1291b…client_id,redirect_url— kein Domain-Filterc7571880…client_id,redirect_url— kein Domain-Filter9024c7a6…redirect_urlKein IdP trägt eine Domain-/Tenant-Bindung (live:
GET /accounts/{id}/access/identity_providers).Die Einschränkung kann also nur aus der Policy kommen — und sie greift nachweislich.
Google ist auf GitHub übertragbar, weil beide IdPs konfigurationsgleich sind.
⚠️ Grenze: der GitHub-Pfad selbst wurde nicht separat gemessen. Die Aussage ist
„Google→GitHub geschlossen", nicht „GitHub getestet" — deshalb ungetestet, nicht bewiesen sauber.
Das ist aber kein Grund für eine Änderung.
Ergebnis
Kein Schreibzugriff auf die Terpenfinder-Policy ist erfolgt.
420.teilzeitladen.xyzgehörtzum Projekt blaueblüten — es wurde nichts angefasst.
Was erhalten bleibt
Nur die Gotchas (unabhängig vom widerlegten Fund, live bestätigt):
16aaec78→12045 invalid_application_id.cloudflare-MCP ist strikt read-only. Write-Probe 2026-10-06: no-op-PUT(byte-identischer Body) →
1010: undefined. Writes nur viaCF_API_TOKEN/curl./policies-DELETE.✅ Unberührt gültig: TP41 hat den internen Wildcard
*.emsenhuber.netauf Access-Groups(
zt-humans/zt-home/zt-automation) umgestellt — dort steht heute keinlogin_methodmehr.Prosa korrigiert in
docs/teilprojekte.md→### TP49(unddocs/cf-tunnel-mapping.md§10,wo der Ursprungsfund stand).
TP49 — CF-Access: Wildcard-Policy öffnet alle internen Dienste für jeden GitHub/Google-Userto TP49 — CF-Access: `login_method`-Includes auf Policy-Ebene — ❌ widerlegt, kein Handlungsbedarf✅ BEHOBEN am 2026-10-06 — der Befund war echt.
Was passiert ist
Policy
christoph(reusable8e44f5d1…) auf AppTerpenfinder v3(e6a7991f…,420.teilzeitladen.xyz):login_method:githubvonincludenachrequireverschoben⇒
email AND github.includerequireGesetzt via
PUT /accounts/{id}/access/policies/{policy_id}, zurückgelesen über beideEndpunkte (App-Pfad + reusable) — identisch. Dem
success:truewurde nicht geglaubt.Sweep über alle Apps (
login_methodin include/require/exclude): genau zwei Treffer, beide inTerpenfinder v3—christoph(github+onetimepin) undgeli(nur onetimepin = harmlos).Interne Apps + Wildcard: sauber (TP41).
⚠️ Korrektur am eigenen Kommentar von heute Vormittag
Dieses Issue war zwischenzeitlich als Phantom geschlossen und auf
status:droppedgesetzt.Das war falsch. Der Schluss stützte sich auf einen Google-Test (
testus@emsenhuber.com→ abgelehnt) und übertrug ihn ungeprüft auf GitHub. Der Google-Test zeigt nur Googles Verhalten;
die IdP-Configs sind konfigurationsgleich, das unterscheidende Feld steht nicht in der Config.
Christoph hat mit einem zweiten GitHub-Account getestet — er kam durch. Damit war der
Ursprungsfund bestätigt. Der Kommentar von heute Vormittag ist damit überholt.
Zur ursprünglichen Absicht
Die Berechtigung sollte an den GitHub-Username gekoppelt werden. Das gibt Access nicht her:
login_methodprüft die Methode, nicht den Nutzer; einen Username-Selector gibt es nicht.Der einzige GitHub-bezogene Identitäts-Selector ist Identity provider group — der braucht
SCIM, und am hiesigen GitHub-IdP ist
scim_config.enabled = false(
GET …/scim/groups→500 (12158)). ⇒email AND githubist die vollständige Umsetzungdes hier Möglichen. Eine echte Org-Kopplung bräuchte SCIM aktiviert — eigener TP.
Gotchas (neu)
PUT …/apps/{app}/policies/{pol}→
12130. Korrekt istPUT …/access/policies/{policy_id}.cloudflare-MCP ist strikt read-only — Write-Probe (no-op-PUT) →1010.16aaec78→12045.Offen
Bestätigungstest: dass ein fremder GitHub-Account jetzt abgewiesen wird.
Bis dahin ist der Fix gesetzt und zurückgelesen, aber nicht durch einen Login bewiesen.
Prosa korrigiert in
docs/teilprojekte.md→### TP49unddocs/cf-tunnel-mapping.md§10.TP49 — CF-Access: `login_method`-Includes auf Policy-Ebene — ❌ widerlegt, kein Handlungsbedarfto TP49 — CF-Access: `login_method:github` im include der Terpenfinder-Policy — ✅ behoben (require statt include)✅ ABNAHME BESTANDEN — verhaltensbestätigt durch echten Login (2026-10-06).
Christoph hat nach dem Fix alle Auth-Pfade neu getestet:
christoph@emsenhuber.com)Damit ist
email AND githubverhaltensbestätigt — es trennt das eigene Konto vom fremden,ohne jemanden auszusperren. Kein Regress an den Nachbar-Policies (
geli,terpene-svc),kein Kollateral am internen Wildcard.
Der Fix war bis hierhin nur gesetzt und zurückgelesen (API-Ebene). Der zweite Test mit einem
fremden GitHub-Account war nötig — die API sagt nichts darüber, ob die Regel greift.
Er greift.
Status:
closed/status:done. Kein offener Punkt.Prosa final:
docs/teilprojekte.md→### TP49. Der Umweg (Fehlschluss → Schließung →Wiedereröffnung → Fix → Abnahme) bleibt dort als Aktenhistorie dokumentiert.