Files
bf-infra/docs/tp49-cf-access-startauftrag.md
Christoph Emsenhuber 81cd7bfb7e TP49-Startauftrag: MCP-Pruefschritt an den Anfang, read-only-Grenze dokumentiert
Christoph-Direktive: zu Sessionbeginn pruefen ob der Cloudflare-MCP laeuft, sonst anhalten.

Der MCP ist als Remote-Server definiert (https://mcp.cloudflare.com/mcp, OAuth) und
laut cf-tunnel-mapping.md:321 read-only — er kann den Fix nicht ausfuehren. Der
Bestandsaufnahme-Teil laeuft ueber den MCP, die Aenderung braucht curl + CF_API_TOKEN.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-06 06:54:47 +02:00

4.4 KiB
Raw Blame History

Startauftrag — TP49: CF-Access login_method-Include entfernen

Für eine frische Session. Gitea #76, Prosa in docs/teilprojekte.md → ### TP49. Angelegt 2026-10-06 auf Christoph-Direktive („absolute prio").

Der Auftrag in einem Satz

Entferne login_method:github aus der Policy christoph der CF-Access-App 420.teilzeitladen.xyz — nach Rücksprache mit Christoph, wen der Zugang treffen soll.

Lage (live geprüft 2026-10-06, nicht geraten)

Der Ursprungsfund von 2026-07-10 war größer beschrieben als er ist. Nachprüfung:

App Status
*.emsenhuber.net (intern: hass/grafana/portainer/pve) ✅ sauber — TP41 hat auf Groups umgestellt (E-Mail/IP/service_token)
420.teilzeitladen.xyz (öffentlich) 🔴 offen — login_method:github in Policy christoph

onetimepin ist kein Problem — das ist der E-Mail-Einmalcode an die eingetragene Adresse. Scharf ist ausschließlich github.

Konkrete Daten

Account-ID   : siehe mcp/cloudflare/.env  (CF_ACCOUNT_ID)
Token        : CF_API_TOKEN (aktiv, lesen+schreiben, verifiziert 2026-10-06)
App          : 420.teilzeitladen.xyz     → volle ID per GET .../access/apps holen
Policy       : "christoph"
Entfernen    : include {"login_method":{"id":"72c1291b-a38d-4bc7-af97-5dee04a4f84a"}}   (type=github)
Behalten     : include {"login_method":{"id":"9024c7a6-2d1f-4432-9f48-51593acd1361"}}   (type=onetimepin)

🔴 ZUERST: MCP-Verfügbarkeit prüfen — und anhalten, wenn er fehlt

Christoph-Direktive für diese Session: zu Sessionbeginn prüfen, ob der Cloudflare-MCP läuft. Wenn nicht: anhalten und melden, nicht improvisieren.

Der MCP ist in ~/.claude/settings.json aktiviert (enabledMcpjsonServers) und in .mcp.json definiert als Remote-Server https://mcp.cloudflare.com/mcp (OAuth-Login, nicht der lokale .env-Token). Prüfschritt:

ToolSearch("cloudflare access apps")   → erscheinen mcp__cloudflare__* Tools?

Wenn nein: stoppen, dem User melden. Nicht auf curl ausweichen, ohne das zu sagen — der Wechsel ist eine Entscheidung, keine Nebensache.

⚠️ Der MCP ist READ-ONLY — er kann den Fix nicht ausführen

docs/cf-tunnel-mapping.md:321: der cloudflare-MCP (OAuth) ist read-only; ein Create/Write-Versuch endet mit 10000 Authentication error. Der gesamte Bestandsaufnahme-Teil (Schritte 1–2) läuft über den MCP. Die Änderung (Schritt 3) braucht curl + CF_API_TOKEN. Diese Trennung nicht verwischen — sonst sucht die Session den Fehler an der falschen Stelle.

🔴 Gotchas — sonst läuft die Session in bekannte Fallen

  1. App-IDs sind 32 Hex. Die Kurzform 16aaec78 liefert 12045 invalid_application_id. Volle ID zuerst per GET /accounts/{id}/access/apps holen.
  2. Writes nur via CF_API_TOKEN/curl. Der cloudflare-MCP (OAuth) ist read-only. Muster: cd mcp/cloudflare && set -a; . ./.env; set +a → dann curl -H "Authorization: Bearer $CF_API_TOKEN". 🔴 Token nie ausgeben; im Output maskieren.
  3. Reusable Policy nur per App-PUT detachbar (policies:[{id,precedence}]), nicht via /policies-DELETE („can not delete reusable policies"). Policy-precedence muss eindeutig sein.
  4. Projektgrenze: 420.teilzeitladen.xyz gehört zu blaueblüten. Änderung nur nach ausdrücklicher Freigabe — nicht „mal eben" mitnehmen.

Ablauf

  1. Bestandsaufnahme (read-only): Policies der App lesen, Ist-Zustand protokollieren.
  2. Rücksprache: Wen soll der Zugang treffen? Ohne diese Antwort nicht ändern — eine Aussperrung wäre der teurere Fehler (Christoph-Entscheid 2026-07-10, „user-gated").
  3. Änderung: login_method:github aus dem Include entfernen, onetimepin behalten.
  4. Abnahme: Policy neu lesen und zeigen, dass nur noch onetimepin + die E-Mail-Includes drinstehen. Nicht dem API-success glauben — die Policy zurücklesen. Dann: kommt christoph/geli über die E-Mail weiterhin hinein?
  5. Abschluss: Gitea #76 closed + status:done, Prosa-Abschnitt finalisieren.

Wenn die Änderung sich als unnötig erweist

Falls Christoph entscheidet, dass der GitHub-Login beim Terpenfinder bleiben soll (etwa weil die App ohnehin öffentlich ist): dann ist TP49 status:dropped — mit der Begründung im Issue, damit der Fund nicht wieder als „offen" in einer Memory auftaucht. Auch das ist ein gültiges Ende.