Prometheus
EN DE

Dokumentation · 04 / 09

Datenfluss — Prometheus v2

Alle vierzehn Stufen vom Roh-Event bis zum Open-Data-Snapshot, mit beiden PII-Gates.

Status Pivot abgeschlossen 2026-05-26Quelle concept/data-flow.mdZielgruppe Developer · Security · DPOLesezeit ~4 Min.

Vom Rohereignis im Endnutzerprozess (oder im Registry-Crawl) bis zum Open-Data-Snapshot. Jede Stufe markiert, ob PII theoretisch durchlaufen könnte und welche Defense-in-Depth-Schicht dort greift.


1. Stufen-Übersicht#

Datenfluss v2 — 14 Stufen vom Roh-Event im Endnutzer-Prozess über lokale Anonymisierung (Stufen 1–8) und Submission bis zu Public Audit Log, Aggregate-Store, Mirror-Gossip und Open Data Snapshot (Stufen 9–14) Endnutzer-Prozess · Stufen 1–8 01 RAW-Event nur RAM 02 Sanitize Hosts · Pfade Env-Vars 03 Cohort-Map → PURL + Kohorte 04 Aggregat 1-h-Window 05 · GATE k-Anon k ≥ 5, sonst __small_cohorts 06 · GATE Schema PII-Felder abgelehnt 07 Signieren ed25519 · JCS 08 Egress-Buffer nur signiert Retry, Backoff Roh-Events liegen ausschließlich in RAM oder tmpfs — auf Disk kommen nur signierte Aggregate. Modus D (Registry-Scraping) läuft Mirror-intern und beginnt bei Stufe 3; die Stufen 1 und 2 entfallen. HTTPS POST /v1/submit · TLS 1.3, mTLS optional Mirror · Stufen 9–14 09 · GATE Validierung Sig · Schema · k 10 Audit-Log Sigstore Rekor 11 Store ClickHouse 12 Gossip Mirror ↔ Mirror 13 Snapshot täglich · Parquet 14 Open-Data-API read-only ohne Auth Open Data CC-BY-4.0 · Parquet + CSV.gz Public Audit Log, cross-mirror kein Login, keine Paywall Alles ab Stufe 9 ist konstruktionsbedingt öffentlich: Log, Aggregate, Snapshots und API tragen keine PII.
Datenfluss · 14 Stufen, zwei Lanes (Endnutzer / Mirror), zwei PII-Gates (k-Anon, Schema-Reject)

Stufen im Endnutzer-Prozess (1–8):

  1. RAW Event (RAM, nie auf Disk) — install · session-start · runtime-tick · feature-flag · dep-load.
  2. Sanitize — Hosts, Pfade, Env-Vars droppen oder hashen.
  3. Cohort-Map — Identifier auf (project_id, version_id, cohort_id) mappen per lokaler Konfiguration.
  4. Aggregate-Window — Tumbling 1h-Window (lokal auch 1min für Debugging).
  5. k-Anon-Guard — wenn k_effective < k_min, dann in cohort_id="__small_cohorts" umschreiben.
  6. Schema-Reject-PII — JSON-Schema-Validierung; verbotene Felder lehnen ab.
  7. Sign + Attestation — ed25519-Signatur; deklarative Claims (Phase 1) / SNARK (Phase 2).
  8. Egress-Buffer — lokale Disk, nur signierte Aggregate; Retry mit exponential backoff; max 30 min vor Verlust-Risiko.

Übergang über HTTPS POST /v1/submit (mTLS optional).

Stufen am Mirror (9–14):

  1. Submission-Validierung — Signatur, Schema, k_effective ≥ k_min, Window-Plausibilität.
  2. Append-Only-Log — Sigstore-Rekor-Hash-Chain, public verifiable.
  3. Aggregate-Store — ClickHouse, Partition toYYYYMM(window_start).
  4. Gossip / Pull-Federation — Mirror-zu-Mirror Konsistenz-Replikation.
  5. Open Data Snapshot — täglich 00:00 UTC, Parquet + CSV.gz, CC-BY-4.0.
  6. Open Data API — Read-only, keine Auth.

Parallel — Modus D (Registry-Scraping) läuft Mirror-intern und beginnt bei Stufe 3 (Cohort-Map auf bekannte PURLs); die Stufen 1, 2 entfallen, weil keine privaten Endnutzer-Events gelesen werden.


2. Was wo passiert — Verantwortlichkeiten#

