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>
85 lines
4.4 KiB
Markdown
85 lines
4.4 KiB
Markdown
# 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.
|