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

85 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.