StufeVerantwortlichDatenschutz-Schicht
1 RAW EVENTEndnutzer-Prozess (RAM)Nie persistent. Wird vom OS bei Prozess-Ende verworfen.
2 SANITIZELokaler AggregatorErste PII-Schicht: bekannte sensible Felder leeren/hashen.
3 COHORT-MAPLokaler Aggregator + Maintainer-ConfigIdentifier werden auf Kategorien gemappt (session-15-30min statt Klartext).
4 AGGREGATE-WINDOWLokaler AggregatorReduziert auf Counts/Sums pro Window — keine Einzelevents mehr.
5 K-ANON GUARDLokaler AggregatorZweite PII-Schicht: Kohorten unter k_min werden in __small_cohorts zusammengefasst.
6 SCHEMA-REJECT-PIILokaler AggregatorDritte PII-Schicht (Defense-in-Depth): JSON-Schema rejected verbotene Felder.
7 SIGN + ATTESTATIONLokaler AggregatorSignatur belegt Provenienz; Attestation belegt Anonymitäts-Constraints.
8 EGRESS-BUFFERLokale Disk (nur signierte Aggregate)Disk-Daten enthalten keine PII mehr (Stufen 2–6 vorher).
9 SUBMISSION-VALIDIERUNGMirrorVierte PII-Schicht (Defense-in-Depth): Mirror prüft Schema, lehnt PII ab.
10 APPEND-ONLY-LOGMirrorHash-Chain — keine PII enthalten, weil Aggregate vorher gefiltert sind.
11 AGGREGATE-STOREMirrorClickHouse-Partition. Public-Read.
12 GOSSIPMirror ↔ MirrorReplikation derselben PII-freien Aggregate.
13 SNAPSHOTMirrorTägliches Open-Data-Artefakt (Parquet/CSV.gz).
14 OPEN DATA APIMirrorLese-API ohne Auth.

3. Was niemals den Endnutzer-Prozess verlässt#

Folgende Begriffe sind in keiner Stufe ≥ 7 erlaubt — Schema-Reject-PII würde sie zurückweisen, und das ist Defense-in-Depth, nicht der primäre Filter:

  • IP-Adresse, MAC-Adresse, Hostname, FQDN
  • Username, E-Mail, OS-User, Process-PID
  • Datei-Pfade aus dem Host-Filesystem
  • Klartext-Git-Repo-Pfade oder Branch-Namen
  • Maintainer-Klartextnamen oder Maintainer-E-Mails
  • Inhalt von Environment-Variablen
  • Zeitstempel feiner als die Window-Granularität (typ. 1 h)

Was darf drin sein:

  • project_id (PURL — öffentliche Paket-Kennung)
  • version_id (semver / ähnliche — öffentlich)
  • cohort_id (vordefinierte Kategorie wie rt-runtime-mins, install-count)
  • Banded numeric values (30-60, 100-1000)
  • k_effective, k_min (Audit-Felder)
  • Provenienz: submitter_did, Signatur, Mirror-Routing

4. Aggregat-Beispiele#

Modus A (Self-Instrumentation in OSS-Lib pkg:npm/example-lib):

{
  "project_id": "pkg:npm/example-lib",
  "version_id": "1.4.2",
  "cohort_id":  "rt-runtime-mins",
  "metric":     "runtime_minutes_band",
  "value":      "30-60",
  "k_effective": 23,
  "k_min":       5,
  "window_start": "2026-05-26T12:00:00Z",
  "window_end":   "2026-05-26T13:00:00Z",
  "source_mode": "A"
}

Modus D (Registry-Scraping über pkg:pypi/example-lib):

{
  "project_id": "pkg:pypi/example-lib",
  "version_id": "2.0.0",
  "cohort_id":  "dep-edges-from-public-manifests",
  "metric":     "observed_dependency_count",
  "value":      "1247",
  "k_effective": null,                     // Track A liest nur öffentliche Manifeste, k-Anon trivial
  "k_min":       null,
  "window_start": "2026-05-26T00:00:00Z",
  "window_end":   "2026-05-27T00:00:00Z",
  "source_mode": "D"
}

5. Outage- und Replay-Verhalten#

SzenarioVerhalten
Mirror unerreichbarLokaler Aggregator puffert signierte Aggregate auf lokaler Disk (Stufe 8). Retry mit exponential backoff; nach 30 min Pufferüberlauf-Risiko (K5).
Duplicate SubmissionMirror hat submission_hash bereits im Audit-Log → idempotenter 200 OK ohne Doppel-Insert.
Cross-Mirror-DivergenzGossip-Job vergleicht audit_log.head; bei Divergenz wird im eigenen /v1/status ein Disclosure-Eintrag gesetzt. Forschung kann dann beide Sichten exportieren und vergleichen.
Maintainer rotiert DIDNeuer DID wird in submitter_id verwendet; alter DID bleibt im Audit-Log historisch nachweisbar. Keine Migration nötig.

6. Querverweise#

  • system-overview.md — Komponentensicht
  • threat-model.md — STRIDE über diesen Fluss
  • 03-risikoprofil.md — Risiken D-2-1 … S-2-3
  • 05-zero-knowledge-vorschlag.md — ZK-Bausteine zur Härtung
  • 02-poc-spezifikation.md — Phase-1-MVP-Tracks A + B