Initial import: Secure Coding Agents with Flue

Fachbuch-Projekt mit vollständiger Manuskriptfassung (Prolog, Kap. 1–11,
Epilog, Backmatter), Cover- und Part-Page-Assets, Pandoc/LuaLaTeX-Pipeline
(portiert von ki-hinterm-vorhang), Klappentext, Exposé und Lektorat Runde 1.
This commit is contained in:
grok-bot committed 2026-07-24 11:43:43 +02:00
commit 0ca5293559
44 files changed
+4474

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
# Build intermediates (reproducible via just assemble / just pdf)
build/
dist/*.aux
dist/*.log
dist/*.out
dist/*.toc
dist/*.tex
# OS / editor
.DS_Store
.idea/
.vscode/
*.swp
*~
# Python
__pycache__/
*.py[cod]
.venv/
venv/
# Local scratch
*.tmp
/tmp/
+85
View File
@@ -0,0 +1,85 @@
# Secure Coding Agents with Flue
Enterprise-ready Data Protection, Logging & Compliance Patterns
**Martin Richardt** (2026)
Fachbuch-Projekt: sichere Coding-Agents auf Basis des Flue Frameworks
(TypeScript Agent-Harness) — DLP, LLM-Datenkontrolle, Audit, Sandbox.
## Cover bauen
```bash
just cover
# oder:
python3 scripts/build_cover.py
```
Voraussetzung: Python 3 + Pillow (`pip install pillow`), macOS-Systemfonts
(Baskerville, Avenir Next).
| Datei | Größe | Zweck |
|-------|-------|--------|
| `assets/cover/cover-art.jpg` | 1600×2400 | Textfreie Art-Base |
| `assets/cover/cover.jpg` | 1600×2400 | Finales Cover (PDF/E-Book) |
| `assets/cover/cover-hires.png` | 1600×2400 | Druck/Export |
| `assets/cover/cover-web.jpg` | 800×1200 | Vorschau / Web |
Design-Notizen: [`design/cover-entscheidungen.md`](design/cover-entscheidungen.md)
Klappentext: [`design/klappentext.md`](design/klappentext.md)
Exposé: [`expose.md`](expose.md)
Lektorat: [`design/lektorat-2026-07-24.md`](design/lektorat-2026-07-24.md)
## PDF bauen
Voraussetzungen: Pandoc, LuaLaTeX (TeX Live), Charter/DejaVu-Fonts.
```bash
just cover # Cover neu rendern (optional)
just assemble # manuskript/* → build/book.md
just pdf # volles PDF → dist/secure-coding-agents-flue.pdf
just pdf-sample # nur Prolog + Kap. 1–2
just clean
```
## Manuskript
17 Quellen unter `manuskript/` (Prolog, 11 Kapitel, Epilog, Glossar, …).
Gliederung und Konventionen: [`manuskript/README.md`](manuskript/README.md).
**Teile**
1. Grundlagen (Kap. 1–3)
2. Datenschutz und DLP (Kap. 4–6)
3. Isolation und Runtime (Kap. 7–8)
4. Compliance und Betrieb (Kap. 9–11)
## PDF-Pipeline
Portiert von `../ki-hinterm-vorhang` (Pandoc + LuaLaTeX + KOMA):
```
pdf/
metadata.yaml
styles/secure-agents-colors.tex
templates/secure-agents-book.tex
templates/secure-agents-preamble.tex
filters/boxes.lua
front/impressum.tex
```
Cover-Einbindung: `\ProjectCover` → `assets/cover/cover.jpg`.
## Projektstruktur
```
assets/cover/ Cover-Assets
assets/parts/ Teiltrenner (teil-01 … teil-04)
design/ Cover, Parts, Klappentext, Lektorat
manuskript/ Kapitelquellen
pdf/ LaTeX/Pandoc-Vorlage
scripts/ assemble_book.py, build_cover.py
justfile cover | assemble | pdf | pdf-sample | clean
dist/ PDF-Ausgabe
```
Part-Pages: [`design/parts.md`](design/parts.md)
Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

+66
View File
@@ -0,0 +1,66 @@
# Cover-Design: Secure Coding Agents with Flue
## Zielgruppe (visuell)
Ernsthafte Entwickler und Security-Verantwortliche in Unternehmen.
Das Cover soll „Enterprise-ready / Security Engineering“ signalisieren — nicht
Hobby-Tooling und nicht generisches AI-Hype-Sci-Fi.
## Visuelle Metapher
| Element | Bedeutung im Buchkontext |
|--------|---------------------------|
| Geschichtete, transparente Platten (Harness-Node) | Coding-Agent / AI-Harness als kontrollierte Schichtarchitektur |
| Leuchtender Cyan-/Emerald-Filter | Data-Loss-Prevention: Datenstrom wird geprüft, bevor er an LLMs geht |
| Stilisierte Schlüssel & Fragment-Glyphs | Sensitive Daten (Secrets, PII, Credentials), die herausgefiltert werden |
| Circuit-Linien → Sandbox-Rechtecke | Sandbox-/Container-Strategien und Kontrollgrenzen |
| Telemetrie-Linien am unteren Rand | Observability, Logging, Audit-Spuren — dezent, nicht Dashboard-Hype |
## Farbschema
- **Hintergrund:** Tiefes Navy/Schwarz (`#0B1220`-Nähe) — seriös, hoher Kontrast für Typo
- **Akzent Cyan** (`#00D4FF`): Schutz/Filter, Kicker, Divider
- **Akzent Emerald** (`#2A9D8F`): Compliance/„safe“, dezente Unterlinien
- Bewusst kein Neon-Regenbogen, kein Purple-AI-Klischee
## Typografie (separat vom Art-Base)
Text wird **nicht** im Bildmodell erzeugt, sondern per `scripts/build_cover.py`
(Pillow) über die textfreie Art-Base gelegt — scharfe, editierbare Titelzeilen.
| Block | Inhalt | Rolle |
|-------|--------|--------|
| Kicker | SECURITY ENGINEERING | Genre/Positionierung |
| Titel | Secure Coding Agents / with Flue | Primärbotschaft |
| Untertitel | Enterprise-ready Data Protection, Logging & Compliance Patterns | Scope |
| Tags | DLP · Sandbox · Audit | Drei Kernpfeiler |
| Autor / Jahr | Martin Richardt · 2026 | Attribution |
Fonts (macOS): Baskerville (Titel), Avenir Next (Rest) — technisch lesbar, nicht verspielt.
## Layout-Prinzipien
1. **Dunkler Freiraum oben** — Titelblock bleibt lesbar.
2. **Visueller Fokus unten/mitte** — Metapher trägt, ohne Text zu stören.
3. **Soft-Veil** hinter Titel und Autor — Kontrast ohne harte Box.
4. **Keine Logos** — weder Flue noch Drittanbieter.
## Pipeline
```
cover-art.jpg (textfrei, 1600×2400)
↓
build_cover.py
↓
cover.jpg / cover-hires.png / cover-web.jpg
```
PDF-Einbindung vorbereitet in `pdf/templates/secure-agents-preamble.tex`
(`\ProjectCover` → `assets/cover/cover.jpg`).
## Bewusst weggelassen
- Markenlogos und Framework-Branding-Icons
- Figürliche Roboter/Humanoiden
- Überladene Code-Wände oder Terminal-Screenshots
- Marketing-Slogans auf dem Cover
+75
View File
@@ -0,0 +1,75 @@
# Klappentext — Secure Coding Agents with Flue
Varianten für Rückseite, Shop-Beschreibung und Pressematerial.
Ton: nüchtern, enterprise, ohne Marketing-Superative.
---
## Kurz (ca. 90 Wörter) — Shop / Softcover-Rücken
Coding-Agents lesen Repositories, rufen Tools auf und senden Kontext an
Sprachmodelle – oft schneller als jeder Review. Ohne klare Datengrenzen,
Filter und Audit wird Produktivität zum stillen Risikotransfer.
Dieses Fachbuch zeigt, wie sich Agents auf Basis eines Agent-Harnesses
(exemplarisch Flue) freigabefähig absichern lassen: Datenfluss zum LLM, DLP
und Entropie-Filter, Sandbox und Tool-Permissions, Logging ohne Secret-Leck,
Enterprise-Patterns und Playbooks für den Betrieb.
Für Entwickler, Security und Plattform-Teams, die Agents verantworten – nicht
nur demonstrieren.
---
## Standard (ca. 160 Wörter) — Klappe / Produktseite
Ein Coding-Agent in der IDE holt sich Dateien, schreibt Patches und hängt
Kontext an ein Modell – manchmal inklusive Secrets aus `.env` und Logs. Das
ist kein Randfall, sondern der Normalzustand unkontrollierter Adoption.
*Secure Coding Agents with Flue* behandelt den Harness als Kontrollfläche:
Was darf das Modell sehen? Was darf der Agent tun? Wie belegen Sie beides im
Audit?
Das Buch liefert praxistaugliche Patterns statt Prompt-Appelle:
- Trust-Grenze und Datenfluss zum LLM
- DLP mit Pattern Matching und Entropie-Filtern
- Sandbox-Strategien und Least Privilege für Tools
- Audit-Events, die Kontrolle nachweisen, ohne Klartext zu speichern
- Enterprise-Anschluss (Gateway, Residenz, Rollen, Change)
- Playbooks für Secret-Verdacht, False Positives und Kill-Switch
Flue dient als TypeScript-Bezugspunkt; die Muster gelten harness-übergreifend.
Zielgruppe sind ernsthafte Entwickler und Security-Verantwortliche in
Unternehmen – nicht Hobby-Bots und Demo-Folien.
**Martin Richardt** schreibt an der Schnittstelle von Softwarearchitektur,
KI-Systemen und nachvollziehbarer Technik.
---
## Sehr kurz (ca. 40 Wörter) — Social / Meta-Description
Wie man Coding-Agents enterprise-ready absichert: Datenkontrolle zum LLM, DLP,
Sandbox, Permissions, Audit und Playbooks – am Harness, nicht im System-Prompt.
---
## Englisch kurz (ca. 80 words) — internationale Listings
Coding agents read repos, call tools, and send context to models—often including
secrets no one meant to share. This book treats the agent harness as the control
plane: data flow to the LLM, DLP and entropy filters, sandboxes and least-
privilege tools, audit without logging secrets, plus enterprise patterns and
incident playbooks. Flue is the TypeScript reference point; the patterns apply
beyond any single framework. For engineers and security owners who need
shippable controls, not demos.
---
## Drei Sätze (Zitatblock / Einband innen)
1. Was das Modell nicht sehen muss, darf es nicht sehen.
2. Was der Agent nicht tun muss, darf er nicht können.
3. Was Sie im Audit nicht zeigen können, gilt als nicht kontrolliert.
+80
View File
@@ -0,0 +1,80 @@
# Lektorat — Secure Coding Agents with Flue
**Datum:** 2026-07-24
**Scope:** Gesamtes Manuskript (Prolog, Kap. 1–11, Epilog, Backmatter)
**Methode:** Checkpoints Ton, Terminologie, Wiederholung, Verständlichkeit,
Querverweise (angelehnt an Lektorats-Skill des Schwesterprojekts)
## Ergebnis
Erste Lektoratsrunde **durchgeführt und eingearbeitet**. PDF neu gebaut.
## P0 — behoben
| Fund | Maßnahme |
|------|----------|
| Kap. 4 Zusammenfassung: unklare Formulierung „skaliert Nutzen ohne Risiko … mitzuskalieren“ | Neu formuliert (Nutzen skalieren, ohne Datenrisiko proportional mitwachsen zu lassen) |
| Gemischte Terminologie Allow-Listen / Deny-Listen / Allowlist | Vereinheitlicht auf **Allowlist(s)** / **Denylist(s)** (wie Glossar) |
| Kap. 9 „Entscheidung-Metadaten“ | → **Entscheidungs-Metadaten** |
## P1 — behoben
| Fund | Maßnahme |
|------|----------|
| Doppelte Schlussformel „wenig unnötiges Wissen, wenig unnötige Macht“ (Kap. 7 + 8) | Kap. 7 und 8 differenziert; Epilog behält die drei Leitsätze |
| „Enterprise-ready heißt“ als Schluss in Kap. 1, 10, 11 | Kap. 10 und 11 variiert |
| „Theaterkulisse“ / „Theater“ für schwache Sandbox | Kap. 1 entschärft; Kap. 7 behält „Theater“ einmal |
| Kap. 2 Schluss leicht lehrbuchhaft | Gestrafft, Mapping betont |
| „Default-deny“ vs. „Deny by default“ (Kap. 7) | Prosa auf **Deny by default** |
| Kap. 7 „ephemeral workspace“ mitten im DE-Text | → **ephemerer Workspace** |
| Kap. 6/Epilog/Prolog: kleinere Stilglättungen | eingearbeitet |
## P2 — bewusst belassen oder später
| Fund | Entscheidung |
|------|----------------|
| Wiederkehrende Brücken „Kapitel X hat … Dieses Kapitel …“ | Gewollt für lineare Leser; nicht streichen |
| „System-Prompt ist keine Policy“ an mehreren Stellen | Kernbotschaft; an Ersteinführung (Kap. 1/2) und Vertiefung (Kap. 8) ok |
| Checklisten am Kapitelende ähnlich aufgebaut | Konvention des Buchs |
| Literatur: Arbeitsbibliografie, nicht alle DOI | im Text so deklariert; Vertiefung bei Bedarf |
| Part-Pages ohne Grafik | Infrastruktur, kein Lektoratstext |
| Kein zweites Augenpaar / Fachreview Security | empfohlen als nächster Schritt |
## Terminologie (kanonisch nach Runde 1)
| Begriff | Form |
|---------|------|
| Positiv-/Negativlisten | Allowlist / Denylist |
| Policy-Default | Deny by default |
| Steuerungsschicht | Harness / Agent-Harness |
| Modellzugang | Model Gateway / Gateway |
| Risikoklassen Tools | R0–R4 |
| Aufbewahrung Logs | Retention-Tier T0–T3 |
| Buchtitel EN | Secure Coding Agents with Flue |
## Querverweise
Stichprobe der Kapitelverweise (2→3→4→…→11, Prolog-Lesepfade, Epilog-Schichtentabelle):
**stimmig**. Keine offensichtlichen „siehe Kapitel N“-Fehler gefunden.
## Ton
- Nüchtern, enterprise/security, wenig Hype — **ok**
- Keine AGI-Prophezeiungen — **ok**
- Wiederkehrende Metapher „Vertrauensgrenze / Kontrolle als Produkt“ — kohärent
## Statistik (Runde 1)
| Kategorie | Geschätzt vor Fix | Nach Fix |
|-----------|-------------------|----------|
| P0 Sprache/Klarheit | 1 | 0 offen |
| P0 Terminologie | 1 Cluster | vereinheitlicht |
| P1 Redundanz Schlussformeln | 3 | entschärft |
| P2 strukturelle Wiederholung | bewusst | belassen |
## Empfohlene Runde 2 (nicht in diesem Durchlauf)
1. Kapitelweise Lautlesen (Prolog + Kap. 4–6 priorisieren)
2. Fachreview: DLP-Schwellen, Sandbox-Stufen, DSGVO/AI-Act-Formulierungen mit Legal
3. Box-Filter optisch im PDF prüfen (`Kern in einem Satz` / `Zusammenfassung`)
4. Klappentext aus Prolog + Epilog-Leitsätzen ableiten
+27
View File
@@ -0,0 +1,27 @@
# Part-Page-Grafiken
Textfreie Trenner-Illustrationen für `\ProjectPartPage` (Titel setzt LaTeX).
| Datei | Teil | Titel (assemble) | Motiv |
|-------|------|------------------|--------|
| `assets/parts/teil-01.png` | 1 | Grundlagen | Geschichtete Architektur-Panels, Gitter, Circuit-Netz |
| `assets/parts/teil-02.png` | 2 | Datenschutz und DLP | Filter-Membran, Datenpartikel, stilisierte Keys |
| `assets/parts/teil-03.png` | 3 | Isolation und Runtime | Sandbox-Würfel auf Plattform, Isolationsringe |
| `assets/parts/teil-04.png` | 4 | Compliance und Betrieb | Audit-Timeline, Wellen/Telemetrie, abstrakte Marker |
## Stil
- Bezug: Cover-Art (`assets/cover/cover-art.jpg`) per Image-Edit
- Palette: Navy / Cyan / Emerald
- Format: 1600×2400 px (2:3), PNG, RGB
- **Kein Text, keine Logos** (Teilnummer und Titel kommen aus dem Template)
## Einbindung
`scripts/assemble_book.py` → `PART_BEFORE` injiziert:
```latex
\ProjectPartPage{n}{Titel}{assets/parts/teil-0n.png}
```
Neu erzeugen: Bilder ersetzen unter `assets/parts/`, dann `just pdf`.
Binary file not shown.
+119
View File
@@ -0,0 +1,119 @@
# Exposé
**Titel:** *Secure Coding Agents with Flue*
**Untertitel:** *Enterprise-ready Data Protection, Logging & Compliance Patterns*
**Autor:** Martin Richardt
**Genre:** Fachbuch / Security Engineering für Software- und Plattform-Teams
**Sprache:** Deutsch (Titel und Untertitel Englisch)
**Umfang (Stand 2026-07):** ca. 73 PDF-Seiten · ~14.000 Wörter (erste durchgehende Fassung)
**Status:** Manuskript Vollfassung Kap. 1–11 + Front/Backmatter; Lektorat Runde 1
---
## Worum geht es?
Coding-Agents erweitern die Angriffsfläche von „Code vorschlagen“ auf „Kontext
beschaffen, Tools ausführen, Daten an LLMs senden“. Produktivität ist real;
ohne Harness-Kontrollen wächst das Risiko still mit.
Dieses Buch erklärt, wie man Agents **freigabefähig** macht – technisch und
betrieblich:
- Datenfluss und Trust-Grenze zum Modell
- DLP (Pattern Matching) und Entropie-Filter
- Sandbox und Tool-Permissions (Least Privilege)
- Logging/Audit ohne Secret-Klartext
- Enterprise-Patterns (Gateway, Residenz, Rollen, Change, Evidence)
- Playbooks für Incident, False Positives, Break-glass
**Flue** (TypeScript Agent-Harness) ist Bezugspunkt, kein Produktmarketing. Die
Patterns zielen auf die *Stelle* im System (Context Builder, Gateway, Tool
Runtime, Policy, Observability), nicht auf ein Logo.
---
## Zielgruppe
| Primär | Bedarf |
|--------|--------|
| Entwickler:innen, die Agents bauen/betreiben | Konkrete Hooks und Anti-Pattern |
| Security / Compliance | Nachweisbare Controls, keine Folien |
| Plattform-Teams | Standard-Harness, Profile, Self-Service mit Leitplanken |
**Nicht primär:** Prompt-Engineering-Einsteiger, reine Modell-Benchmarks,
Hobby-Bot-Tutorials, Rechtsberatung.
---
## Ton und Alleinstellung
- nüchtern, praxisnah, enterprise/security
- Patterns, Tabellen, Checklisten, Playbooks
- keine Hype- oder Untergangsretorik
- „System-Prompt ist keine Policy“ als Leitdifferenz
**Marktlücke:** Viel Material zu Agents ist Demo, Framework-Doku oder
abstrakte AI-Governance. Wenig verbindet **Harness-Engineering** (DLP,
Sandbox, Permissions, Audit) mit **Betriebsreife** (Playbooks, SLOs,
Freigabemodell).
**Kernversprechen:** Nach der Lektüre können Teams benennen, was nie ins Modell
darf und was der Agent nie tun darf – und die entsprechende Kontrollkette im
Harness entwerfen, messen und im Incident abarbeiten.
---
## Aufbau
| Teil | Kapitel | Inhalt |
|------|---------|--------|
| Front | Prolog | Szene, Scope, Lesepfade |
| 1 Grundlagen | 1–3 | Warum Security, Harness-Architektur, Bedrohungsmodell |
| 2 Datenschutz | 4–6 | Datenfluss, DLP, Entropie |
| 3 Isolation | 7–8 | Sandbox, Tool-Permissions |
| 4 Compliance | 9–11 | Logging/Audit, Enterprise-Patterns, Playbooks |
| Back | Epilog, Glossar, Literatur, Autor, Kolophon | |
Drei Leitfragen durchgängig:
1. Welche Daten verlassen den Vertrauensbereich – und warum?
2. Welche Kontrolle greift vor/nach dem LLM-Call – und was darf der Agent tun?
3. Wie beweisen wir Kontrolle im Audit und Incident?
---
## Vergleichbare Positionierung
| Näher an | Ferner von |
|----------|------------|
| OWASP-LLM-Denken + Secure SDLC | Prompt-Kochbücher |
| Plattform-/Security-Engineering | Business-Buzzword-AI |
| Runbooks und Policy-as-Code | Reine Governance-Essays ohne Technik |
Komplementär zu allgemeinen LLM-Sachbüchern (z. B. Schwesterprojekt *Die KI
hinter dem Vorhang*): hier **Security- und Betriebsfokus** auf Coding-Agents.
---
## Lieferumfang / Herstellung
- Markdown-Manuskript, Pandoc/LuaLaTeX-Pipeline (KOMA)
- Cover 1600×2400 (Art + Typografie-Overlay)
- PDF-Build: `just pdf` → `dist/secure-coding-agents-flue.pdf`
- Klappentext-Varianten: `design/klappentext.md`
---
## Nächste Arbeitspakete (nach Exposé)
1. Lektorat Runde 2 / Fachreview (optional Legal zu DSGVO/AI-Act-Formulierungen)
2. Part-Page-Grafiken (Teil 1–4)
3. Klappentext final für Einband wählen
4. Publikationsweg (Selbstverlag / Verlag) und ISBN
---
## Autor
Martin Richardt – Softwarearchitektur, KI-Systeme, Technikvermittlung.
Schwesterprojekt u. a. *Die KI hinter dem Vorhang*.
+50
View File
@@ -0,0 +1,50 @@
# Justfile — Build orchestration for Secure Coding Agents with Flue
#
# Portiert von ../ki-hinterm-vorhang. TeX/LaTeX bleibt Host-seitig (TeX Live).
default: pdf
# Art base + precise typography → assets/cover/cover.jpg
cover:
@python3 scripts/build_cover.py
assemble:
@python3 scripts/assemble_book.py
pdf-styled: assemble
@mkdir -p dist
pandoc build/book.md \
--pdf-engine=lualatex \
--template=pdf/templates/secure-agents-book.tex \
-H pdf/styles/secure-agents-colors.tex \
--metadata-file=pdf/metadata.yaml \
--lua-filter=pdf/filters/boxes.lua \
--resource-path=.:manuskript:assets \
-V lang=de-DE -V papersize=a4 -V colorlinks \
--toc -o dist/secure-coding-agents-flue.pdf
pdf: pdf-styled
# Schnelle Vorschau: Prolog + Kap. 1–2
pdf-sample:
@mkdir -p dist
pandoc \
manuskript/prolog.md \
manuskript/kapitel-01-warum-sichere-agents.md \
manuskript/kapitel-02-flue-architektur.md \
--pdf-engine=lualatex \
--template=pdf/templates/secure-agents-book.tex \
-H pdf/styles/secure-agents-colors.tex \
--metadata-file=pdf/metadata.yaml \
--lua-filter=pdf/filters/boxes.lua \
--resource-path=.:manuskript:assets \
-V lang=de-DE \
-V papersize=a4 \
-V colorlinks \
--toc \
-o dist/secure-coding-agents-sample.pdf
clean:
@rm -f assets/cover/cover.jpg assets/cover/cover-hires.png assets/cover/cover-web.jpg
@rm -rf build dist
@echo "cleaned cover outputs, build/, dist/"
+45
View File
@@ -0,0 +1,45 @@
[Du bist ein erfahrener technischer Autor und Security-Architekt.
Basierend auf folgender detaillierter E-Book-Konzeption erstelle [hier gewünschtes Ergebnis einfügen, z. B. „den vollständigen Klappentext“, „Kapitel 7 als ausführlichen Entwurf“, „eine erweiterte Gliederung mit Unterkapiteln“ etc.]:
Erstelle eine professionelle, moderne und hochwertige E-Book-Cover-Gestaltung (Hochformat, 1600×2400 px, 2:3) für folgendes Fachbuch:
Titel: „Secure Coding Agents with Flue“
Untertitel: „Enterprise-ready Data Protection, Logging & Compliance Patterns“
Autor: [Platzhalter für Autorennamen]
Design-Anforderungen:
- Stil: Clean, technisch, modern, seriös – orientiert an hochwertigen Tech-/Security-Fachbüchern (ähnlich O’Reilly, Manning oder Apress, aber zeitgemäßer und dunkler).
- Farbschema: Dunkler Hintergrund (tiefes Navy/Schwarz mit leichten Blau- und Cyan-Akzenten). Akzentfarben in elektrischem Cyan und gedämpftem Emerald-Grün.
- Visuelle Elemente:
- Abstrakte, stilisierte Darstellung eines Coding-Agents / AI-Harness.
- Dezente visuelle Metapher für „Datenfilterung“ und „Sicherheit“: z. B. ein abstrakter Datenstrom, der durch einen leuchtenden Filter/Schutzschild fließt, während sensitive Daten (stilisierte Schlüssel, Code-Snippets) herausgefiltert werden.
- Subtile Code-Linien oder Circuit-Muster im Hintergrund, die in Sandbox-/Container-Formen übergehen.
- Sehr dezente Andeutung von Observability/Logging (kleine Telemetrie-Linien oder Graphen).
- Typografie:
- Titel groß, klar, modern (sans-serif, technisch, aber gut lesbar).
- Untertitel kleiner und etwas leichter.
- Kein überladenes Design – viel Weißraum (bzw. Dunkelraum), hohe Lesbarkeit.
- Stimmung: Vertrauenswürdig, professionell, zukunftsorientiert, „Enterprise-ready“, nicht verspielt oder zu sci-fi.
- Keine Logos von Flue oder anderen Marken.
- Text muss scharf und gut lesbar sein.
Zusätzlicher Kontext für die Bildgestaltung (damit die visuelle Sprache stimmt):
Das Buch behandelt den Aufbau sicherer Coding-Agents auf Basis des Flue Frameworks (TypeScript Agent-Harness). Schwerpunkt liegt auf:
- Data-Loss-Prevention (Pattern Matching + Entropy-Filter)
- Kontrolle übertragener Daten an LLMs
- Protokollierung & Audit
- Sandbox-Strategien und Enterprise-Anforderungen
Das Cover soll sofort signalisieren: „Dieses Buch ist für ernsthafte Entwickler und Security-Verantwortliche in Unternehmen, nicht für Hobby-Projekte.“
Erzeuge das Cover in hoher Qualität und beschreibe zusätzlich kurz die Design-Entscheidungen.
Anforderungen an die Ausgabe:
- Professioneller, klarer, praxisnaher Schreibstil (deutsch, sofern nicht anders gewünscht)
- Technische Genauigkeit und Realismus
- Betonung der Enterprise-/Security-Perspektive
- Keine übertriebenen Marketing-Floskeln
Für die PDF-Pipeline verwende die Vorlage aus dem Projekt ../ki-hinterm-vorhang
Arbeite möglichst parallel
+30
View File
@@ -0,0 +1,30 @@
# Manuskript — Secure Coding Agents with Flue
Quellen für den PDF-Build. Reihenfolge steuert `scripts/assemble_book.py`.
| Datei | Teil | Status |
|-------|------|--------|
| `prolog.md` | Front | **Vollfassung** |
| `kapitel-01-warum-sichere-agents.md` | 1 Grundlagen | **Vollfassung** |
| `kapitel-02-flue-architektur.md` | 1 | **Vollfassung** |
| `kapitel-03-bedrohungsmodell.md` | 1 | **Vollfassung** |
| `kapitel-04-datenfluss-llm.md` | 2 Datenschutz | **Vollfassung** |
| `kapitel-05-dlp-pattern-matching.md` | 2 | **Vollfassung** |
| `kapitel-06-entropie-filter.md` | 2 | **Vollfassung** |
| `kapitel-07-sandbox-strategien.md` | 3 Isolation | **Vollfassung** |
| `kapitel-08-tool-permissions.md` | 3 | **Vollfassung** |
| `kapitel-09-logging-audit.md` | 4 Compliance | **Vollfassung** |
| `kapitel-10-enterprise-patterns.md` | 4 | **Vollfassung** |
| `kapitel-11-betrieb-playbooks.md` | 4 | **Vollfassung** |
| `epilog.md` | Back | **Vollfassung** |
| `glossar.md` | Back | **Vollfassung** |
| `literatur.md` | Back | **Vollfassung** |
| `ueber-den-autor.md` | Back | **Vollfassung** |
| `kolophon.md` | Back | **Vollfassung** |
**Konventionen**
- Eine H1 pro Datei (`# Titel`)
- Sprache: Deutsch (Buchtitel/Untertitel Englisch)
- Boxen (später via `boxes.lua`): Abschnitte mit „Kern in einem Satz“, „Zusammenfassung“, „Überblick“
- Keine Flue-Markenlogos in Abbildungen; Framework-Begriffe im Text sind ok
+64
View File
@@ -0,0 +1,64 @@
# Epilog
## Kontrolle ist das Produkt
Coding-Agents werden bleiben. Sie werden besser planen, mehr Tools bedienen und
tiefer in Repositories greifen. Die strategische Frage für Unternehmen ist
deshalb nicht, *ob* man sie nutzt, sondern ob man die Vertrauensgrenze zum
Modell und zu den Werkzeugen **gestaltet** – oder sie dem Zufall, der Demo und
dem nächsten System-Prompt überlässt.
Dieses Buch hat argumentiert: Die produktive Einheit ist nicht „das LLM“,
sondern der **Harness** – Context, Policy, Gateway, Sandbox, Permissions,
Audit. Flue und vergleichbare Frameworks geben dafür Nähte und Hooks. Die
Sicherheit entsteht, wenn Sie diese Nähte schließen und betreiben.
## Was zusammengehört
| Schicht | Aufgabe in einem Satz |
|---------|------------------------|
| Bedrohungsmodell | wissen, was nie gesehen und nie getan werden darf |
| Datenfluss | Trust-Grenze zum Modell zeichnen und budgetieren |
| DLP + Entropie | Bekanntes und „sieht aus wie Secret“ filtern |
| Sandbox | Ausführung vom Host- und Geheimnisraum trennen |
| Permissions | Least Privilege deterministisch erzwingen |
| Logging | Entscheidungen belegen, Payloads arm halten |
| Enterprise-Patterns | Verträge, Rollen, Change, Evidence |
| Playbooks | im Ernstfall dieselbe Reihenfolge fahren |
Einzelne Maßnahmen ohne die anderen erzeugen Lücken: Filter ohne Sandbox,
Sandbox ohne Permissions, alles ohne Audit, Audit ohne Playbooks.
## Drei Sätze zum Mitnehmen
1. **Was das Modell nicht sehen muss, darf es nicht sehen.**
2. **Was der Agent nicht tun muss, darf er nicht können.**
3. **Was Sie im Audit nicht zeigen können, gilt als nicht kontrolliert.**
Bauen und betreiben Sie entlang dieser Sätze. Alles andere – beeindruckende
Demos, maximale Autonomie, „der Prompt verbietet das schon“ – darf Prototyp
bleiben, bis die drei Sätze grün sind.
## Ein pragmatischer Start
Wenn Sie morgen beginnen:
1. Model-Calls nur noch über ein Gateway mit Allowlist
2. Deny für offensichtliche Secret-Pfade + Basis-DLP
3. Keine freie Shell als Default-Tool
4. Session-Audit mit `policy_version`
5. Kill-Switch und ein Playbook „Session kill / Key rotate“
Danach kalibrieren, nicht eskalieren: Entropie, strengere Sandbox, Residenz,
Evidence-Paket. Perfektion ist kein Launch-Kriterium – **messbare Kontrolle**
schon.
## Schluss
Agents skalieren Können und Risiko zugleich. Wer nur das Können skaliert,
exportiert das Risiko an Vendor, Log-Pipeline und den unaufmerksamsten
Commit der Woche. Wer Kontrolle als Produkt baut, kann Freigaben argumentieren,
Incidents abarbeiten und den Nutzen behalten.
Bauen Sie den Harness so, dass Security „Ja – unter diesen Grenzen“ sagen kann,
statt dauerhaft nur „Nein, bis die Demo abgeschaltet ist“.
+139
View File
@@ -0,0 +1,139 @@
# Glossar
Die Einträge folgen der Terminologie dieses Buchs. Wo englische Fachbegriffe
im Alltag dominieren, steht die gebräuchliche Form voran.
**Agent (Coding-Agent)**
: System, das ein LLM mit Tools, Kontextbeschaffung und oft einer
Mehrschritt-Schleife kombiniert, um Softwareaufgaben auszuführen – nicht nur
Text vorzuschlagen.
**Agent-Harness**
: Laufzeit- und Orchestrierungsschicht um ein LLM: Context Builder, Policy,
Gateway, Tool-Router, Sandbox-Anbindung und Observability. Zentraler Ort für
Security-Controls (Kapitel 2).
**Allowlist / Denylist**
: Explizite Positiv- bzw. Negativliste (Pfade, Hosts, Binaries, Modelle). Deny
by default plus Allowlist ist der Standard dieses Buchs.
**Approval Gate**
: Menschliche oder ticketgebundene Freigabe vor riskanten Tool-Calls (typisch
Risk-Klasse R3/R4).
**Audit-Trail**
: Nachvollziehbare Ereigniskette zu Entscheidungen und Nebenwirkungen
(Policy, Tools, Approvals, Model-Calls) – payload-arm, metadaten-reich
(Kapitel 9).
**Blast Radius**
: Maximaler Schaden bei Fehlverhalten, Kompromittierung oder Fehlbedienung
einer Session bzw. eines Profils.
**Break-glass**
: Zeitlich eng begrenzte Notfall-Erweiterung von Rechten; immer mit Audit und
TTL (Kapitel 11).
**Context Builder**
: Harness-Komponente, die Quellen selektiert, Chunks bildet und den
Modell-Kontext unter Budget zusammenstellt (Kapitel 4).
**Datenklassifikation**
: Einordnung von Repos/Inhalten (z. B. öffentlich, intern, vertraulich,
reguliert); steuert Agent-Profile und Gateway-Zonen (Kapitel 10).
**DLP (Data Loss Prevention)**
: Maßnahmen gegen unerwünschten Abfluss sensibler Daten; hier vor allem
vor dem Model-Call und auf Tool-Outputs (Kapitel 5–6).
**Entropie-Filter**
: Detektion hochzufälliger Zeichenketten als Secret-Kandidaten, ergänzend zu
Pattern Matching (Kapitel 6).
**Fingerprint**
: Nicht umkehrbarer Hash/Identifier eines Treffers für Logs und Korrelation –
ohne Secret-Klartext.
**Flue**
: TypeScript Agent-Harness, der in diesem Buch als architektonischer
Bezugspunkt dient (ohne Marken- oder API-Handbuchanspruch).
**Least Privilege**
: Minimale Rechte für Zweck und Dauer einer Aufgabe bzw. Session (Kapitel 8).
**Model Gateway**
: Kontrollierter Zugang zu LLM-Anbietern: Endpoint-Allowlist, Auth, Residenz,
Retention-Flags (Kapitel 4, 10).
**Output-Scan**
: Filterung der Modellantwort bzw. von Tool-Ergebnissen auf Secrets und
Policy-Verstöße vor Weitergabe oder Persistenz.
**Policy-as-Code**
: Versionierte, getestete und reviewte Regeln (Scopes, DLP, Pfade) als
Artefakt – nicht als System-Prompt-Text.
**Policy-Version**
: Explizite Versionskennung der geltenden Regeln; Pflichtfeld in Audit-Events.
**Prompt Injection**
: Manipulation des Agent-Verhaltens über eingeschleusten Text in
Nutzer- oder Kontextquellen (direkt oder indirekt).
**Quarantine**
: Aktion, bei der Material nicht in den Prompt geht, sondern in einen
Review-Pfad (Ticket/Security-Queue).
**Redaction**
: Ersetzen oder Maskieren sensibler Passagen (z. B. durch Platzhalter mit
Klasse und Fingerprint) vor dem Weitergeben.
**Residenz-Zone**
: Policy-gesteuerte Zuordnung von Workloads zu Regionen/Anbietern
(z. B. `eu-prod`, `us-exp`).
**Retention-Tier**
: Getrennte Aufbewahrungsklassen für Metrics, Audit, Debug und optional
Prompt-Archive (Kapitel 9–10).
**Risk-Klasse (R0–R4)**
: Einordnung von Tool-Operationen nach Wirkung: Lesen, Workspace-Write,
Ausführung, externe Seiteneffekte, Secrets/IAM (Kapitel 8).
**Sandbox**
: Isolierte Ausführungsumgebung für Agent-Tools und -Aktionen; Stufen von
Process-Isolation bis Remote Execution (Kapitel 7).
**Schattenmodus**
: Betrieb von Filtern mit Log/Observe ohne Enforce; zur Kalibrierung vor dem
harten Block (Kapitel 5–6).
**Scope**
: Grobe Fähigkeitsberechtigung einer Session (z. B. `fs:read`, `shell:test`).
**Session**
: Gebundener Agent-Lauf mit Identity, Scopes, Policy-Version und Trace-ID.
**Shannon-Entropie**
: Maß für die mittlere Informationsdichte/Zufälligkeit in einem
Zeichenfenster; Basis vieler Entropie-Heuristiken (Kapitel 6).
**Source-ID**
: Stabile Kennung einer Kontextquelle (Datei, Tool-Output, Suche) für Audit
und Redaction-Nachvollziehbarkeit.
**STRIDE**
: Klassisches Threat-Modeling-Schema (Spoofing, Tampering, Repudiation,
Information Disclosure, Denial of Service, Elevation of Privilege);
in Kapitel 3 agent-spezifisch ausgeprägt.
**Tool Permission**
: Explizite Berechtigung und Argumentbeschränkung für Agent-Werkzeuge im
Harness (Kapitel 8).
**Trust-Zone**
: Abstrakte Vertrauensgrenze im Datenfluss (z. B. Workspace, Harness, Model,
Nebenkanäle) – Kapitel 4.
**TTL (Time to Live)**
: Ablaufzeit für Ausnahmen, Allowlist-Einträge und Break-glass-Rechte.
@@ -0,0 +1,144 @@
# 1 Warum sichere Coding-Agents?
## Kern in einem Satz
Coding-Agents erweitern die Angriffsfläche von „Code schreiben“ auf „Code,
Kontext und Aktionen steuern“ – ohne Security-by-Design wird Produktivität zum
Risikotransfer an das LLM.
## Überblick
Ein klassischer Autocomplete-Vorschlag riskiert vor allem schlechten Code. Ein
Coding-Agent riskiert **Datenabfluss, unerwünschte Aktionen und fehlende
Nachweise**. Er liest Repositories, führt Tools aus, schreibt Patches und
sendet Kontext an Modelle – oft in einer Schleife, die schneller ist als der
menschliche Review.
Dieses Kapitel begründet, warum Security hier nicht „später“ kommt, was
„Enterprise-ready“ operational bedeutet und welche Fehlannahmen Teams in
Pilotprojekten systematisch in die Irre führen.
## Vom Assistenten zum Akteur
| Eigenschaft | Chat-Assistent | Coding-Agent |
|-------------|----------------|--------------|
| Kontext | Nutzer fügt ein | Agent holt sich Dateien, Diffs, Logs |
| Wirkung | Textvorschlag | Tool-Calls, Writes, Builds, ggf. Tickets |
| Geschwindigkeit | eine Antwort | viele Schritte pro Minute |
| Fehlerbild | falsche Antwort | falsche Antwort *plus* Seiteneffekt |
| Audit-Bedarf | oft gering | hoch (wer hat was ausgelöst?) |
Die Sicherheitsfrage verschiebt sich von „Halluziniert das Modell?“ zu:
- Was hat es **gesehen**?
- Was hat es **getan**?
- Können wir beides **belegen und begrenzen**?
## Die neue Angriffs- und Fehlerfläche
### Datenkanäle
- Quellcode und interne Specs
- Secrets in Env, Config, CI-Ausgabe, Kommentaren
- PII in Fixtures, Logs, Seed-Daten
- Drittinhalte (Dependencies, Issues, READMEs) mit Injection-Potenzial
### Aktionskanäle
- Dateisystem und Git
- Shell und Package-Manager
- interne und externe APIs
- ggf. Deploy- und Ticket-Systeme
### Vertrauensgrenzen
- IDE/Laptop ↔ Agent-Harness
- Harness ↔ Model-Anbieter
- Harness ↔ Sandbox/Tool-Runtime
- Logs/Telemetrie als stiller vierter Kanal
Jeder Kanal, der ohne Policy wächst, skaliert Risiko mit der Adoption.
## Was „Enterprise-ready“ hier bedeutet
Nicht: „läuft in Kubernetes“ oder „hat ein SOC2-Logo auf der Vendor-Website“.
Sondern operationalisierbare Eigenschaften:
| Eigenschaft | Konkret |
|-------------|---------|
| **Datenminimierung** | nur task-relevanter Kontext ans Modell |
| **Abflusskontrolle** | DLP/Entropie, Deny-Pfade, Output-Scan |
| **Least Privilege** | Scopes, Schemas, Approvals |
| **Begrenzter Blast Radius** | Sandbox-Stufen, Timeouts, Kill-Switch |
| **Nachvollziehbarkeit** | Audit-Events mit Policy-Version |
| **Anschlussfähigkeit** | IAM, SIEM, Change, Incident, Verträge |
| **Betrieb** | Playbooks, SLOs, Exception mit TTL |
Ein Agent, der beeindruckende Demos liefert, aber keine dieser Eigenschaften
testbar erfüllt, ist ein **Schattenkanal** – auch wenn er in der offiziellen
IDE-Sidebar wohnt.
## Warum „später absichern“ scheitert
1. **Gewohnheit schlägt Policy.** Läuft der Agent drei Monate ohne Filter,
gelten Filter als Regression.
2. **Kontext-Caches und Prompts** speichern Vergangenheit; späte Filter fangen
nicht, was schon draußen war.
3. **Schatten-Workarounds** (private Keys, Consumer-Chat) entstehen, sobald die
offizielle Strecke zu spät kommt und zu weh tut.
4. **Audit fragt nach operating effectiveness** – Design-Absicht ohne History
reicht nicht.
Security-by-Design heißt hier: Harness-Hooks und Default-Deny *bevor*
flächendeckendes Rollout.
## Typische Fehlannahmen
| Annahme | Realität |
|---------|----------|
| „Das Repo ist intern, also darf alles in den Prompt.“ | Intern ≠ freigegeben für Drittanbieter-Inferenz; Fixtures und Logs sind oft prod-nah. |
| „Der Vendor speichert nichts – Compliance erledigt.“ | Vertrag ≠ technische Enforce; Missbrauchsfilter, Support, Retries existieren. |
| „Logging der Antworten reicht als Audit.“ | Entscheidungen liegen in Tool-Calls, Denies, Approvals – nicht nur in der Prosa. |
| „Sandbox = Docker, fertig.“ | Socket-Mounts, Secret-Env und offenes Netz entwerten die Isolation. |
| „Der System-Prompt verbietet Gefährliches.“ | Probabilistisch, injizierbar, nicht audit-tauglich als Control. |
| „Nur böse Angreifer sind relevant.“ | Unachtsamkeit und Fehlkonfiguration dominieren den Alltag. |
Die späteren Kapitel ersetzen jede Zeile durch prüfbare Patterns.
## Wer profitiert – und wer bremst
**Profitieren:** Teams mit klaren Profilen, schnellerem Review unkritischer
Änderungen, weniger Copy-Paste in unkontrollierte Chat-UIs, besseren Argumenten
gegenüber Security.
**Bremsen (berechtigt):** Datenschutz, Revision, Betreiber kritischer Systeme –
solange Nachweise fehlen. Das Buch liefert die technische Seite dieser
Nachweise; die organisatorische Einbettung steht in Kapitel 10–11.
## Lesepfad in den Rest des Buchs
```
Kap. 2 Harness-Schichten (wo Controls sitzen)
Kap. 3 Bedrohungsmodell (was wir schützen)
Kap. 4–6 Datenpfad zum Modell
Kap. 7–8 Aktionspfad (Sandbox, Permissions)
Kap. 9–11 Nachweis und Betrieb
```
## Checkliste: Brauchen wir dieses Buch *jetzt*?
- [ ] Agents lesen mehr als der Nutzer explizit einfügt
- [ ] Tools können schreiben oder Shell ausführen
- [ ] Kontext geht an Modelle außerhalb des reinen Intranet-Trusts
- [ ] Security oder Compliance hat Freigabe noch nicht erteilt – oder unter Vorbehalt
- [ ] Es gibt keine versionierte Policy und kein Session-Audit
- [ ] Ausnahmen existieren „mündlich“ ohne TTL
Je mehr Haken, desto teurer wird Warten.
## Zusammenfassung
Coding-Agents sind Akteure mit Daten- und Aktionskanälen. Produktivität ohne
Security-by-Design ist Risikotransfer an Modelle, Vendor und Zufall.
Enterprise-ready heißt: minimieren, begrenzen, nachweisen, betreiben – testbar,
nicht deklamatorisch. Kapitel 2 verortet diese Anforderungen im Harness.
+199
View File
@@ -0,0 +1,199 @@
# 2 Flue-Architektur: der Agent-Harness
## Kern in einem Satz
Der Harness orchestriert Tools, Kontext, Policies und Laufzeit – und ist damit
der natürliche Ort für Security-Kontrollen, nicht der System-Prompt.
## Überblick
Ein Agent-Harness sitzt zwischen Nutzer, Tools und LLM. Er entscheidet, welcher
Kontext aufgebaut wird, welche Werkzeuge existieren, wie Ergebnisse
zurückfließen und welche Telemetrie entsteht. **Flue** dient in diesem Buch als
TypeScript-Bezugspunkt für genau diese Schicht: benannt, aber nicht als
Produkthandbuch.
Wer den Harness kontrolliert, kontrolliert den Daten- und Aktionsraum. Wer nur
das Modell „promptet“, verwaltet Symptome.
## Harness vs. Modell vs. IDE
| Komponente | Aufgabe | Determinismus |
|------------|---------|----------------|
| **IDE / UI** | UX, Anzeige, lokale Shortcuts | n/a |
| **Harness** | Orchestrierung, Policy, Tools, Context | hoch (Ihrer Implementierung) |
| **Modell** | Token-Vorhersage / Planung in Sprache | probabilistisch |
| **Gateway** | Zugang zum Modell (Vertrag, Region) | hoch, wenn Allowlist |
| **Sandbox** | Ausführungsumgebung der Tools | hoch, wenn isoliert |
Security-Controls, die auditierbar sein sollen, gehören in Harness, Gateway und
Sandbox. Das Modell darf Vorschläge machen – es darf nicht die Policy *sein*.
## Schichtenmodell
```
┌─────────────────────────────────────────┐
│ Session / Identity / IAM │
├─────────────────────────────────────────┤
│ Orchestrator (Loop, Budgets, Stop) │
├─────────────────────────────────────────┤
│ Context Builder │ Policy Engine │
│ (Retrieval) │ (Scopes, DLP hooks) │
├─────────────────────────────────────────┤
│ Model Gateway │ Tool Router │
├─────────────────────────────────────────┤
│ Tool Runtime / Sandbox │
├─────────────────────────────────────────┤
│ Observability (Audit, Metrics) │
└─────────────────────────────────────────┘
```
### Session / Identity
- Wer startet den Agent? Mensch, CI-Bot, Service-Account?
- Welche Rolle und welches Repo-Label gelten?
- Session-ID für den gesamten Loop (Kapitel 9)
Ohne Identity keine Attribution und keine rollenbasierten Default-Scopes
(Kapitel 8 und 10).
### Orchestrator
- Agent-Loop: Modellvorschlag → Tool → Observation → erneut
- Begrenzungen: max. Schritte, Token-Budget, Wanduhr-Timeout
- Kill-Switch und Loop-Detection (Kapitel 11)
Der Orchestrator ist der Ort für **Stop-Bedingungen**, die nicht vom Modell
„ausverhandelt“ werden.
### Context Builder
- holt Dateien, Diffs, Suchtreffer, Tool-Outputs
- vergibt Source-IDs
- übergibt Chunks an Policy Gate und DLP (Kapitel 4–6)
- baut die Message-Liste unter Budget
Hier entscheidet sich, ob „hilfsbereit“ zu „datenhungrig“ wird.
### Policy Engine
- Pfad- und Tool-Regeln
- Risk-Klassen und Approvals
- versionierte `policy_version`
Idealerweise ein Modul, das **Unit-Tests** kennt – kein verstreutes `if` in
zehn Adaptern.
### Model Gateway
- nur freigegebene Endpoints und Modelle
- Auth als Workload-Identity
- Residenz- und Retention-Flags
- kein Seiteneinstieg aus Tools heraus (Kapitel 4, 10)
### Tool Router und Runtime
- Schema-Validierung der Argumente
- Permission-Check
- Ausführung in Sandbox-Profil der Risk-Klasse (Kapitel 7–8)
- Output zurück durch DLP in den Context Builder
### Observability
- strukturierte Events, keine Secret-Klartexte
- Metriken für DX und Security (Kapitel 9)
## Daten- und Kontrollfluss (Happy Path)
```
1. User-Auftrag + Session-Policy
2. Context Builder selektiert Quellen
3. Policy Gate + DLP/Entropie
4. Komposition → Gateway → Modell
5. Tool-Vorschlag → Permission → Sandbox
6. Tool-Output → DLP → Context
7. ggf. weitere Iterationen bis Stop
8. Ergebnis an UI; Audit-Events parallel
```
Abbrüche an 3 oder 5 sind **Erfolge der Kontrolle**, keine bloßen Fehler –
sofern die UX den Grund verständlich macht.
## Warum nicht „nur das Modell“?
Modelle:
- halten Policy nicht verlässlich ein,
- sind anfällig für Injection in Kontextquellen,
- liefern keine revisionssicheren Entscheidungslogs im Sinne Ihrer Governance.
Deterministische Schichten:
- Filter und Allowlists,
- Schema-Validatoren,
- Sandboxes und Net-Policies,
- signierte oder zumindest versionierte Policy-Artefakte,
sind die Controls, die Sie in einem Audit *zeigen* können.
## Flue als Bezugspunkt (ohne Feature-Katalog)
In einem TypeScript-Harness wie Flue erwarten Sie typischerweise:
- typisierte Tool-Definitionen (Eingabe-Schemas),
- erweiterbare Middleware/Hooks um Context und Tool-Calls,
- eine zentrale Loop-Implementierung,
- austauschbare Model-Clients.
Dieses Buch setzt genau dort an: **Hooks vor dem Model-Call, vor dem Tool-Call
und nach dem Tool-Output**. Konkrete API-Namen ändern sich – die Nahtstellen
bleiben.
Wenn Sie einen anderen Harness nutzen, mappen Sie:
| Dieses Buch | Ihre Codebase |
|-------------|----------------|
| Context Builder | retrieval / prompt assembler |
| Policy Engine | authz / rules module |
| Gateway | LLM client wrapper |
| Tool Runtime | executor / worker |
| Observability | logger / tracer |
## Integrationsflächen
| Integration | Risiko ohne Kontrolle |
|-------------|----------------------|
| IDE-Plugin | lokaler Secret-Zugriff, unklare Identity |
| CI | hohe Rechte, Secrets in Env, parallele Jobs |
| Chat-UI intern | Prompt-Archive, Schattenkopien |
| Ticket-Bot | Seiteneffekte nach außen (R3) |
Dieselbe Harness-Policy sollte Profile pro Fläche liefern, nicht fünf
Implementierungen mit fünf Lücken.
## Anti-Pattern in der Architektur
1. **SDK-Calls am Harness vorbei** aus Utility-Skripten
2. **Policy nur im IDE-Client**, Server vertraut blind
3. **Ein God-Object-Loop** ohne testbare Policy-Module
4. **Gemeinsame Credentials** für Gateway und Tool-Cloud
5. **Logs im selben Bucket wie Prompt-Volltext und Metrics**
## Checkliste: Harness security-ready?
- [ ] Eine Session-ID über den gesamten Loop
- [ ] Kein Model-Call außerhalb des Gateways
- [ ] Context-Chunks passieren Gate + DLP
- [ ] Tool-Calls passieren Schema + Permission + Sandbox
- [ ] Tool-Outputs erneut durch DLP
- [ ] `policy_version` und `agent_version` in Telemetrie
- [ ] Stop-Bedingungen unabhängig vom Modell
- [ ] Profile für IDE vs. CI getrennt konfigurierbar
## Zusammenfassung
Der Agent-Harness ist die Kontrollfläche: Identity, Context, Policy, Gateway,
Tools, Sandbox, Audit. Flue ist ein TypeScript-Beispiel für genau diese Schicht;
die Patterns lassen sich auf andere Harnesses mappen. Kapitel 3 ergänzt die
Architektur um ein explizites Bedrohungsmodell – damit die Hooks an den
richtigen Risiken ansetzen.
+170
View File
@@ -0,0 +1,170 @@
# 3 Bedrohungsmodell für Coding-Agents
## Kern in einem Satz
Ohne explizites Bedrohungsmodell werden Filter und Sandboxes zur Kosmetik:
zuerst Assets und Angreiferpfade, dann Controls.
## Überblick
Kapitel 2 hat die Harness-Schichten benannt. Dieses Kapitel beantwortet, *wogegen*
sie arbeiten: welche Assets schützenswert sind, wer oder was sie gefährdet, und
welche Kontrollziele die späteren Kapitel bedienen.
Ein brauchbares Agent-Security-Design beginnt nicht mit dem schönsten Prompt,
sondern mit zwei Sätzen:
1. Was darf **niemals** ins Modell?
2. Was darf der Agent **niemals** tun?
## Scope des Modells
**In scope:** Coding-Agents mit Repo-Zugriff, Tool-Ausführung und LLM-Gateway
in Unternehmenskontexten (IDE und CI).
**Out of scope (hier):** physische Sicherheit, klassische Web-App-OWASP im
Detail, vollständige Lieferkettenanalyse aller Dependencies – außer wo sie den
Agent-Pfad kreuzen.
Annahmen (anpassen, nicht ignorieren):
- Entwickler sind keine Angreifer, aber **fehlbar** und unter Zeitdruck.
- Das Modell ist **unzuverlässig** bzgl. Policy und kann injiziert werden.
- Der Model-Anbieter liegt **außerhalb** des Repo-Trusts, auch mit DPA.
- Tools sind **APIs mit Seiteneffekten**, nicht „Funktionen ohne Risiko“.
## Assets
| Asset | Warum wertvoll | Typische Agent-Berührung |
|-------|----------------|---------------------------|
| Quellcode & Specs | IP, Angriffsfläche, Roadmap | Retrieval, Diffs |
| Secrets | Account-Übernahme, Cloud-Kosten | `.env`, Logs, Config |
| PII / Kundendaten | Regulierung, Vertrauen | Fixtures, Dumps, Tickets |
| Interne Infrastruktur-Infos | Lateral Movement | Hostnamen, Runbooks |
| Tool-Fähigkeiten | Wirkung in Repo und Netz | Shell, APIs |
| Prompt-/Response-Inhalte | Vertrag, Leak, Training | Gateway, Logs |
| CI- und Cloud-Identitäten | hohe Privilegien | Agent in Pipeline |
| Vertrauenswürdigkeit des Builds | Supply Chain | install/build tools |
Priorisieren Sie Assets **pro Repo und Datenklasse** – nicht jede Sandbox-Stufe
für jedes Hobby-Skript.
## Akteure und Fehlermodi
| Akteur / Modus | Beispiel | Primäres Asset |
|----------------|----------|----------------|
| Unachtsamer Insider | Agent liest Secrets „hilfsweise“ | Secrets, PII |
| Malicious Insider | gezielte Exfil über Agent-Kontext | IP, Secrets |
| Prompt Injection (indirekt) | Anweisung in README/Issue/Dependency | Tools, Daten |
| Externe Angreifer auf Supply Chain | kompromittiertes Postinstall | Runtime, Credentials |
| Fehlkonfiguration | zu breite Scopes, offenes Netz | alles |
| Vendor-/Gateway-Seite | Retention, Support, Breach | Prompt-Inhalte |
| Automatischer Loop | Kosten, Spam, Selbstverstärkung | Verfügbarkeit, Geld |
Der häufigste produktive Fall in vielen Organisationen ist die **Kombination
aus Unachtsamkeit und Fehlkonfiguration**, nicht der Film-Angreifer. Das Modell
muss trotzdem Injection und Privilege-Expansion abdecken.
## STRIDE für Coding-Agents
| STRIDE | Agent-spezifische Ausprägung | Control-Schwerpunkt |
|--------|------------------------------|---------------------|
| **S**poofing | fremde Session, gestohlene IDE-Tokens, CI-Identity missbraucht | IAM, Session-Bindung (Kap. 2, 8, 10) |
| **T**ampering | manipulierte Tool-Outputs als „Wahrheit“, vergifteter Kontext | Schema, Sandbox, untrusted-Markierung (Kap. 4, 7, 8) |
| **R**epudiation | „wer hat deployed / geleakt?“ unbeantwortbar | Audit-Events (Kap. 9) |
| **I**nformation Disclosure | Secrets/PII/IP an Modell oder Log | DLP, Entropie, Gateway, Logging-Hygiene (Kap. 4–6, 9) |
| **D**enial of Service | Token-Burn, Tool-Loops, Platte voll | Budgets, Rate-Limits, Kill-Switch (Kap. 2, 11) |
| **E**levation of Privilege | Agent > Nutzer-Rechte, Sandbox-Escape, Prod-API | Permissions, Sandbox, Approvals (Kap. 7–8) |
## Angriffspfade (skizziert)
### Pfad D1 — Secret in den Prompt
```
Datei/Log mit Secret → Context Builder ohne Gate
→ kein/ schwaches DLP → Gateway → Anbieter
```
**Mitigation:** Deny-Pfade, Pattern+Entropie, Output-Scan, kein Secret-Env in
der Tool-Runtime (Kap. 4–7).
### Pfad D2 — Prompt Injection zu Tool-Missbrauch
```
Untrusted Datei → Modell folgt Anweisung
→ mächtiges Tool (shell/net) → Exfil oder Zerstörung
```
**Mitigation:** enge Tools, Argument-Schemas, Default-deny Netz, Approvals,
untrusted Source-Flag (Kap. 7–8).
### Pfad D3 — Log als zweites Leck
```
DLP blockt Prompt → Debug-Log schreibt Match-Klartext
→ breiter Ops-Zugriff
```
**Mitigation:** Fingerprint-only, Retention-Tiers (Kap. 9).
### Pfad D4 — Privilege über CI
```
Agent in Pipeline mit Deploy-Rolle → Injection oder Bug
→ Produktion
```
**Mitigation:** getrennte Identitäten, R3 nur mit Approval, remote starke
Sandbox (Kap. 8, 10).
## Kontrollziele (Mapping auf das Buch)
| Kontrollziel | Kapitel |
|--------------|---------|
| Datenminimierung und Trust-Grenze Modell | 4 |
| Erkennung bekannter Secret-/PII-Formate | 5 |
| Erkennung unbekannter high-entropy Secrets | 6 |
| Begrenzung der Ausführungsumgebung | 7 |
| Least Privilege und Approvals | 8 |
| Nachweis und forensische Korrelation | 9 |
| Governance, Vendor, Rollen | 10 |
| Incident- und Betriebsreaktion | 11 |
Wenn ein späteres Pattern kein Ziel aus dieser Liste trifft, ist es
Dekoration – oder Ihr Modell ist unvollständig und muss erweitert werden.
## Bedrohungsmodell pflegen
- **Trigger:** neues Tool, neues Gateway, neues Repo-Label, Incident, Vendor-Wechsel
- **Output:** aktualisierte Asset-Liste, Top-Pfade, explizite Non-Goals
- **Owner:** Platform + Security gemeinsam
- **Artefakt:** kurze Living Doc, nicht 80 Seiten, die niemand liest
Ein Modell, das nur zur initialen Freigabe existiert, veraltet mit dem ersten
zusätzlichen `curl`-Tool.
## Anti-Pattern
1. **STRIDE als ausgefülltes Formular ohne technische Folge**
2. **Nur externe Angreifer modellieren, Insider-Fehler ignorieren**
3. **Assets = „die Cloud“** ohne Secrets/PII/Tools zu trennen
4. **Threat Model copy-pasten** von Chatbots ohne Repo-Realität
5. **Controls sammeln**, die kein Ziel adressieren
## Checkliste: Modell sessionstauglich?
- [ ] Assets priorisiert (Top 5 reichen für den Start)
- [ ] Mindestens Pfade D1–D3 bewertet
- [ ] STRIDE-Zeilen mit Control-Verweis
- [ ] Annahmen dokumentiert (Vendor-Trust, IDE vs. CI)
- [ ] Non-Goals benannt
- [ ] Review-Termin oder Trigger definiert
- [ ] Mapping auf Kapitel/Implementierungs-Backlog
## Zusammenfassung
Bedrohungsmodellierung für Coding-Agents macht aus Bauchgefühl eine
priorisierte Kontroll-Landkarte: Assets, Akteure, STRIDE, konkrete Pfade.
Die Antwort auf „Was darf nie ins Modell / nie als Aktion?“ steuert den Rest
des Buchs. Ab Kapitel 4 wird der Datenpfad zum LLM entlang dieser Ziele
technisch ausgebaut.
+235
View File
@@ -0,0 +1,235 @@
# 4 Datenfluss zum LLM steuern
## Kern in einem Satz
Jeder Token, der den Vertrauensbereich verlässt, ist eine bewusste Entscheidung –
oder ein Leck.
## Überblick
Zwischen dem Lesen einer Datei und dem Absenden an ein Sprachmodell liegt der
kritische Pfad eines Coding-Agents. Hier entscheiden Selektion, Redaction,
Budget und Gateway-Policy darüber, ob der Agent hilfreich *und* freigabefähig
ist.
Kapitel 3 hat Assets und Angreiferpfade skizziert. Dieses Kapitel zeichnet die
**Vertrauensgrenze zum Modell** als Architektur: welche Stufen der Datenfluss
hat, welche Prinzipien gelten und wo DLP (Kapitel 5–6), Sandbox und Permissions
(Kapitel 7–8) andocken.
## Warum der Model-Call eine Vertrauensgrenze ist
Ein LLM-Anbieter – intern oder extern – ist aus Sicht Ihrer Organisation oft:
- ein **Auftragsverarbeiter** mit eigenem Retention- und Trainingsregime,
- ein **Netzwerkziel** außerhalb des Repo-Trusts,
- ein System, das Eingaben in Logs, Caches oder Support-Workflows spiegeln kann.
Selbst bei „zero retention“-Verträgen bleiben Prompt-Inhalte für die Dauer der
Inferenz und oft in Fehler- und Missbrauchssystemen sichtbar. Technisch und
vertraglich gilt: **was den Gateway passiert, ist potenziell außerhalb Ihrer
direkten Kontrolle**.
Deshalb ist „alles Relevante in den Kontext“ keine Neutralität, sondern eine
Risikoentscheidung – und sie gehört in den Harness, nicht in den System-Prompt.
## Referenzdatenfluss
```
1. Nutzerauftrag / Systemziele
2. Retrieval (Dateien, Diffs, Tool-Ergebnisse, Suche)
3. Policy Gate (Allow/Deny, Klassifikation, Zweck)
4. DLP / Entropie-Filter ← Kapitel 5–6
5. Kontext-Komposition + Token-Budget
6. Model Gateway (Anbieter, Region, Retention)
7. Antwort-Ingress (Output-Filter, Secret-Scan)
8. Persistenz nur erlaubter Artefakte
```
Die Reihenfolge ist Absicht: **Policy und Filter vor Komposition**, nicht
danach. Wer erst einen 200-k-Token-Kontext baut und dann scannen will, zahlt
Latenz und erhöht die Chance, dass Zwischenspeicher und Debug-Logs bereits
sensible Fragmente halten.
### Stufe 1–2: Auftrag und Retrieval
Der Agent soll nicht „das Repo“ laden, sondern **task-gebunden** selektieren:
- explizite Pfade aus dem Nutzerauftrag
- Suchtreffer mit Rank und Limit
- Diffs gegen einen definierten Base-Branch
- Tool-Outputs nur der aktuellen Session
Jede Retrieval-Quelle bekommt eine **Source-ID** (für Audit und spätere
Redaction-Nachvollziehbarkeit).
### Stufe 3: Policy Gate
Bevor Text in den Filter-Stack geht:
| Prüfung | Beispiel |
|---------|----------|
| Pfad-Allow/Deny | `.env`, `**/*.pem`, Vault-Injects |
| Dateityp / Größe | Binaries, Minified Bundles, Riesen-Logs |
| Datenklassifikation | intern / vertraulich / reguliert |
| Zweckbindung | Task-Typ erlaubt diese Quelle? |
| Tenant-/Repo-Grenze | kein Cross-Repo ohne Policy |
Deny by default für unbekannte oder hochsensible Klassen; Allowlists
versionieren.
### Stufe 4: DLP und Entropie
Siehe Kapitel 5 und 6. An dieser Naht gilt:
- Aktionen `block`, `redact`, `quarantine` sind **Harness-Entscheidungen**
- Klartext von Treffern gehört nicht in Telemetrie
- blockierte Chunks erzeugen maschinenlesbare Fehler für den Agent-Loop
(ohne Secret-Inhalt)
### Stufe 5: Kontext-Komposition und Budget
Nach dem Filtern:
- Nachrichtenrollen (system / developer / user / tool) klar trennen
- **Budget** pro Quelle und gesamt (Tokens, nicht nur Zeichen)
- Priorisierung: Auftrag und aktuelle Fehler > historische Tool-Spuren
- Redacted Platzhalter beibehalten – stilles Weglassen erschwert Debugging
und verleitet zu Riskante „nochmal alles laden“-Schleifen
Budget ist Security: unbegrenzter Kontext belohnt Datenhunger und macht
Injection-Oberflächen größer.
### Stufe 6: Model Gateway
Der Gateway ist mehr als eine HTTP-URL:
| Kontrolle | Frage |
|-----------|--------|
| Anbieter / Endpoint | Welcher Vertrag, welche Region? |
| Modell-ID | Freigegebene Modelle only? |
| Auth | Service-Identität, nicht Entwickler-PAT im Klartext |
| Retention-Flags | wo API es hergibt, explizit setzen und loggen |
| Timeout / Retry | keine unkontrollierten Doppel-Sends mit Secrets |
| Kill-Switch | globales Stoppen bei Incident |
Mehrere Gateways (EU-Prod, US-Experiment, lokales Modell) sind normal –
Routing gehört in Policy, nicht in Ad-hoc-ENV auf Laptops.
### Stufe 7–8: Antwort und Persistenz
- Output auf Secret-Echo und Policy-Verstöße scannen
- Antworten nicht automatisch in ungeschützte Ticket-/Chat-Systeme spiegeln
- Persistenz: Diffs und Zusammenfassungen ja; Roh-Prompts oft nein oder
strengere Retention (Kapitel 9)
## Trust-Zonen (Arbeitsmodell)
| Zone | Beispiele | Typische Regel |
|------|-----------|----------------|
| Z0 Gerät / IDE | lokaler Editor, ungescannte Zwischenablage | Nutzerverantwortung; Agent nicht blind füttern |
| Z1 Workspace | Checkout, Build-Artefakte im Jail | Lesen/Schreiben laut Tool-Policy |
| Z2 Harness | Context Builder, DLP, Orchestrator | Enforcement-Punkt |
| Z3 Model | Anbieter-Inferenz | nur gefilterte, freigegebene Inhalte |
| Z4 Nebenkanäle | SIEM, Tickets, Metrics | redigierte Events, getrennte Retention |
Daten fließen idealerweise **Z1 → Z2 → (Filter) → Z3** und zurück über Z2.
Direkte Sprünge Z0/Z1 → Z3 (Copy-Paste in Consumer-Chat) sind der Schattenpfad,
den Plattform-Teams mit gutem DX und klaren Limits bekämpfen – nicht nur mit
Verboten.
## Designprinzipien
### Deny by default
Unbekannte Pfade, neue Tool-Output-Typen und „mal schnell die ganze monorepo
history“ starten bei Deny oder bei stark gekürzten Summaries – nicht bei Full
Dump.
### Zweckbindung
Kontext nur für den **aktuellen Task**. Ein Agent, der gestern eine DB-Migration
angefaßt hat, darf den gestrigen Schema-Dump nicht still in den heutigen
UI-Bugfix mitnehmen, sofern die Session-Policy das nicht erlaubt.
### Sichtbare Redaction
Platzhalter wie `[REDACTED:aws_access_key_id#a1b2]` sind besser als unsichtbare
Löschung:
- Entwickler verstehen, warum der Agent „blind“ ist
- Security kann Klasse und Regel-ID korrelieren
- das Modell wird nicht zu riskanten Rekonstruktionsversuchen an unvollständigen
Diffs ohne Hinweis verleitet (kein Allheilmittel, aber ehrlicher)
### Minimale Weitergabe
Lieber drei gezielte Dateien als „grep -r und alles anhängen“. Retrieval-Qualität
ist hier eine Security-Kontrolle.
### Separates Logging
Prompt-Volltext, Filter-Metadaten und Tool-Traces haben oft **unterschiedliche**
Rechts- und Retention-Profile. Ein Log-Kanal für alles ist ein Compliance-
Antipattern.
## Anti-Pattern
1. **„Das Modell sieht eh nur Code, keine Prod-Daten“**
Fixtures, Logs und Configs *sind* oft Prod-ähnlich.
2. **Filter nur auf User-Prompt, nicht auf Tool-Output**
Die gefährlichsten Chunks kommen aus `cat`, Test-Logs und Exception-Dumps.
3. **Debug-Modus mit abgeschaltetem Gateway in Staging-Daten**
Staging leakt genauso; Debug-Flags bleiben haften.
4. **Ein globaler System-Prompt als Policy**
„Du darfst keine Secrets senden“ ist keine Kontrolle.
5. **Kontext-Caches ohne Policy-Version**
Alte, unfiltered Chunks überleben Filter-Updates.
## Einbau in den Flue-Harness (konzeptionell)
Unabhängig von konkreten API-Namen:
1. **Context Builder** ruft nur freigegebene Retriever auf
2. Jeder Chunk passiert `policyGate` → `dlpPipeline` → `budgetAccount`
3. **Model Client** akzeptiert ausschließlich Builder-Output (kein Seiteneinstieg)
4. Jeder Call trägt `session_id`, `policy_version`, `gateway_id`
5. Responses laufen durch `outputScan`, bevor sie in History oder Tools gehen
Seiteneinstiege (direkter SDK-Call aus einem Tool) sind zu verbieten oder
gleich streng zu wrappen – sonst ist der Harness Dekoration.
## Messgrößen
| Metrik | Aussage |
|--------|---------|
| Anteil blockierter/redigierter Chunks | Filter greifen / zu laut |
| Tokens pro Task nach Quelle | Datenhunger |
| Calls ohne policy_version | Implementierungslücken |
| Gateway-Verteilung | Residenz- und Vertragskonformität |
| Cache-Hits mit veralteter Policy | Invertierungsrisiko |
## Checkliste
- [ ] Datenfluss-Diagramm Z1–Z3 im Architektur-Repo
- [ ] Policy Gate vor DLP, DLP vor Komposition
- [ ] Denylists für Secret-Pfade und heikle Typen
- [ ] Token-Budgets pro Task-Klasse
- [ ] Nur freigegebene Gateways / Modelle
- [ ] Output-Scan aktiv
- [ ] Kein Prompt-Volltext in Standard-Logs (oder strikte Sonder-Retention)
- [ ] Cache-Invalidierung bei Policy-Wechsel
- [ ] Kein ungewrappter Modell-SDK-Call neben dem Harness
## Zusammenfassung
Der Model-Call ist eine Vertrauensgrenze. Wer sie im Harness zeichnet – mit
Policy Gate, Filtern, Budget und Gateway-Disziplin – kann Nutzen skalieren,
ohne das Datenrisiko im gleichen Maße mitwachsen zu lassen. Die folgenden
Kapitel füllen die Filter- und Aktionsseiten dieser Grenze: zuerst was
*erkannt* wird (DLP, Entropie), später was der Agent *tun* darf (Sandbox,
Permissions).
@@ -0,0 +1,253 @@
# 5 DLP mit Pattern Matching
## Kern in einem Satz
Deterministische Muster (Regex, Detektoren, Allowlists und Denylists) fangen den
großen Teil bekannter Secret- und PII-Formate ab – schnell, erklärbar,
auditierbar.
## Überblick
Pattern-basierte Data Loss Prevention ist die erste Verteidigungslinie vor dem
LLM-Kontext. Sie ersetzt weder Entropie-Analyse noch organisatorische Regeln,
liefert aber etwas, das Security und Compliance sofort brauchen: **vorhersehbare
Treffer mit nachvollziehbarer Begründung**.
In Kapitel 4 lag der Fokus auf dem Datenfluss. Hier wird die erste konkrete
Kontrollschicht ausgearbeitet: Was erkannt wird, welche Aktion folgt, wie man
Regeln versioniert und testet – und warum „ein großer Regex im Harness“ in der
Praxis scheitert.
## Warum Pattern-DLP im Agent-Harness Pflicht ist
Coding-Agents lesen Dateien, Diffs, Terminal-Ausgaben und oft auch
Konfigurationsfragmente. Viele Secrets folgen stabilen Formaten:
- Präfixe wie `AKIA…` (AWS), `sk-…` / `sk-proj-…` (API-Keys gängiger Anbieter)
- PEM-Blöcke (`BEGIN … PRIVATE KEY`)
- JWT-artige Drei-Segmente-Strukturen
- Connection Strings mit `password=` / `Password=`
- Bekannte PII-Formate (E-Mail, IBAN – mit landesspezifischen Varianten)
Ein Musterdetektor braucht keine Modell-Inferenz. Er ist:
1. **schnell** genug für große Diffs und Log-Ausschnitte,
2. **deterministisch** (gleicher Input → gleicher Befund),
3. **auditierbar** (Regel-ID, Version, Match-Offset).
Genau diese drei Eigenschaften fehlen probabilistischen „LLM-als-Scanner“-Ansätzen.
Modelle können helfen, Pattern-Vorschläge zu entwerfen – im Hot Path vor dem
Model-Call gehören sie nicht als alleinige Enforcement-Instanz.
## Detektorklassen
Organisieren Sie Detektoren nach *Asset-Klasse*, nicht nach Dateiendung. Dieselbe
AWS-Key-Regel gilt in `.env`, in einem Stack-Trace und in einem Kommentar.
| Klasse | Beispiele | Typische Aktion |
|--------|-----------|-----------------|
| Cloud-/API-Keys | Präfix + Zeichensatz + Mindestlänge | block oder redact |
| Asymmetrische Secrets | PEM, PKCS#8, SSH private key | block |
| Credentials in URLs/DSNs | `user:pass@host`, JDBC/ODBC | redact |
| Session-Material | JWT, opaque Bearer-Token (formatbasiert) | redact / quarantine |
| PII (jurisdiktionsabhängig) | E-Mail, Telefon, IBAN, nationale IDs | redact oder deny-path |
| Interne Marker | Hostnamen, Ticket-IDs, interne URL-Schemata | policy-gesteuert |
**PII** ist politisch und rechtlich heikler als API-Keys: False Positives treffen
Alltagstext, und die „richtige“ Aktion hängt von Zweckbindung und
Verarbeitungsvertrag ab. Starten Sie eng (klar definierte Formate) und erweitern
Sie mit Fachbereichen – nicht mit einer maximalen Regex-Sammlung am Tag eins.
## Die Pipeline im Harness
```
Rohkontext
→ Normalisierung
→ Matcher-Kette (priorisiert)
→ Aktion (block | redact | quarantine | allow-with-ticket)
→ Telemetrie (ohne Secret-Klartext)
→ (bei allow) weiter zur Kontext-Komposition
```
### Normalisierung
Vor dem Match:
- Unicode-Normalform (mindestens NFC), damit Homoglyphen und kompatible Zeichen
nicht durchrutschen
- optional Zeilenenden vereinheitlichen
- **keine** aggressive Lowercase-Konvertierung global – viele Keys sind
case-sensitiv, und `BEGIN PRIVATE KEY` soll treffsicher bleiben
- Base64-/URL-Decoding nur in **kontrollierten, begrenzten** Pfaden (sonst
DoS und Doppeldeutigkeit)
### Matcher-Kette
Reihenfolge ist Security-Design:
1. **Hochvertrauens-Blocker** (Private Keys, bekannte Cloud-Key-Formate)
2. **Redact-Muster** (E-Mails in erlaubten Code-Kontexten, Connection-Passwörter)
3. **Kontextabhängige Regeln** (nur in bestimmten Pfaden oder MIME-Typen)
4. **Info-only / score** (für Schattenbetrieb und Kalibrierung)
Früher Abbruch bei `block` spart Arbeit und verhindert, dass nachgelagerte
Regeln den Befund „aufweichen“.
### Aktionen im Detail
**block**
Der betreffende Kontextbaustein (Datei, Chunk, Tool-Output) geht nicht an das
Modell. Der Agent erhält eine maschinenlesbare Ablehnung inkl. Regel-ID – nicht
den Secret-Inhalt. Geeignet für klar verbotene Klassen.
**redact**
Treffer werden durch stabile Platzhalter ersetzt, z. B.
`[REDACTED:aws_access_key_id#a1b2]`. Der Platzhalter sollte:
- die *Klasse* nennen (damit der Agent und der Mensch den Kontext verstehen),
- einen *nicht umkehrbaren* Fingerprint tragen (Korrelation in Logs),
- **nicht** den Klartext rekonstruierbar machen.
**quarantine**
Material landet in einem isolierten Review-Pfad (Ticket, Security-Queue), nicht
im Prompt. Sinnvoll bei unklaren, aber riskanten Treffern in Onboarding-Phasen.
**allow-with-ticket**
Ausnahme mit Change- oder Security-Ticket und TTL. Ohne Ablaufdatum wird daraus
eine permanente Policy-Lücke.
## Regelwerk als Code
Behandeln Sie DLP-Regeln wie Produktionscode:
- Versionierung im selben Repo wie der Harness (oder als versioniertes Package)
- Code-Review und CI vor Merge
- SemVer oder Policy-Epoch in jedem Audit-Event
- Unit-Tests mit **positiven und negativen** Fixtures
- Snapshot- oder Contract-Tests gegen bekannte Leak-Korpora (synthetisch!)
### Test-Fixtures – und was nie ins Repo gehört
Fixtures müssen *aussehen* wie Secrets, dürfen aber keine echten sein.
Bewährte Praxis:
- offiziell dokumentierte Beispiel-Keys der Cloud-Anbieter
- klar markierte Fake-Strings (`EXAMPLEKEY…`, `dummy_…`)
- generierte Zufallsstrings, die dem Muster genügen, aber nirgends gültig sind
Echte Incident-Artefakte gehören in ein getrenntes, zugriffsbeschränktes
Archiv – nicht in die Test-Suite des Open- oder Firmenrepos.
### Beispiel: Regelbeschreibung (konzeptionell)
Statt eines undurchsichtigen Super-Regex pro Zeile lohnt eine strukturierte
Regel:
| Feld | Inhalt |
|------|--------|
| `id` | `sec.aws.access_key_id.v3` |
| `class` | `cloud_credential` |
| `pattern` | Präfix + Zeichensatz + Länge |
| `action` | `block` |
| `confidence` | `high` |
| `owners` | Security Platform |
| `tests` | 12 pos / 40 neg |
So bleibt der Audit-Trail sprechend: nicht „Regex 7 hat getroffen“, sondern
eine benannte Kontroll-ID.
## Pfad- und Kontextpolitik
Muster allein sind blind für *wo* etwas liegt. Kombinieren Sie sie mit
Pfad-Policies:
| Pfad / Quelle | Empfehlung |
|---------------|------------|
| `.env`, `.env.*`, `*.pem`, `id_rsa*` | oft: gar nicht erst einlesen |
| `**/secrets/**`, Vault-Agent-Injects | deny by default |
| `package-lock.json` / Checksummen | allow; High-Entropy separat behandeln (Kap. 6) |
| CI-Logs, Stack-Traces | scannen, aggressive Redaction |
| User-Prompt | scannen – Social Engineering und Copy-Paste-Leaks |
**Deny-by-path** vor dem teuren Full-Text-Scan ist oft die beste DLP-Maßnahme:
Was nie im Context Builder landet, muss nicht redigiert werden.
## Performance und Skalierung
Agent-Sessions hängen Diffs und Tool-Ausgaben an. Ein naiver
„gesamten Workspace scannen“-Ansatz bricht Latenz und Kosten.
Praktische Grenzen:
- nur **neu hinzugefügte** Chunks scannen (inkrementell)
- Maximalgröße pro Chunk; darüber: ablehnen oder stubben
- Multi-line-Muster (PEM) brauchen begrenzte Fenster, kein unbegrenztes
Backtracking
- Regex-Engines: catastrophisches Backtracking vermeiden (ReDoS); lieber
lineare oder klar beschränkte Ausdrücke
Messen Sie p95-Latenz der DLP-Stufe getrennt vom Model-Call. Wenn Entwickler
den Agent meiden, weil „jeder Lauf 20 Sekunden filtert“, gewinnen Sie keine
Sicherheit – Sie erzeugen Schatten-IT.
## False Positives und Adoption
Eine zu aggressive Policy ohne Feedback-Kanal führt zu:
1. Entwickler deaktivieren den Filter lokal,
2. oder sie packen Secrets in Formate, die „durchrutschen“,
3. oder sie nutzen den Agent gar nicht und kopieren Code unkontrolliert in
Chat-UIs.
Gegenmittel:
- klare Trefferbegründung in der UI/CLI
- schneller Exception-Prozess mit TTL und Owner
- Telemetrie: Top-Regeln nach False-Positive-Verdacht
- Schattenmodus vor Enforce: erst loggen, dann blocken
## Was Pattern-DLP nicht leistet
- neuartige Token ohne bekanntes Format → Kapitel 6 (Entropie)
- Daten, die syntaktisch harmlos, semantisch aber sensibel sind
(Kundenlisten als CSV mit „normalen“ Spalten)
- Output-Leaks *nach* dem Modell (Modell halluziniert oder wiederholt Secrets)
→ Output-Scan und Session-Hygiene
- organisatorische Freigaben und Verträge → Kapitel 10
## Einbau in den Flue-Harness (konzeptionell)
Unabhängig von konkreten API-Namen gilt dieselbe Hook-Reihenfolge:
1. **vor** dem Zusammenbau der Model-Messages: Chunk-Level-Scan
2. **nach** Tool-Ergebnissen, **bevor** sie in den Kontext zurückfließen
3. optional **nach** der Modellantwort (Secret-Echo)
Jeder Hook schreibt:
- `policy_version`
- `rule_ids[]`
- `action`
- `chunk_id` / Quelle
- **keinen** Klartext des Matches
Damit bleibt DLP im Hot Path und im Audit-Pfad konsistent.
## Checkliste für den ersten Produktionsstand
- [ ] Top-10 Secret-Klassen mit high-confidence block/redact
- [ ] Denylists für offensichtliche Secret-Pfade
- [ ] Redaction-Platzhalter mit Klasse + Fingerprint
- [ ] Fixture-Tests in CI, keine echten Secrets
- [ ] Telemetrie ohne Klartext
- [ ] Exception-Prozess mit TTL
- [ ] p95-Latenz-Budget definiert und gemessen
- [ ] Schattenmodus-Phase vor hartem Enforce dokumentiert
## Zusammenfassung
Pattern-DLP ist das Pflichtprogramm im Agent-Harness: versioniert, getestet,
mit klarer Aktion und ohne Secret-Klartext in den Logs. Sie fängt den Großteil
bekannter Formate ab und schafft die erklärbare Grundlage, auf der Entropie-
Filter und Sandbox aufbauen. Wer hier „später“ sagt, skaliert Datenabfluss mit
jeder erfolgreichen Agent-Demo.
+266
View File
@@ -0,0 +1,266 @@
# 6 Entropie-Filter und unbekannte Secrets
## Kern in einem Satz
Hohe Zufälligkeit in kurzen Token-Fenstern ist ein starkes Signal für Secrets –
auch wenn kein Regex greift.
## Überblick
Pattern Matching kennt nur, was jemand in eine Regel gegossen hat. Viele
produktive Lecks sehen anders aus: frisch generierte Tokens ohne öffentliches
Präfix, interne Session-IDs, Base64-Blöcke aus einem Debug-Dump, „temporäre“
Schlüssel in einem Kommentar von 2019.
Entropie-basierte Filter bewerten, *wie zufällig* eine Zeichenkette wirkt. Sie
schließen die Lücke zwischen „bekanntes Secret-Format“ und „sieht aus wie ein
Schlüssel“. Richtig kalibriert sind sie eine starke zweite Linie – falsch
kalibriert erzeugen sie Lärm und Frust.
Dieses Kapitel erklärt das Signal, die Pipeline, Kalibrierung, Allowlists und
das Zusammenspiel mit Kapitel 5.
## Was „Entropie“ hier meint
In der Praxis genügt oft die **Shannon-Entropie** über ein Fenster von Zeichen
aus einem Alphabet (z. B. alphanumerisch + wenige Symbole):
```
H = - Σ p_i · log2(p_i)
```
Dabei ist `p_i` die relative Häufigkeit des Zeichens *i* im Fenster. Ein
zufällig wirkender API-Token aus 32 Zeichen aus einem 64-Zeichen-Alphabet liegt
nahe an der theoretischen Obergrenze; ein englischer Satz weit darunter.
Wichtige Klarstellungen:
1. Entropie misst **statistische Unvorhersagbarkeit im Fenster**, nicht
kryptographische Sicherheit im strengen Sinn.
2. Ein **kurzes** Fenster auf einem Commit-Hash kann „high entropy“ sein, ohne
dass ein Secret vorliegt.
3. **Niedrige** Entropie schließt Secrets nicht aus (Passwort `Summer2024!` ist
schwach und oft pattern- oder dictionary-basiert besser zu fangen).
Deshalb ist Entropie ein **Score-Signal**, selten ein alleiniger
Block-Entscheider.
## Wann Entropie greift – und wann nicht
### Starke Einsatzfälle
- neu generierte API-Tokens ohne stabiles öffentliches Präfix
- opake Session-Cookies und Bearer-Material
- Base64-/Hex-Blöcke in Configs und Env-Snippets
- Schlüsselmaterial in „nicht standard“-Containern (Custom JSON-Felder)
- Dump-Auszüge aus Debuggers und fehlerhaften Exception-Messages
### Schwache oder irreführende Fälle
| Artefakt | Problem |
|----------|---------|
| Git-Commit-Hashes | hohe Entropie, meist legitim |
| UUIDs / ULIDs | formatbekannt, oft allowlisten |
| Minifizierte Bundles | lange high-entropy-ähnliche Sequenzen |
| Lockfile-Integrities (`sha512-…`) | erwartet, erlaubt |
| Komprimierte/binary-ish Textspuren | Rauschen |
| Natürliche Sprache mit Umlauten | niedrige Entropie, aber PII möglich |
PII mit Prüfziffern und Wörterbuchanteil (Namen, Adressen) gehört **nicht** in
einen reinen Entropie-Blocker.
## Sliding-Window-Pipeline
```
Textchunk
→ Tokenisierung / Kandidatenextraktion
→ Sliding Window (Länge L, Schritt S)
→ Score H (und optional Zusatzfeatures)
→ Schwellwert + Kontextregeln
→ Aktion / Score an Policy
→ Telemetrie
```
### Kandidatenextraktion
Effizienter als „jedes Byte“: zuerst Segmente, die *überhaupt* wie Secrets
aussehen können:
- zusammenhängende Läufe aus `[A-Za-z0-9+/=_\-]` ab Mindestlänge *n*
- Zuweisungen `key = value`, JSON-String-Werte, YAML-Skalarwerte
- Zeilen ohne Whitespace mit hoher Symbol-Dichte
So reduzieren Sie Kosten und False Positives aus Fließtext.
### Fensterparameter
| Parameter | Typische Startwerte (Richtwert) | Kommentar |
|-----------|----------------------------------|-----------|
| L (Fenster) | 16–40 Zeichen | zu klein → Rauschen; zu groß → Mittelung |
| S (Schritt) | 4–8 | Überlappung fängt versetzte Secrets |
| Alphabet | ASCII-druckbar oder Base64-Set | an Kandidaten anpassen |
| Schwelle H_min | kalibrieren, nicht raten | pro Quelle/Dateityp |
**Eine globale Schwelle für alles** ist der häufigste Fehler. `.ts`-Quellcode,
CI-Logs und `.env` brauchen unterschiedliche Profile.
### Zusatzfeatures (empfohlen)
Entropie allein ist dünn. Kombinieren Sie Scores:
- Länge des Kandidaten
- Anteil Ziffern vs. Buchstaben vs. Symbole
- Abstand zu Keywords (`password`, `token`, `secret`, `api_key`, `bearer`)
- Dateipfad-Risiko (aus Kapitel 5)
- ob ein Pattern-Detektor *in der Nähe* bereits schwach getroffen hat
Ein einfaches Policy-Modell:
```
if pattern_high_confidence: action = block/redact
else if entropy_high and keyword_near: action = redact
else if entropy_high and path_risky: action = quarantine
else if entropy_high: action = score_only | redact_soft
else: allow (subject to path policy)
```
## Kalibrierung ohne Drama
### Schattenmodus
1. Entropie-Filter **nur loggen** (action = observe)
2. Stichprobe der Top-Scores manuell labeln (secret / not secret)
3. Precision/Recall schätzen – auch mit kleinen Stichproben ehrlich sein
4. Schwellen und Allowlists justieren
5. Enforce schrittweise: erst redact, dann block für klare Bänder
### Metriken, die zählen
| Metrik | Nutzen |
|--------|--------|
| Treffer pro 1000 Chunks | Last und Lärm |
| Anteil mit Keyword-Nähe | Signalqualität |
| Exception-Rate | ob Teams den Filter umgehen |
| Zeit bis Regel-Fix nach FP-Welle | Betriebsreife |
Optimieren Sie nicht auf „null False Positives“. Optimieren Sie auf **tragbare
False Positives bei akzeptablem Recall** für Ihre Secret-Klassen.
## Allowlists – bewusst und befristet
Allowlists sind notwendig und gefährlich.
**Erlaubt (typisch):**
- Commit-SHA in erlaubten Kontexten (Git-Log-Auszüge, die der Agent sowieso
braucht)
- Package-Integrities in Lockfiles
- bekannte Test-Vektoren mit `EXAMPLE`/`dummy`-Markern
- kurze UUIDs in Trace-IDs, wenn das Format strikt validiert wird
**Regeln für Allowlists:**
- immer mit `id`, Owner, Begründung, **TTL**
- so eng wie möglich (Pfad + Format, nicht „alles Base64“)
- Telemetrie: wie oft greift der Allow-Eintrag?
- Review-Zyklus (z. B. quartalsweise)
Eine Allowlist ohne TTL ist eine Policy-Schuld mit Zinseszins.
## Zusammenspiel mit Pattern Matching
| Signal | Vertrauensstufe | Typische Aktion |
|--------|-----------------|-----------------|
| Pattern match (high) | hoch | block / redact |
| Pattern weak + high entropy | hoch | redact |
| High entropy + Keyword/Pfad | mittel–hoch | redact / quarantine |
| Nur high entropy | mittel | score, soft-redact, oder observe |
| Kein Signal | — | allow im Rahmen der Pfad-Policy |
**Reihenfolge im Harness:** Pattern zuerst (billig, erklärbar), dann Entropie auf
verbleibenden Kandidaten. So vermeiden Sie doppelte Arbeit und nutzen
Pattern-Treffer als harte Gates.
## Output-Seite nicht vergessen
Modelle können Secrets aus dem Prompt **wiederholen** oder aus Trainings-/
Kontextfragmenten ergänzen. Derselbe Entropie-/Pattern-Stack sollte optional
auf die **Modellantwort** laufen, bevor sie:
- in Logs landet,
- in Tickets geschrieben wird,
- oder an nachgelagerte Tools geht.
Das ist keine Garantie gegen alle Leaks – aber ein günstiger zweiter Riegel.
## Missverständnisse
1. **„Entropie ersetzt Vault.“**
Nein. Sie erkennt *Verdacht* im Textstrom. Geheimnisse gehören in ein
Secret-Management, nicht in Repos und nicht in Prompts.
2. **„Höhere Schwelle = sicherer.“**
Zu hoch → Secrets rutschen durch. Zu niedrig → Alert-Müdigkeit.
3. **„ML-Klassierer statt Entropie.“**
Lernende Detektoren können helfen, brauchen aber Trainingsdaten, Drift-
Kontrolle und Erklärbarkeit. Viele Teams fahren mit Entropie + Patterns +
Keywords lange stabiler.
4. **„Einmal kalibriert, fertig.“**
Neue Stacks (andere Lockfiles, andere Token-Formate) verschieben die
Verteilung. Kalibrierung ist Betrieb, kein Projektende.
## Minimaler Implementierungsrahmen (TypeScript-Skizze)
Konzeptionell – keine Framework-Werbung, nur die Nähte im Harness:
```typescript
type EntropyHit = {
start: number;
end: number;
score: number;
previewFingerprint: string; // hash, nie Klartext loggen
};
function scanChunk(text: string, profile: EntropyProfile): EntropyHit[] {
const candidates = extractCandidates(text, profile);
const hits: EntropyHit[] = [];
for (const c of candidates) {
for (const window of slide(c, profile.window, profile.step)) {
const h = shannon(window.value);
if (h >= profile.threshold) {
hits.push({
start: window.start,
end: window.end,
score: h,
previewFingerprint: fingerprint(window.value),
});
}
}
}
return hits;
}
```
Wichtig: Klartext der Fenster **nicht** in strukturierte Logs schreiben. Nur
Fingerprint, Score, Chunk-ID, Policy-Version.
## Checkliste
- [ ] Profile pro Quelle (Code, Env, Log, Lockfile)
- [ ] Pattern-Pipeline läuft *vor* Entropie
- [ ] Schattenmodus mit gelabelter Stichprobe
- [ ] Allowlists mit Owner und TTL
- [ ] Telemetrie ohne Secret-Klartext
- [ ] Optionaler Output-Scan
- [ ] Review-Zyklus für Schwellen dokumentiert
## Zusammenfassung
Entropie-Filter schließen die Lücke, die feste Muster lassen: unbekannte, aber
offensichtlich geheime Token. Sie sind Score-Lieferanten in einer Policy, keine
magische Orakel. Kalibrierung, Allowlists mit TTL und das Zusammenspiel mit
Pattern-DLP entscheiden darüber, ob der Filter schützt – oder nur nervt.
Das nächste Kapitel wechselt die Ebene: von „was das Modell sieht“ zu „was der
Agent *tun* darf“.
+236
View File
@@ -0,0 +1,236 @@
# 7 Sandbox-Strategien
## Kern in einem Satz
Die Sandbox begrenzt, was ein Agent *tun* kann, wenn Prompt oder Tool-Output
unzuverlässig sind – Datenfilter allein reichen nicht.
## Überblick
Kapitel 5 und 6 schützen den **Datenpfad zum Modell**. Dieses Kapitel schützt
den **Aktionspfad**: Dateisystem, Shell, Netzwerk, Cloud-APIs. Coding-Agents
sind nützlich, weil sie handeln. Genau deshalb brauchen sie Isolation.
Prompt Injection, fehlerhafte Tool-Auswahl und schlichte Fehlbedienung enden
sonst nicht in einer peinlichen Antwort, sondern in gelöschten Dateien,
exfiltrierten Secrets über `curl` oder in einer Dependency, die im Hintergrund
nachlädt.
Sandboxing ist kein einzelner Schalter („Docker an“). Es ist eine
**Strategie** aus Isolationsstufen, passend zu Bedrohungsmodell, Datenklasse
und Entwicklerfluss.
## Was die Sandbox leisten soll – und was nicht
### Soll
- Blast Radius begrenzen, wenn der Agent falsche oder injizierte Anweisungen
befolgt
- Host-Geheimnisse und Prod-Zugänge vom Tool-Runtime trennen
- Seiteneffekte auf einen definierten Workspace beschränken
- Nachvollziehbare Grenzen für Security-Reviews und Audits schaffen
### Soll nicht (allein)
- DLP ersetzen (Kontext kann vor der Ausführung bereits geleakt sein)
- Authentizität von Modellausgaben garantieren
- soziales Vertrauen in freigegebene High-Privilege-Tools ersetzen
Sandbox und DLP sind komplementär: Filter begrenzen *Wissen*, Sandbox begrenzt
*Handlung*.
## Angriffs- und Fehlermodi mit Aktionsbezug
| Szenario | Ohne Sandbox | Mit passender Sandbox |
|----------|--------------|------------------------|
| Injizierter Befehl in README | Shell auf Entwicklermaschine | Shell nur in Jail, kein Secret-Mount |
| `rm -rf` im Workspace | Host-Schaden möglich | Ephemeral FS, Snapshot/rollback |
| `curl` Exfil an Angreifer | offenes Netz | Default-deny Egress |
| Paket-Postinstall-Skript | gleiche Rechte wie User | User-Namespace, read-only Root |
| Agent liest `~/.aws` | Credentials im Prozess | Secrets gar nicht gemountet |
## Strategiestufen
Die Stufen bauen aufeinander auf. Springen Sie nicht zu „microVM für alles“,
wenn Process-Isolation und FS-Jail den Risk-Case schon decken – und bleiben
Sie nicht bei „npm test lokal“, wenn untrusted Code im Spiel ist.
### Stufe 1 – Process isolation
- eigener OS-User oder streng reduzierte Privilegien
- Resource-Limits (CPU, RAM, Prozesse) gegen Fork-Bombs und Kostenexplosion
- keine Vererbung unnötiger Environment-Secrets
- harte Timeouts pro Tool-Call
**Geeignet für:** interne Repos, vertrauenswürdige Entwickler, lesende Tools.
### Stufe 2 – Filesystem jail / Workspace-Bindung
- Agent sieht nur einen **dedizierten Worktree** oder Checkout
- Host-Home, SSH-Keys, Browser-Profile: nicht gemountet
- sensible Pfade read-only oder abwesend
- Writes nur unter `workspace/`; Artifacts explizit exportieren
**Pattern:** ephemerer Workspace pro Session, am Ende löschen oder archivieren.
### Stufe 3 – Network policy
Deny by default für Egress, dann Allowlist:
| Ziel | oft erlaubt | oft verboten |
|------|-------------|--------------|
| interner Package-Proxy | ja | direktes Internet |
| Model Gateway | ja (festes Endpoint-Set) | beliebige IP/DNS |
| Git-Internal | ja | ungeprüfte Fremdhosts |
| Metadaten-Dienste (Cloud) | nein | — |
„Netz offen, weil sonst `npm install` scheitert“ ist ein Architekturgeruch:
lösen Sie es mit Proxy und gespiegelten Registries, nicht mit offenem Egress.
### Stufe 4 – Containerisierte Ephemerals
- Container (oder gleichwertig) pro Task/Session
- frisches Dateisystem, definierte Image-Baseline
- TTL und automatisches Tear-down
- keine Docker-Socket-Mounts auf den Host
- Secrets via kurzlebiger Injects, nicht via `~/.config`
**Geeignet für:** gemischte Trust-Level, CI-ähnliche Agent-Läufe, Multi-Tenant-
Plattformen.
### Stufe 5 – Stärkere Isolation / Remote execution
- microVM, gVisor-ähnliche Runtimes, oder dedizierte Build-Agents
- Ausführung **nicht** auf dem Laptop mit Prod-VPN
- getrennte Konten und Netzsegmente
- Ausgabe nur als Review-Artefakt zurück zum Entwickler
**Geeignet für:** regulierte Daten, untrusted Contributions, hohe
Integritätsanforderungen.
## Referenzarchitektur im Harness
```
User / IDE
→ Agent-Orchestrator (Policy, DLP, Approvals)
→ Tool-API (schema-validiert)
→ Sandbox Runtime
→ FS / Shell / Netz (begrenzt)
→ Model Gateway (separater Trust-Pfad)
```
Wichtige Trennung: **Model Gateway** und **Tool Runtime** sind verschiedene
Vertrauens- und Datenpfade. Ein kompromittierter Tool-Container darf keine
beliebigen Prompts an Prod-Modelle mit erweiterten Rechten schicken – und
umgekehrt sollen Model-Credentials nicht in der Tool-Sandbox liegen.
## Auswahlmatrix
| Kontext | Mindeststufe | Kommentar |
|---------|--------------|-----------|
| Nur Lese-Tools, internes Repo | 1–2 | trotzdem kein Secret-Env erben |
| Write + Tests im eigenen Branch | 2–3 | Netz für Registry kontrollieren |
| Dependencies installieren | 3–4 | Postinstall = Code-Ausführung |
| Untrusted Fork / Vendor-Code | 4–5 | Remote bevorzugen |
| Prod-nahe Daten / PII | 5 + DLP | oft: gar kein lokaler Agent |
## Anti-Pattern (häufig in Demos)
1. **Docker mit `$HOME` und Docker-Socket**
Das ist eine Privilegienverlängerung, keine Sandbox.
2. **Gleiche Cloud-Credentials wie der Host**
Isolation der Compute-Schicht ohne Secret-Trennung ist Theater.
3. **Privileged containers „nur kurz“**
Bleiben länger als geplant und werden kopiert.
4. **Sandbox nur für Shell, nicht für „hilfreiche“ File-Tools**
Ein `write_file` außerhalb des Workspaces ist ein Shell-Äquivalent.
5. **Kein Timeout, kein Output-Cap**
Agent-Loops füllen Platten und Rechnungen.
## Zusammenspiel mit Tool-Permissions
Sandbox ohne Permission-Modell (Kapitel 8) bleibt grob: entweder zu eng (Agent
nutzlos) oder zu weit (eine erlaubte Shell frisst die Isolation).
Empfohlene Kette:
1. Tool darf laut Policy existieren (Allowlist)
2. Argumente validieren (Pfade, Hosts, Flags)
3. Ausführung nur in der Sandbox-Stufe der Risk-Klasse
4. Ergebnis zurück durch DLP, bevor es in den Modellkontext geht
Der letzte Punkt schließt die Schleife: selbst erfolgreiche, erlaubte Befehle
können Secrets in stdout drucken.
## Testbarkeit und Nachweis
Sandbox-Strategien gehören in automatisierte Tests:
| Test | Absicht |
|------|---------|
| Secret-path unreachable | `~/.aws` / Env nicht lesbar |
| Egress deny | Verbindung zu Nicht-Allowlist schlägt fehl |
| Workspace escape | `../` und Symlink-Tricks scheitern |
| TTL | Container/Workspace nach Limit weg |
| Resource limit | CPU/RAM-Exhaustion stoppt sauber |
Für Audits speichern Sie:
- Sandbox-Profil-ID und Version
- Image-Digest (falls containerisiert)
- Netz-Policy-Version
- Session-ID und Tear-down-Status
## Betriebsaspekte
### Entwicklererfahrung
Zu langsame oder undurchsichtige Sandboxes erzeugen Umgehungen. Investieren Sie
in:
- warme Image-Caches für erlaubte Baselines
- klare Fehlermeldungen („Netz zu registry.npmjs.org verweigert – nutze Proxy X“)
- lokale Profile, die *strenger* oder gleich streng wie CI sind (nicht lockerer)
### Kosten
Ephemeral Environments kosten CPU und Wartezeit. Gegenstrategien: Pooling
gleicher Profile, Snapshot-FS, gestaffelte Stufen (leichte Sandbox für Read,
schwere nur für Install/Build).
### Incident
Wenn die Sandbox greift (Block, Kill), ist das oft ein **Erfolg**. Playbooks
(Kapitel 11) sollten „Agent sandbox kill“ als Signal führen, nicht nur als
Störungsticket.
## Entscheidungshilfe in einem Absatz
Starten Sie mit **Workspace-Bindung + kein Secret-Env + Timeouts**. Sobald der
Agent Dependencies installiert oder untrusted Input verarbeitet, erzwingen Sie
**Default-deny Netz und containerisierte Ephemerals**. Für regulierte oder
fremde Codebasen verlagern Sie die Ausführung **remote** und lassen lokal nur
Review-Artefakte zu. DLP bleibt davor und danach auf dem Datenpfad aktiv.
## Checkliste
- [ ] Sandbox-Stufe pro Risk-Klasse dokumentiert
- [ ] Keine Host-Secret-Mounts in Tool-Runtimes
- [ ] Egress-Policy: Deny by default mit begründeter Allowlist
- [ ] Timeouts, Output- und Größenlimits
- [ ] Tool-Ergebnisse laufen durch DLP zurück in den Kontext
- [ ] Escape- und Egress-Tests in CI
- [ ] Profil-Version in Audit-Logs
- [ ] DX: Fehlermeldungen und Proxy-Pfade dokumentiert
## Zusammenfassung
Sandbox-Strategie ist Architektur, kein Demo-Haken. Sie begrenzt den
Handlungsspielraum des Agents, wenn Filter und Prompts versagen – und sie muss
zum Trust-Level der Aufgabe passen. Zusammen mit DLP (Kapitel 5–6) und
Tool-Permissions (Kapitel 8) begrenzt sie Wissen *und* Handlung – die
Voraussetzung für nachvollziehbare Freigaben.
+266
View File
@@ -0,0 +1,266 @@
# 8 Tool-Permissions und Least Privilege
## Kern in einem Satz
Jedes Tool ist eine API mit Seitenwirkungen – Berechtigungen gehören an den
Harness, nicht in den System-Prompt.
## Überblick
Kapitel 7 hat Isolation beschrieben: *wo* Code und Befehle laufen. Dieses
Kapitel regelt *was* der Agent überhaupt anstoßen darf. Least Privilege für
Coding-Agents heißt:
- minimale Tool-Menge pro Session und Rolle,
- enge Argument-Schemas,
- explizite Freigaben für riskante Operationen,
- Trennung von Lese- und Schreibpfaden,
- Policy-as-Code statt Prompt-Appelle.
Prompt Injection und Bedienfehler zielen oft genau auf zu mächtige Tools.
Eine Sandbox ohne Permission-Modell ist ein Käfig mit offener Werkzeugkiste
voller Brechstangen.
## Warum der System-Prompt keine Policy ist
Formulierungen wie „Lösche niemals Dateien außerhalb des Projekts“ oder
„Rufe keine Produktions-APIs auf“ sind Hinweise an ein probabilistisches
Modell. Sie sind:
- **nicht durchsetzbar**, wenn das Modell sie ignoriert oder injizierter Text
sie überschreibt,
- **nicht auditierbar** als Kontrollnachweis,
- **nicht versionssicher** im Sinne von Change Management.
Policy gehört in den Harness: deterministisch, testbar, mit Deny als Default.
## Risk-Klassen
Klassifizieren Sie Tools und Operationen nach Wirkung – nicht nach
Marketing-Namen der Features.
| Klasse | Beispiele | Default |
|--------|-----------|---------|
| **R0 Lesen** | Datei lesen, Suche, Git-Log (read-only) | allow + DLP |
| **R1 Schreiben im Workspace** | Patch, neue Datei unter Workspace-Root | allow + audit |
| **R2 Ausführung** | Tests, Build, Linter, Format | sandbox Pflicht |
| **R3 Seiteneffekte außen** | Deploy, Ticket, Mail, Cloud-API, Paket-Publish | deny / approval |
| **R4 Geheimnisse / IAM** | Secret lesen, Rollen anpassen, Prod-DB | deny; break-glass only |
Dieselbe „Shell“ kann R0 (`cat README`) oder R3 (`curl | bash`) sein.
Deshalb zählen **Tool-Name + validierte Argumente + Zielkontext**, nicht der
Tool-Name allein.
## Permission-Modell
### Scopes
Scopes sind grobe Fähigkeiten, die eine Session halten darf:
```
fs:read
fs:write
git:read
git:write
shell:test # nur freigegebene Test-Runner
shell:build
net:allowlisted
tickets:create
secrets:never # explizite Negation als Dokumentationsanker
```
Vergabe:
- über Rolle (Developer, CI-Bot, Auditor),
- über Task-Typ (Refactor vs. Incident),
- über Repo-Label (öffentlich / intern / reguliert).
### Argument-Constraints
Scopes allein sind zu grob. Jeder Tool-Call braucht Schema-Validierung:
| Dimension | Beispiele |
|-----------|-----------|
| Pfade | nur unter `workspace/`; Deny für `..`, Symlinks nach draußen |
| Hosts | nur Allowlist-DNS für `net:*` |
| Befehle | Allowlist von Binaries (`pytest`, `npm test`); Deny `sudo`, `ssh`, `curl` default |
| Flags | keine `--privileged`, kein Docker-Socket |
| Größe | max. Bytes lesen/schreiben; max. Output-Capture |
| Rate | Calls pro Minute gegen Loops |
Validierung **vor** der Sandbox-Ausführung; bei Verletzung: deny + Telemetrie,
kein „Modell nochmal fragen, ob es ernst ist“.
### Session Binding
Rechte gelten für:
- eine **Session-ID** (oder Task-ID),
- eine **Policy-Version**,
- optional ein **Ablaufzeitpunkt**.
Ein Agent, der gestern Deploy-Rechte für Hotfix hatte, erbt sie nicht still in
die morgige Docs-Session.
### Approval Gates
Human-in-the-loop für R3/R4 und für Abweichungen:
| Ereignis | Gate |
|----------|------|
| erstes `fs:write` außerhalb erlaubter Globs | approve oder deny |
| Shell-Befehl nicht auf Allowlist | deny (kein freies „trotzdem“) |
| Deploy / Prod-API | zwei Personen oder Change-Ticket |
| Exception von DLP-block | Security-Owner + TTL |
Approvals loggen: wer, wann, was, welche Policy-Version, welcher Diff-Hash.
Ein Klick „Allow all for 24h“ ohne Scope-Begrenzung ist ein Anti-Pattern.
## Policy-Entscheidungsablauf
```
eingehender Tool-Call
→ Schema valid?
→ Scope in Session?
→ Argument-Constraints ok?
→ Risk-Klasse → Sandbox-Profil (Kap. 7)
→ Approval nötig und erteilt?
→ ausführen
→ Output-Cap + DLP (Kap. 5–6)
→ Ergebnis zurück in Agent-Loop
```
Jeder Schritt kann mit stabilen Fehlercodes abbrechen
(`POLICY_DENY_SCOPE`, `POLICY_DENY_PATH`, `POLICY_NEEDS_APPROVAL`, …), damit
UI und Tests deterministisch reagieren.
## Trennung Lesen / Schreiben / Ausführen
Häufiger Fehler: ein mächtiges `run_terminal` für alles.
Besser:
| Fähigkeit | Eigenes Tool / enger Wrapper |
|-----------|------------------------------|
| Lesen | `read_file`, `search` |
| Patchen | `apply_patch` mit Diff-Format und Root-Bindung |
| Tests | `run_tests` mit festem Runner und Args |
| Build | `run_build` analog |
| Freie Shell | nur Break-glass, R3+, stark geloggt |
Je enger das Tool, desto kleiner die Injectionsfläche: ein
`apply_patch`-Schema lässt sich härter validieren als freie Shell-Strings.
## Prompt Injection und Permissions
Injizierter Text in README, Issues oder Abhängigkeitsdateien versucht typischerweise:
1. mächtige Tools zu aktivieren („run this command to continue“),
2. Daten exfiltrieren (`curl` mit Repo-Inhalt),
3. Policy-Text zu überschreiben („ignore previous instructions“).
Harte Permissions machen (1) und (2) **unabhängig vom Modellverhalten**
schwer. (3) ist ohnehin wirkungslos, wenn Policy nicht im Prompt lebt.
Ergänzend:
- untrusted Inhalte als **Daten** markieren (nicht als Instruction-Channel),
- Tool-Hinweise aus untrusted Quellen nicht als erlaubte Call-Vorschläge
übernehmen,
- erhöhte Risk-Klasse, wenn der auslösende Chunk aus untrusted Source-ID stammt
(Kapitel 4).
## Policy-as-Code
### Artefakte
- Policy-Dateien im Repo oder als versioniertes Package
- `policy_version` in jedem Audit-Event
- Unit-Tests: erlaubte und verbotene Call-Beispiele
- Contract-Tests gegen den realen Tool-Router des Harness
### Beispielstruktur (konzeptionell)
```yaml
# policy excerpt – illustrativ
version: 2026.04.1
session_defaults:
scopes: [fs:read, git:read]
profiles:
dev_workspace:
scopes: [fs:read, fs:write, shell:test]
path_root: workspace/
network: deny
release:
scopes: [fs:read, git:read]
approvals_required: [shell:build, deploy]
```
### CI
Jeder Policy-Merge:
1. Schema-Check
2. Test-Suite grün
3. Diff-Review durch Platform/Security
4. Canary auf Nicht-Prod-Agenten
## Mapping auf Sandbox-Stufen
| Risk-Klasse | Mindest-Sandbox (Kap. 7) |
|-------------|---------------------------|
| R0 | Process / FS-Jail |
| R1 | FS-Jail, Writes nur Workspace |
| R2 | Container oder strenges Process+Netz-Deny |
| R3 | Ephemeral + net allowlist + approval |
| R4 | Remote / break-glass, separate Identität |
Permissions ohne Sandbox-Mapping erzeugen Scheinsicherheit: deny in der UI,
execute trotzdem auf dem Host.
## Anti-Pattern
1. **Voll-Shell als Default-Tool**
2. **„Allow once“ wird zu „Allow session forever“**
3. **Permissions nur clientseitig in der IDE** (Server/Harness muss enforce)
4. **Prod-Credentials in der gleichen Session wie Experimente**
5. **Tests der Policy mit dem Modell** statt mit deterministischen Fixtures
6. **Ein Admin-Bypass ohne Audit**
## Betriebs- und DX-Aspekte
Zu enge Permissions ohne erklärende Fehler erzeugen Schatten-Tools und
Copy-Paste in unkontrollierte Chats. Gute Deny-Meldungen nennen:
- welche Regel greift (`policy_version` + rule id),
- was erlaubt wäre (z. B. „nutze `run_tests`, nicht `shell`“),
- wie man eine Ausnahme beantragt (TTL, Owner).
Metriken:
| Metrik | Nutzen |
|--------|--------|
| Deny-Rate nach Regel | Schärfe vs. Reibung |
| Approval-Wartezeit | ob Gates im Alltag funktionieren |
| Anteil Sessions mit R3-Scopes | Privilegien-Ausbreitung |
| Break-glass-Häufigkeit | Prozess- oder Policy-Problem |
## Checkliste
- [ ] Tools nach Risk-Klasse R0–R4 inventarisiert
- [ ] Default-Scopes minimal; keine freie Shell als Standard
- [ ] Argument-Validierung serverseitig im Harness
- [ ] Approvals für R3/R4 mit Audit-Feldern
- [ ] Policy versioniert und in CI getestet
- [ ] Mapping Risk-Klasse → Sandbox-Profil
- [ ] Tool-Output läuft durch DLP zurück in den Kontext
- [ ] Deny-Meldungen actionable für Entwickler
- [ ] Break-glass dokumentiert, geloggt, TTL-begrenzt
## Zusammenfassung
Least Privilege für Agents ist Harness-Arbeit: Scopes, Schemas, Approvals und
Session-Bindung – nicht Appelle im System-Prompt. Die Sandbox (Kapitel 7)
begrenzt *wo* etwas läuft; Permissions begrenzen *was* angestoßen werden darf.
Kapitel 9 wendet sich dem Nachweis zu: Logging und Audit, ohne Secrets in die
Logs zu schreiben.
+185
View File
@@ -0,0 +1,185 @@
# 9 Logging und Audit
## Kern in einem Satz
Audit heißt: Entscheidungen und Nebenwirkungen belegen – nicht jeden Prompt
ewig speichern.
## Überblick
Die Kapitel 4–8 haben Kontrollen beschrieben: Datenfluss, DLP, Entropie,
Sandbox, Permissions. Ohne Nachweis bleiben sie Behauptungen. Dieses Kapitel
definiert, was ein Coding-Agent-Harness protokollieren muss, was er
*nicht* protokollieren darf, und wie sich die Events an SIEM, Audit und
Incident Response anschließen.
Observability für Agents ist mehr als „Debug-Logs an“. Sie umfasst strukturierte
Traces von Policy-Entscheidungen, Tool-Calls, Filter-Ergebnissen und Approvals –
bei strikter Trennung von Secret-Klartext und Prompt-Volltext.
## Zwei Ziele, die sich beißen – und wie man sie trennt
| Ziel | Braucht | Risiko bei Naivität |
|------|---------|---------------------|
| **Security-Nachweis** | wer, was, welche Policy, welches Ergebnis | zu wenig Detail → Audit scheitert |
| **Datenschutz / Secret-Hygiene** | keine Keys, keine PII im Log | zu viel Detail → Log wird zweites Leck |
Die Auflösung: **Metadaten und Fingerprints reich, Payloads arm.**
Regel-ID und Aktion ja; Secret-String nein. Session-ID ja; vollständiger Prompt
nur in gesonderten, streng regulierten Speichern – oder gar nicht.
## Event-Modell (Mindestumfang)
Jedes sicherheitsrelevante Ereignis sollte maschinenlesbar sein (JSON o. Ä.) und
mindestens tragen:
| Feld | Zweck |
|------|--------|
| `ts` | Zeit (UTC, monoton soweit möglich) |
| `session_id` / `task_id` | Korrelation |
| `actor_id` | Mensch oder Service-Principal |
| `agent_version` | Build/Release des Harness |
| `policy_version` | welche Regeln galten |
| `event_type` | z. B. `dlp.hit`, `tool.call`, `tool.deny`, `approval`, `model.call` |
| `outcome` | allow / deny / redact / error / approved |
| `resource` | redigierte Kurzform (Tool-Name, Chunk-Source-ID, Gateway-ID) |
| `trace_id` | Ende-zu-Ende über Orchestrator → Tool → Gateway |
### Pflicht-Events
1. **Session start/end** – Identität, Profil, Scopes
2. **Policy-Entscheidung** – Deny/Allow mit Regel- oder Scope-ID
3. **DLP-/Entropie-Treffer** – `rule_id`, Aktion, Fingerprint, *kein* Klartext
4. **Tool-Call** – Name, validierte Argument-Zusammenfassung, Risk-Klasse,
Sandbox-Profil, Exit-Status, Dauer
5. **Approval** – Anforderer, Entscheider, Bezug, TTL
6. **Model-Call** – Gateway, Region/Anbieter-Klasse, Modell-ID, Token-Zähler,
Fehlercode; Prompt-Hash optional, Prompt-Text separat oder nie
7. **Kill-Switch / Break-glass** – immer high-severity
### Argument-Zusammenfassung statt Full Dump
Statt `command: "cat /etc/passwd"` im Klartext (wenn überhaupt ausgeführt):
- erlaubte, bereits validierte Felder in kanonischer Form,
- Pfade normalisiert und ggf. gekürzt,
- Längen und Hashes statt Riesenstrings,
- Deny-Gründe als Codes (`POLICY_DENY_PATH`).
Was nie ausgeführt wurde, braucht keinen Secret-haltigen Payload im Log.
## Schutzzonen und Retention-Tiers
| Tier | Inhalt | Retention (Richtwert) | Zugriff |
|------|--------|------------------------|---------|
| **T0 Metrics** | Zähler, Latenz, Deny-Raten | 90 Tage – 1 Jahr | breit (Ops) |
| **T1 Audit trail** | Policy, Tool, Approval, Model-Meta | 1–7 Jahre je Regulierung | Security/Audit |
| **T2 Debug detail** | erweiterte Traces, redigierte Snippets | Tage bis Wochen | on-call, break-glass |
| **T3 Prompt archive** | Volltext Prompt/Response | oft: aus oder sehr eng | Legal/Security only |
Zahlen sind Platzhalter für Ihre Policy – wichtig ist die **Trennung**. Ein
Bucket für alles endet als unkontrolliertes Geheimnisarchiv.
### Secret-Treffer im Log
```
{
"event_type": "dlp.hit",
"rule_id": "sec.aws.access_key_id.v3",
"action": "block",
"fingerprint": "sha256:…",
"chunk_source_id": "file:src/config.ts",
"policy_version": "2026.04.1"
}
```
Nicht: `"match": "AKIA…"`.
## Korrelation und Forensik
Für Incidents brauchen Sie Ketten, keine Einzelzeilen:
```
session → tool.calls[] → dlp.hits[] → model.calls[] → approvals[]
```
Praktisch:
- eine `trace_id` durch den gesamten Loop,
- stabile `chunk_source_id` aus Kapitel 4,
- Verknüpfung zu Change-Ticket und Incident-ID in Approvals und Kill-Events.
Zielbild einer typischen Frage:
*„Welche Sessions haben Regel X in den letzten 24 h geblockt, und folgte ein
Approval?“* – beantwortbar ohne Prompt-Volltext.
## SIEM und Enterprise-Anschluss
- strukturierte Events (JSON), keine reinen Freitext-Stacktraces als einzige Spur
- Feldnamen und Severity an bestehende Pipelines anbinden
- Unveränderlichkeit wo gefordert (WORM, signierte Batches, separates Audit-Konto)
- Alerting auf: Break-glass-Spikes, Deny-Anomalien, Gateway-Wechsel,
Policy-Deploy ohne Canary, massenhafte DLP-Hits einer Regel (FP oder Angriff)
## Was absichtlich *nicht* geloggt wird
- Secret-Klartext und private Keys
- vollständige `.env`-Inhalte
- ungefilterte Tool-Stdout-Ströme mit Verdacht auf Credentials
- personenbezogene Daten aus Fixtures über das nötige Maß hinaus
- „zur Sicherheit alles“-Prompts in T0/T1
Wenn Produkt oder Support Prompt-Inhalte braucht: **eigenes Produkt mit eigenem
DPA, eigener Freigabe, eigener Retention** – nicht der Ops-Default.
## Integrität und Schutz der Logs selbst
Logs, die Zugriffe belegen, sind selbst ein Asset:
- Schreibzugriff nur für den Harness-Service, nicht für jeden Entwickler
- Trennung von Rollen: Operator sieht T0/T1 aggregiert, Klartext-T3 nur
break-glass
- Manipulation erschweren (append-only, externe Senke)
- Backup und Löschkonzept (Recht auf Löschung vs. Audit-Pflicht klären)
## Anti-Pattern
1. **Debug-Logging von Request-Bodies an den Model-Vendor in Prod**
2. **Ein ELK-Index mit Prompts, Secrets und Metriken**
3. **Nur Client-seitige Telemetrie** (IDE) ohne Server-Harness-Truth
4. **Policy-Version fehlt** – nicht rekonstruierbar, was galt
5. **Alerts ohne Runbook** (→ Kapitel 11)
6. **Fingerprint mit truncated Klartext** („sicherheitshalber die ersten 4 Zeichen
des Secrets“) – oft genug für Missbrauch
## Mindest-Dashboard (Ops)
| Kachel | Signal |
|--------|--------|
| Sessions / h | Last |
| DLP block/redact Rate | Filterwirkung |
| Top rule_ids | FP oder echte Funde |
| Tool deny by scope | Permission-Reibung |
| p95 DLP + Tool Latenz | DX |
| Break-glass count | Ausnahme-Druck |
| Model gateway mix | Residenz/Vertrag |
## Checkliste
- [ ] Event-Schema dokumentiert und versioniert
- [ ] Pflicht-Events 1–7 implementiert
- [ ] Kein Secret-Klartext in T0–T2
- [ ] Retention-Tiers getrennt konfiguriert
- [ ] `policy_version` und `agent_version` auf jedem Event
- [ ] SIEM-Anbindung und Basis-Alerts
- [ ] Zugriff auf T3 (falls vorhanden) break-glass + Audit
- [ ] Forensik-Query „Session-Zeitlinie“ getestet
- [ ] Log-Pipeline selbst zugriffsgeschützt
## Zusammenfassung
Gutes Agent-Logging beweist Kontrolle und schützt zugleich die Daten, die der
Agent nicht leaken soll: reich an Entscheidungs-Metadaten, arm an Payloads.
So wird aus Harness-Technik ein prüfbarer Dienst. Kapitel 10 bindet diese
Nachweise in Enterprise-Governance ein; Kapitel 11 übersetzt Alerts in
Playbooks.
@@ -0,0 +1,167 @@
# 10 Enterprise- und Compliance-Patterns
## Kern in einem Satz
Compliance für Agents ist die Abbildung von Harness-Kontrollen auf bestehende
Governance: Verträge, Residenz, Aufbewahrung, Freigaben.
## Überblick
Security Engineering (Kapitel 4–9) liefert Mechanismen. Enterprise-Patterns
machen sie anschlussfähig an Einkauf, Rechtsabteilung, interne Revision und
Linienmanagement. „Enterprise-ready“ heißt hier nicht Feature-Liste auf einer
Folie, sondern: **erklären, freigeben und prüfen können**.
Dieses Kapitel katalogisiert wiederkehrende Muster und mappt typische
Audit-Fragen auf Systemnachweise.
## Ausgangslage: Agents berühren mehrere Kontrollwelten
| Domäne | Typische Frage |
|--------|----------------|
| Datenschutz | Welche personenbezogenen oder vertraulichen Daten gehen an wen? |
| Informationssicherheit | Welche Rechte hat der Agent? Wie isolieren wir? |
| Einkauf / Vendor | Welcher Auftragsverarbeiter, welches Subprocessing? |
| Entwicklung | Wie bleibt DX akzeptabel unter Policy? |
| Betrieb | Wer on-callt, wer darf Break-glass? |
| Revision | Sind Controls designed *and* operating effectively? |
Ein Harness, der nur „technisch sauber“ ist, aber keine Rollen, Verträge und
Freigabewege kennt, bleibt in regulierten Umgebungen liegen.
## Pattern-Katalog
### 1 — Data Processing nur über freigegebene Gateways
- Model-Calls ausschließlich über genehmigte Endpoints
- Vertrag / DPA / AVV und Sicherheitsanhänge vorausgesetzt
- technische Enforce: Allowlist im Gateway, nicht nur Wiki-Seite
- Schatten-SDKs und lokale Consumer-Keys als Verstoß behandeln
### 2 — Residenz- und Souveränitätszonen als Policy
- explizite Zonen (z. B. `eu-prod`, `us-exp`, `local-lab`)
- Routing nach Datenklasse und Repo-Label
- keine „best effort region“ ohne Log
- Experimente dürfen nicht still auf Prod-Zonen zugreifen
### 3 — Retention-Tiers (an Kapitel 9 gekoppelt)
- Telemetrie ≠ Prompt-Archiv ≠ Backup
- Lösch- und Aufbewahrungsfristen pro Tier
- Verantwortliche Owner benennen (Data Owner / Platform)
### 4 — Rollenmodell
| Rolle | Darf u. a. | Darf typisch nicht |
|-------|------------|---------------------|
| **Builder** | Policy-PRs, Detektoren entwickeln | Prod-Break-glass allein |
| **Operator** | Sessions, Kill-Switch, On-call | Policy ohne Review mergen |
| **Auditor** | lesen T1-Audit, Reports | Tools ausführen, Keys sehen |
| **Developer** | Agents im erlaubten Profil nutzen | Policy umgehen, R3 default |
| **Break-glass** | zeitlich begrenzte Erweiterung | Dauerzustand |
IAM-Gruppen und Harness-Scopes müssen sich entsprechen (Kapitel 8).
### 5 — Change Management für Policy und Detektoren
- jede `policy_version` ist ein Release
- Review, CI-Tests, Canary, Rollback-Pfad
- Security als Pflicht-Reviewer bei riskanten Scope-Erweiterungen
- Changelog, der Audit erklären kann („warum war shell gestern allow?“)
### 6 — Vendor Exit und Portabilität
- Export von Audit-Metadaten und Konfiguration
- dokumentierte Löschwege beim Anbieter (wo vertraglich vorgesehen)
- Fähigkeit, Gateway auf anderen Vendor oder internes Modell zu schwenken
ohne die DLP-/Permission-Schicht neu zu erfinden
### 7 — Datenklassifikation steuert Agent-Profil
| Klasse | Agent-Profil (Beispiel) |
|--------|-------------------------|
| Öffentlich / OSS | freizügiger, externes Modell möglich |
| Intern | Standard-DLP, internes oder freigegebenes Gateway |
| Vertraulich | strikte Pfade, Output-Scan, evtl. nur private Modelle |
| Reguliert / PII-schwer | remote Sandbox, minimale Tools, oft Human-Review |
Klassifikation ohne technische Durchsetzung ist Etikett.
### 8 — Nachweisordner / Control Evidence
Wiederkehrende Artefakte für Audits:
- Architekturdiagramm Trust-Zonen (Kap. 4)
- Policy- und Detektor-Versionen + Testergebnisse
- Gateway- und Vendor-Liste mit Verträgen
- Sampling von Audit-Logs (ohne Secrets)
- Incident- und Exception-Reports mit TTL-Ausnahmen
- Schulungs- oder Awareness-Nachweis für Entwickler (optional, je Org)
## Mapping: Audit-Frage → Systemnachweis
| Frage | Nachweis |
|-------|----------|
| Wer hat Zugriff auf den Agent-Dienst? | IAM, SSO-Gruppen, Session-Logs |
| Welche Daten dürfen das Modell erreichen? | Datenklassen-Policy, DLP-Regeln, Deny-Metriken |
| Wie verhindern wir Secret-Abfluss? | Kap. 5–6 Controls + Hit-Events ohne Klartext |
| Wie begrenzen wir Aktionen? | Permissions R0–R4, Sandbox-Profile, Approvals |
| Können wir eine Session rekonstruieren? | Trace aus Kap. 9 |
| Was passiert bei Vorfall? | Playbooks Kap. 11, Postmortems |
| Welcher Vendor verarbeitet was? | Gateway-Allowlist + Vertragsregister |
| Wie ändern wir Controls? | Change-Prozess Pattern 5 |
## Freigabemodell (skizziert)
1. **Architektur-Freigabe** – Trust-Zonen, Gateway, Sandbox-Stufen
2. **Pilot** – ein Team, Schatten-DLP, enge Scopes
3. **Enforce** – block/redact an, Metriken grün
4. **Scale** – weitere Repos/Teams, Self-Service-Profile
5. **Re-Zertifizierung** – periodisch Policy, Vendor, Residenz
Jeder Sprung braucht messbare Exit-Kriterien (FP-Rate, Latenz, Incident-Zahl),
nicht nur ein Statusmeeting.
## Anti-Pattern in Enterprise-Kontexten
1. **Schatten-Agents** mit privaten API-Keys neben dem freigegebenen Harness
2. **„Legal hat den Vendor freigegeben“** ohne technische Allowlist
3. **Einmalige Penetration-Demo** statt operating effectiveness
4. **Policy-Wiki ohne Version im Event-Log**
5. **Ausnahmen ohne TTL und Owner**
6. **Security-Tooling, das DX so zerstört, dass Bypass rational wird**
## Zusammenspiel mit dem Harness
Enterprise-Patterns sind keine parallele Excel-Welt. Sie fordern Hooks:
- Gateway-Allowlist und Zonen-Tags
- Rollen → Default-Scopes
- `policy_version` in jedem Audit-Event
- Exception-API mit Ticket-Pflicht und Ablauf
- Report-Jobs (monatliche DLP- und Deny-Summaries) für Steuerungkreise
Platform Engineering besitzt die Implementierung; Security und Compliance
besitzen die Anforderungen und die Abnahme – idealerweise in einem gemeinsamen
Backlog.
## Checkliste
- [ ] Freigegebene Model-Gateways technisch erzwungen
- [ ] Residenz-Zonen definiert und geroutet
- [ ] Retention-Tiers mit Owner
- [ ] Rollen IAM ↔ Harness-Scopes gemappt
- [ ] Policy-Change-Prozess inkl. Canary
- [ ] Vendor-/Exit-Dokumentation vorhanden
- [ ] Datenklassen steuern Agent-Profile
- [ ] Evidence-Paket für Audits vorbereitet
- [ ] Pilot→Enforce-Kriterien schriftlich
## Zusammenfassung
Die Technik-Kapitel liefern die Schalter; Enterprise-ready wird es erst, wenn
die Organisation sie vertraglich, rollenbasiert und revisionssicher einbettet.
Patterns 1–8 sind wiederkehrende Bausteine, keine einmalige Checklisten-Show.
Kapitel 11 macht daraus den Alltag: Incidents, False Positives und
kontrollierte Abschaltung.
+185
View File
@@ -0,0 +1,185 @@
# 11 Betrieb und Playbooks
## Kern in einem Satz
Produktionstaugliche Agents brauchen Runbooks: Incident, False Positives,
Key-Rotation und kontrollierte Abschaltpfade.
## Überblick
Architektur und Compliance-Patterns (Kapitel 4–10) greifen nur, wenn Menschen
im Ereignisfall **dieselbe Reihenfolge** abarbeiten. Dieses Kapitel übersetzt
Kontrollen in Betrieb: Playbooks, SLOs, On-call-Grenzen und Postmortems.
Zielgruppe sind Platform- und Security-Teams gemeinsam – nicht „der eine
DevOps, der den Agent kennt“.
## Betriebsmodell (kurz)
| Funktion | Verantwortung |
|----------|----------------|
| On-call Platform | Verfügbarkeit Harness, Kill-Switch, Gateway |
| Security Operations | Secret-Incidents, DLP-Anomalien, Forensik-Meta |
| Policy Owner | Regel-/Scope-Änderungen, Exceptions mit TTL |
| Team-Lead der Nutzer | Kommunikation, Workarounds ohne Schatten-IT |
Klare Eskalation verhindert, dass bei Secret-Verdacht jeder lokal „kurz die
Logs dump“ macht – und dabei Klartext verteilt.
## Grundprinzipien für alle Playbooks
1. **Sicherheit vor Forensik-Vollständigkeit** – erst stoppen/rotieren, dann
feinschnittig analysieren
2. **Kein Secret-Klartext in Tickets, Chat, Screenshots**
3. **Sessions und Keys haben IDs** – mit Fingerprints und `session_id` arbeiten
4. **Jede Ausnahme hat Owner und TTL**
5. **Alles Zeitstempeln** – für Postmortem und Audit (Kap. 9)
## Playbook A — Secret im Prompt- oder Tool-Pfad (Verdacht oder bestätigt)
**Auslöser:** DLP-block auf high-confidence Klasse; Nutzer-Report; Vendor-Hinweis;
anomale Gateway-Nutzung mit sensiblen Pfaden.
| Schritt | Aktion | Owner |
|---------|--------|--------|
| A1 | Betroffene Session(s) isolieren oder killen | Platform |
| A2 | Weitere Sessions desselben Actors/Repos scannen (Metadaten) | Platform/Sec |
| A3 | Verdächtigte Secrets **rotieren** (nicht nur „beobachten“) | Secret-Owner |
| A4 | Audit-Zeitlinie ziehen: `session_id`, rule_ids, tool.calls, model.calls | Sec/Platform |
| A5 | Prüfen: ging ein Call *nach* dem Treffer noch an Gateway? | Sec |
| A6 | Vertragliche Meldepflichten prüfen (Vendor, Datenschutz, Kunden) | Sec/Legal |
| A7 | Gate bewerten: welche Stufe versagt (Pfad, DLP, Scope)? | gemeinsam |
| A8 | Fix (Regel, Deny-Path, Test) + Regression | Builder/Policy |
| A9 | Postmortem mit Action Items und Termin | Policy Owner |
**Nicht tun:** Secret in Ticket-Beschreibung pasten; „nur diesmal“ Filter global
aus; unkontrolliert Prompt-Archive durchsuchen und exportieren.
## Playbook B — False-Positive-Sturm
**Auslöser:** Spike einer `rule_id`; Nutzer-Eskalation; Deny-Rate bricht DX.
| Schritt | Aktion |
|---------|--------|
| B1 | Telemetrie: rule_id, Quellen, Sample von Fingerprints (keine Klartexte) |
| B2 | Stichprobe labeln: echtes Secret / FP / unklar |
| B3 | Wenn FP-dominiert: **gezielte** Allowlist oder Regel-Relax *mit Ticket + TTL* |
| B4 | Parallel: dauerhafter Fix (Regex, Keyword-Nähe, Pfad-Ausnahme eng) |
| B5 | Regressionstests ergänzen (pos + neg Fixtures) |
| B6 | Nutzer informieren: was wann zurückgenommen wird |
| B7 | TTL der Not-Allowlist erzwingen oder verlängern mit Review |
Schattenmodus (Kap. 5–6) vor dem nächsten großen Regel-Release reduziert
B-Stürme.
## Playbook C — Agent außer Kontrolle (Tool-Loop, Kosten, Spam)
**Auslöser:** Rate-Limit, Kostenalarm, hunderte Tool-Calls, Disk-Füllung in
Sandbox.
| Schritt | Aktion |
|---------|--------|
| C1 | Kill-Switch Session oder globaler Agent-Pause-Flag |
| C2 | Rate-Limits und Output-Caps prüfen/härten |
| C3 | Letzte N Tool-Calls (Metadaten) – Injection oder Bug? |
| C4 | Sandbox-Netz/FS: Egress-Versuche? Workspace-Escape-Versuche? |
| C5 | Policy enger (Scopes, erlaubte Tools), dann schrittweise freigeben |
| C6 | Fix im Orchestrator (Loop-Detection, max depth) |
## Playbook D — Gateway- oder Vendor-Vorfall
**Auslöser:** Anbieter-Outage, Regions-Issue, Sicherheitsadvisory, Vertragsende.
| Schritt | Aktion |
|---------|--------|
| D1 | Traffic auf Failover-Gateway oder read-only Modus |
| D2 | Neue Sessions: nur freigegebene Rest-Kapazität |
| D3 | Prüfen, ob Retries sensible Payloads vervielfachen |
| D4 | Status an Entwickler (keine Spekulation über Datenlecks ohne Fakten) |
| D5 | Nach Stabilisierung: Log-Sampling auf Anomalien |
## Playbook E — Break-glass und Notfall-Rechte
Break-glass ist vorgesehen – und gefährlich.
- Anforderung mit Grund und Incident-/Change-ID
- Kurzlebige Scopes, harte TTL (Minuten/Stunden, nicht Wochen)
- Vier-Augen wo organisatorisch gefordert
- Automatisches Revoke + Alert an Security
- Post-hoc Review jedes Break-glass in der Woche
Dauerhaft erweiterte Rechte „weil sonst nichts geht“ sind gescheiterte Policy,
kein Betriebsmodus.
## Playbook F — Policy-Rollback
Wenn ein Release DX oder Sicherheit verschlechtert:
1. Canary stoppen
2. `policy_version` zurück auf letzten bekannten guten Stand
3. Caches invalidieren (Kap. 4)
4. Incident-light: was ist raus, was war deniert?
5. Hotfix-Zweig mit Tests, kein „Fix forward“ ohne Suite
## SLOs und SLIs (Beispiele)
Werte kalibrieren Sie selbst; die *Existenz* der SLOs ist der erste Schritt.
| SLI | Beispiel-SLO | Bemerkung |
|-----|--------------|-----------|
| DLP-Latenz p95 | < X ms pro Chunk | sonst umgehen Nutzer den Agent |
| Harness-Verfügbarkeit | 99.x % | Kill-Switch zählt als bewusste Unavailability |
| Mean time to revoke Session | < Y Min | Playbook A/C |
| Mean time to rotate critical secret | < Z Std | org-abhängig |
| Policy-Deploy ohne Canary in Prod | = 0 | hart |
| Break-glass ohne Ticket | = 0 | hart |
| Offene Exceptions ohne TTL | = 0 | wöchentlicher Job |
## On-call-Runbook (Checkliste am Alarm)
- [ ] Welches Alert-Label / welche rule_id / welche gateway_id?
- [ ] Scope: eine Session, ein Tenant, global?
- [ ] Sofortmaßnahme: kill, rate-limit, gateway failover?
- [ ] Secret-Verdacht? → Playbook A priorisieren
- [ ] Kommunikation: Statusseite / interner Channel, ohne Payloads
- [ ] Ticket mit `trace_id` / `session_id`, keine Screenshots von Secrets
- [ ] Handover und Follow-up-Owner
## Postmortem-Minimalgerüst
1. Timeline (UTC)
2. Impact (Sessions, Repos, mögliche Datenklassen – ohne Klartext)
3. Detection (welches Signal hat gegriffen – oder nicht?)
4. Root cause (Gate, Prozess, Vendor)
5. What went well / poorly
6. Actions mit Owner und Datum
7. Welche Tests/SLOs verhindern Wiederholung?
Blameless gegenüber Personen, streng gegenüber fehlenden Controls.
## Anti-Pattern im Betrieb
- Incident-Chat mit eingefügten Keys „nur für die Analyse“
- Globaler DLP-Off-Schalter als erste Reaktion auf FP
- On-call ohne Zugriff auf Kill-Switch
- Playbooks nur in den Köpfen von zwei Personen
- Metriken ohne Owner, der sie wöchentlich liest
## Checkliste: betriebsbereit?
- [ ] Playbooks A–F dokumentiert und verlinkt im Alert-Tool
- [ ] Kill-Switch getestet (Game day)
- [ ] Secret-Rotation mit den Secret-Ownern geprobt
- [ ] FP-Exception-Pfad mit TTL automatisiert oder erzwungen
- [ ] SLIs angebunden und Alarm-Schwellen gesetzt
- [ ] On-call-Roster kennt Harness *und* Security-Eskalation
- [ ] Postmortem-Template vorhanden
- [ ] Wöchentlicher Report: Break-glass, Top-Denies, offene TTLs
## Zusammenfassung
Playbooks machen aus Patterns einen betreibbaren Dienst: stoppen, rotieren,
begrenzte Ausnahmen, rollbacken, lernen. Fehlen sie, bleiben Freigaben und
Architekturdiagramme Theorie. Mit Playbooks – und den technischen Gates der
Kapitel 4–9 – können Teams Coding-Agents skalieren, ohne bei jedem Zwischenfall
neu zu erfinden, was Sicherheit bedeutet.
+44
View File
@@ -0,0 +1,44 @@
# Kolophon
## Werk
*Secure Coding Agents with Flue*
Untertitel: *Enterprise-ready Data Protection, Logging & Compliance Patterns*
Autor: Martin Richardt
1. Auflage 2026
## Herstellung
- Manuskript: Markdown unter `manuskript/`, assembliert mit
`scripts/assemble_book.py`
- Satz: Pandoc und LuaLaTeX, Dokumentklasse KOMA-Script (`scrbook`)
- Template und Filter: `pdf/templates/`, `pdf/filters/` (portiert und angepasst
aus dem Schwesterprojekt *Die KI hinter dem Vorhang*)
- Farben: Navy / Cyan / Emerald (`pdf/styles/secure-agents-colors.tex`)
- Cover: generative, textfreie Art-Base; Typografie per Pillow-Overlay
(`scripts/build_cover.py` → `assets/cover/`)
- Build: `just cover`, `just assemble`, `just pdf`
## Schriften
| Rolle | Schrift |
|-------|---------|
| Fließtext | Charter |
| Sans (Überschriften, UI-nah) | DejaVu Sans |
| Mono (Code) | DejaVu Sans Mono |
| Cover-Titel | Baskerville / Avenir Next (System, Overlay) |
## Inhaltlicher Anspruch
Fachbuch-Skizze mit Vollfassungen der Kapitel zu Datenfluss, DLP, Entropie,
Sandbox, Permissions, Audit, Enterprise-Patterns und Betrieb. Keine
Rechtsberatung, kein Vendor-Zertifikat, kein vollständiges API-Handbuch zu Flue.
## Rechte
© 2026 Martin Richardt. Alle Rechte vorbehalten, soweit nicht anders vermerkt.
## Danksagung (Platzhalter)
Dank an alle, die Harness-Hooks, Deny-by-default und langweilige Audit-Logs
für wichtiger halten als die nächste Demo – namentlich zu ergänzen.
+113
View File
@@ -0,0 +1,113 @@
# Literatur und weiterführende Quellen
Die folgende Liste ist eine **Arbeitsbibliografie**: stabile Einstiege und
Orientierungsquellen zu den Themen des Buchs. Fassungen und URLs ändern sich;
prüfen Sie vor verbindlicher Nutzung die jeweils aktuelle Version. Abrufstand
der Links, soweit nicht anders vermerkt: 2026-07.
Dieses Verzeichnis ersetzt keine Rechts- oder Audit-Beratung.
## Standards, Frameworks und Top-Listen
1. OWASP GenAI Security Project: *OWASP Top 10 for LLM Applications* (Fassung
2025 bzw. jeweils aktuell).
<https://genai.owasp.org/llm-top-10/>
Projektübersicht: <https://owasp.org/www-project-top-10-for-large-language-model-applications/>
2. National Institute of Standards and Technology (NIST): *Artificial
Intelligence Risk Management Framework (AI RMF 1.0)* und Folgepublikationen.
<https://www.nist.gov/itl/ai-risk-management-framework>
3. International Organization for Standardization: *ISO/IEC 27001* –
Information security management systems (Controls zu Access, Logging,
Supplier Relationships – im Org-Kontext mappen).
4. Europäische Union: *Verordnung (EU) 2016/679* (DSGVO) – insbesondere
Grundsätze der Datenminimierung, Zweckbindung und Auftragsverarbeitung.
Konsolidierter Text u. a. über EUR-Lex.
5. Europäische Union: *Verordnung (EU) 2024/1689* (AI Act) – wo Agenten-Systeme
in den Anwendungsbereich fallen; mit Fachjuristen und aktueller Guidance
abstimmen.
## Secret Detection, DLP und Entropie
6. Shannon, C. E. (1948): *A Mathematical Theory of Communication.* Bell System
Technical Journal – konzeptionelle Grundlage der Shannon-Entropie.
7. Dokumentationen gängiger Secret-Scanning-Ansätze (Muster und Limitationen),
z. B. Open-Source-Scanner und Plattform-Features der großen Git-Hoster –
jeweils als *Inspiration für Detektorklassen*, nicht als alleinige
Enterprise-Control.
8. OWASP: Materialien zu *Sensitive Information Disclosure* im LLM-/GenAI-
Kontext (siehe Top-10-Einträge der aktuellen Fassung unter [1]).
## Prompt Injection, Agents und Tool-Use
9. OWASP: *Prompt Injection* (LLM01 in den LLM-Top-10) – Definitionen,
Szenarien, Mitigationsskizzen.
Einstieg über [1].
10. Literatur und Reports zu *indirect prompt injection* in
Retrieval-/Tool-Systemen (Vendor- und Forschungsblogs; kritisch lesen und
mit dem eigenen Bedrohungsmodell abgleichen).
11. Model Context Protocol (MCP) und vergleichbare Tool-Ökosysteme: offizielle
Spezifikationen und Security-Überlegungen der jeweiligen Projekte – relevant
für Permission- und Trust-Grenzen, sobald Agents externe Tool-Server nutzen.
## Isolation, Supply Chain und sichere Ausführung
12. Container- und Runtime-Härtung: Dokumentation zu User Namespaces,
Read-only Roots, Seccomp/AppArmor/SELinux und *nicht* privilegierten
Containern (je nach Stack).
13. gVisor / microVM-Ansätze (z. B. Firecracker-Ökosystem): Hersteller- und
Projekt-Docs zu Isolationseigenschaften und Betriebsgrenzen.
14. Supply-Chain-Sicherheit in der Entwicklung: SLSA-Framework und verwandte
Guidance zu Provenance und Build-Integrität.
<https://slsa.dev/>
15. NIST / Branchen-Guides zu *Secure Software Development* und Dependency-
Risiken – an die Agent-Pfade „install/build/test“ koppeln.
## Logging, Audit und Betrieb
16. Strukturiertes Logging und SIEM-Integration: interne Standards der
Organisation plus gängige Praxen (JSON-Events, Korrelations-IDs,
append-only Audit-Stores).
17. Incident-Response-Playbooks: NIST SP 800-61 (Computer Security Incident
Handling) als organisatorischer Rahmen – Agent-spezifisch in Kapitel 11
ausgeprägt.
<https://csrc.nist.gov/publications/detail/sp/800-61/rev-2/final>
## Datenschutz und Auftragsverarbeitung (Orientierung)
18. Aufsichtsbehörden und Standardvertragsklauseln zur Auftragsverarbeitung /
internationalem Datentransfer – jeweils die für Ihre Jurisdiktion
maßgeblichen Texte und FAQ.
19. Anbieter-Dokumentationen zu *Training opt-out*, Zero Data Retention und
Regional Endpoints – vertraglich *und* technisch (Gateway-Flags) prüfen.
## Weiterführende Themencluster (für eigene Vertiefung)
| Cluster | Warum im Buch relevant |
|---------|-------------------------|
| High-Entropy- und Pattern-Secret-Detection | Kapitel 5–6 |
| Agent frameworks & tool routers | Kapitel 2, 7–8 |
| Least privilege & policy-as-code | Kapitel 8, 10 |
| Sandbox escape literature | Kapitel 7 |
| AI governance / model risk management | Kapitel 10 |
| Blameless postmortems / SRE | Kapitel 11 |
## Hinweis zur Pflege
- Jede verbindliche Referenz in Audits sollte **Dokumenttitel, Version/Datum
und Abruf-URL** tragen.
- Vendor-Blogs und Social Media ersetzen keine Standards.
- Dieses Verzeichnis wächst mit der Manuskript- und Review-Arbeit; streichen
Sie Veraltetes lieber, als tote Links zu horten.
+98
View File
@@ -0,0 +1,98 @@
# Prolog
## Der Agent, der zu viel weiß
Montag, 09:17. Eine Entwicklerin startet den Coding-Agenten in der IDE, weil
der Integrationstest rot ist. Der Agent liest die Fehlerausgabe, öffnet zwei
Konfigurationsdateien, schlägt einen Patch vor – und hängt, ohne dass es jemand
bemerkt, den Inhalt einer `.env.local` in den Kontext, „nur zur Sicherheit, falls
Credentials das Problem sind“.
Sekunden später verlässt dieser Kontext den Vertrauensbereich des Unternehmens
Richtung Model Gateway. Vielleicht speichert der Anbieter nichts. Vielleicht
landen Fragmente in einem Missbrauchsfilter. Vielleicht ist der Key ohnehin nur
für Staging. Nichts davon ändert die technische Tatsache: **eine automatisierte
Schleife hat eine Entscheidung getroffen, die kein Mensch in diesem Moment
bewusst freigegeben hat.**
Das ist kein dystopisches Szenario und kein Angriff aus dem Lehrbuch. Es ist der
Normalfall, sobald Teams Agents produktiv einsetzen, ohne explizite
Datengrenzen, Filter und Audit-Spuren. Die Produktivität ist real. Das Risiko
auch – nur stiller.
## Worum es in diesem Buch geht
Dieses Buch beschreibt, wie man Coding-Agents auf Basis eines Agent-Harnesses –
exemplarisch das TypeScript-Framework **Flue** – so absichert, dass sie in
Unternehmen freigabefähig werden:
- welche Daten das Modell sehen darf und wie man den Fluss dorthin steuert,
- wie DLP (Pattern Matching) und Entropie-Filter Secrets und heikle Fragmente
abfangen,
- wie Sandboxes und Tool-Permissions den *Handlungsraum* begrenzen,
- wie Logging und Audit Kontrolle *nachweisen*, ohne selbst zum Leck zu werden,
- wie Enterprise-Patterns und Playbooks den Alltag aus Freigabe, Incident und
Betrieb tragen.
Flue ist Bezugspunkt und Nomenklatur-Hilfe, kein Marketinggegenstand. Dieselben
Schichten – Context Builder, Gateway, Tool Runtime, Policy, Observability –
finden sich in anderen Harnesses unter anderen Namen. Die Patterns sind auf die
*Stelle* gemünzt, nicht auf ein Logo.
## Für wen dieses Buch ist
- **Entwicklerinnen und Entwickler**, die Agents bauen, betreiben oder in den
Alltag holen und Security nicht an „die andere Abteilung“ abschieben können
- **Security- und Compliance-Verantwortliche**, die freigeben, auditieren oder
stoppen müssen – und technische Anschlussstellen brauchen, keine Folien
- **Plattform-Teams**, die einen gemeinsamen Harness standardisieren und
Self-Service mit Leitplanken liefern wollen
Es ist **kein** Einstieg in Prompt-Engineering, **kein** Katalog von
Model-Benchmarks und **kein** Tutorial für Hobby-Bots. Schwerpunkt sind
kontrollierbare Datenflüsse, nachweisbare Entscheidungen und betriebsfähige
Muster.
## Was Sie nicht erwartet
- Garantien der Form „mit diesen Regex sind Sie DSGVO-fertig“
- Vendor-Vergleiche mit Siegerpodest
- Vollständige Rechtsberatung
- Ein einziges „sicheres Default-Prompt“
Stattdessen: Architekturentscheidungen, Tabellen, Checklisten, Anti-Pattern und
die wiederkehrende Zumutung, **Deny by default** ernst zu nehmen.
## Drei Leitfragen
Durch alle Kapitel ziehen sich dieselben Fragen:
1. **Welche Daten verlassen den Vertrauensbereich – und warum?**
(Kapitel 4–6)
2. **Welche Kontrolle greift *vor* dem LLM-Call, welche *danach* – und was darf
der Agent *tun*?**
(Kapitel 4–8)
3. **Wie beweisen wir im Audit und im Incident, dass die Kontrolle funktioniert
hat?**
(Kapitel 9–11)
Kapitel 1–3 schaffen die gemeinsame Sprache: Warum das Thema zählt, wo der
Harness sitzt, welches Bedrohungsmodell greift.
## Wie Sie das Buch lesen können
- **linear**, wenn Sie eine Plattform von Grund auf absichern,
- **ab Kapitel 4**, wenn Architektur und Bedrohungsmodell klar sind und Sie
sofort DLP und Gateway brauchen,
- **ab Kapitel 7**, wenn Datenfilter existieren, aber Tool-Chaos und fehlende
Isolation das eigentliche Problem sind,
- **ab Kapitel 9**, wenn Security fragt: „Zeigt mir den Nachweis.“
Am Ende jedes Hauptkapitels stehen Checklisten. Sie sind zum Abhaken gedacht,
nicht als Dekoration.
## Ein Satz vor dem ersten Kapitel
Coding-Agents verändern, wie Software entsteht. Ob sie auch verändern, wie
Unternehmen *unbemerkt* Daten und Rechte abgeben, entscheiden nicht die Modelle –
sondern die Harness-Schicht, die Sie bauen oder dulden.
+23
View File
@@ -0,0 +1,23 @@
# Über den Autor
**Martin Richardt** arbeitet und schreibt an der Schnittstelle von
Softwarearchitektur, KI-Systemen und nachvollziehbarer Technikvermittlung. Ihn
interessiert, was Systeme *tun*, wenn Demos vorbei sind: Grenzen, Anreize,
Betriebsalltag und die Stellen, an denen Sicherheit entweder zur
Ingenieursdisziplin oder zur Folie wird.
In *Secure Coding Agents with Flue* adressiert er die Lücke zwischen
Agent-Hype und freigabefähigem Betrieb. Schwerpunkt sind kontrollierbare
Datenflüsse zum Modell, Isolation und Least Privilege auf dem Aktionspfad sowie
Audit und Playbooks, die Security und Plattform-Teams gemeinsam tragen können.
Flue dient als architektonischer Bezugspunkt für TypeScript-Harnesses – die
Patterns sind bewusst harness-übergreifend formuliert.
Zuvor und parallel: Sachbuch- und Vermittlungsarbeit zu LLMs und Agenten-
Systemen, unter anderem im Schwesterprojekt *Die KI hinter dem Vorhang*, sowie
Praxis in der Entwicklung und im Design technischer Systeme, bei denen
Nachvollziehbarkeit kein Nice-to-have ist.
Dieses Buch spricht Entwicklerinnen und Entwickler, Security-Verantwortliche und
Plattform-Teams an, die Agents nicht nur ausprobieren, sondern verantworten
wollen.
+234
View File
@@ -0,0 +1,234 @@
-- boxes.lua — Pandoc Lua filter for *Next Token*
--
-- Wraps selected sections into colored tcolorbox environments:
--
-- Intro (nexttokenintro):
-- H2/H3 whose text contains "Kern in einem Satz" or "Worum geht es"
-- Summary (nexttokensummary):
-- H2 beginning with "Zusammenfassung"
-- Vertiefung (nexttokenvertiefung):
-- H2/H3: "Zum Weiterdenken", "Vertiefung", "Für Neugierige", "Fuer Neugierige"
-- Info (nexttokeninfo):
-- H2/H3: "Überblick"/"Ueberblick", "Häufiges Missverständnis"/"Haeufiges Missverstaendnis",
-- "Stand der Technik"
--
-- Box opens after matched header; closes before next header of level <= opened level.
-- Title is passed once to the tcolorbox (no duplicate body title).
--
-- Leading manuscript markers ▢ / ☐ are stripped from headers and bold titles
-- so they never appear in body text or the TOC.
--
-- Note: Lua patterns are byte-oriented. Never put multi-byte UTF-8 in [].
local function escape_tex(s)
s = s:gsub("\\", "\\textbackslash{}")
s = s:gsub("([&%%%$#_{}])", "\\%1")
s = s:gsub("~", "\\textasciitilde{}")
s = s:gsub("%^", "\\textasciicircum{}")
s = s:gsub("–", "---")
s = s:gsub("—", "---")
s = s:gsub("…", "\\ldots{}")
s = s:gsub("→", "$\\rightarrow$")
s = s:gsub("≠", "$\\neq$")
return s
end
local function stringify(el)
return pandoc.utils.stringify(el)
end
-- UTF-8 marker strings (exact match / prefix only — no [] character classes)
local MARKERS = {
"▢", -- U+25A2 white square with rounded corners
"☐", -- U+2610 ballot box
}
local function strip_marker_prefix(s)
if not s or s == "" then return s, false end
for _, m in ipairs(MARKERS) do
if s == m then
return "", true
end
local n = #m
if s:sub(1, n) == m then
local rest = s:sub(n + 1)
-- also drop one ASCII space after marker if glued ("▢Text")
if rest:sub(1, 1) == " " then
rest = rest:sub(2)
end
return rest, true
end
end
return s, false
end
local function clean_title(s)
s = s or ""
s = s:gsub("^%s+", "")
s = select(1, strip_marker_prefix(s))
s = s:gsub("\194\160", " ") -- NBSP
s = s:gsub("\239\191\189", " ")
s = s:gsub("^[ \t\n\r\f\v]+", ""):gsub("[ \t\n\r\f\v]+$", "")
s = s:gsub("[ \t\n\r\f\v]+", " ")
return s
end
local function is_space_like(el)
return el.t == "Space" or el.t == "SoftBreak" or el.t == "LineBreak"
end
--- Remove a leading ▢/☐ (and following space) from an inline list.
local function strip_leading_marker_inlines(inlines)
if not inlines or #inlines == 0 then return inlines end
local i = 1
while i <= #inlines and is_space_like(inlines[i]) do
i = i + 1
end
if i > #inlines then return inlines end
local el = inlines[i]
if el.t == "Str" then
local rest, hit = strip_marker_prefix(el.text)
if hit then
local out = {}
if rest ~= "" then
out[#out + 1] = pandoc.Str(rest)
end
i = i + 1
if i <= #inlines and is_space_like(inlines[i]) then
i = i + 1
end
for j = i, #inlines do
out[#out + 1] = inlines[j]
end
return out
end
end
if el.t == "Strong" or el.t == "Emph" then
el.content = strip_leading_marker_inlines(el.content)
inlines[i] = el
end
return inlines
end
local function header_text(el)
return clean_title(stringify(el))
end
local function is_intro(el)
if el.t ~= "Header" or el.level > 3 then return false end
local s = header_text(el)
return s:match("Kern in einem Satz")
or s:match("Worum geht es")
end
local function is_summary(el)
return el.t == "Header" and el.level == 2
and header_text(el):match("^Zusammenfassung")
end
local function is_vertiefung(el)
if el.t ~= "Header" or el.level > 3 then return false end
local s = header_text(el)
return s:match("^Zum Weiterdenken")
or s:match("^Vertiefung")
or s:match("Für Neugierige")
or s:match("Fuer Neugierige")
end
local function is_info(el)
if el.t ~= "Header" or el.level > 3 then return false end
local s = header_text(el)
return s:match("^Überblick")
or s:match("^Ueberblick")
or s:match("^Im Überblick")
or s:match("^Im Ueberblick")
or s:match("Häufiges Missverständnis")
or s:match("Haeufiges Missverstaendnis")
or s:match("Stand der Technik")
end
local function open_env(cls, title)
local env = cls == "intro" and "nexttokenintro"
or cls == "summary" and "nexttokensummary"
or cls == "vertiefung" and "nexttokenvertiefung"
or "nexttokeninfo"
local t = escape_tex(clean_title(title))
return pandoc.RawBlock("latex", "\\begin{" .. env .. "}{" .. t .. "}")
end
local function close_env(cls)
local env = cls == "intro" and "nexttokenintro"
or cls == "summary" and "nexttokensummary"
or cls == "vertiefung" and "nexttokenvertiefung"
or "nexttokeninfo"
return pandoc.RawBlock("latex", "\\end{" .. env .. "}")
end
local function sanitize_header(el)
el.content = strip_leading_marker_inlines(el.content)
return el
end
local function process(blocks)
local out = {}
local i = 1
local open = nil
while i <= #blocks do
local el = blocks[i]
if open and el.t == "Header" and el.level <= open.level then
out[#out + 1] = close_env(open.cls)
open = nil
-- re-process this header (may open a new box)
elseif open then
out[#out + 1] = el
i = i + 1
elseif el.t == "Header" then
el = sanitize_header(el)
local cls = nil
if is_intro(el) then
cls = "intro"
elseif is_summary(el) then
cls = "summary"
elseif is_vertiefung(el) then
cls = "vertiefung"
elseif is_info(el) then
cls = "info"
end
if cls then
open = {cls = cls, level = el.level}
out[#out + 1] = open_env(cls, stringify(el))
i = i + 1
else
out[#out + 1] = el
i = i + 1
end
else
out[#out + 1] = el
i = i + 1
end
end
if open then
out[#out + 1] = close_env(open.cls)
end
return out
end
function Strong(el)
el.content = strip_leading_marker_inlines(el.content)
return el
end
function Pandoc(doc)
doc.blocks = process(doc.blocks)
return doc
end
+35
View File
@@ -0,0 +1,35 @@
% impressum.tex — Copyright / imprint page (placeholder)
\clearpage
\thispagestyle{empty}
\begingroup
\small\color{nexttokentext}%
\raggedright
{\sffamily\color{nexttokenblue}\Large\bfseries Imprint\par}
\vspace{0.8em}
{\sffamily\bfseries Secure Coding Agents with Flue\par}
{\itshape Enterprise-ready Data Protection, Logging \& Compliance Patterns\par}
\vspace{1.0em}
{\sffamily © 2026 Martin Richardt\par}
All rights reserved.\par
\vspace{0.6em}
1st edition 2026\par
Author: Martin Richardt\par
\vspace{1.0em}
This work is protected by copyright.
Any use outside the narrow limits of copyright law
without the author's consent is prohibited.\par
\vspace{0.8em}
% ISBN: add when assigned
\endgroup
\clearpage
+8
View File
@@ -0,0 +1,8 @@
title: "Secure Coding Agents with Flue"
subtitle: "Enterprise-ready Data Protection, Logging & Compliance Patterns"
author: "Martin Richardt"
date: "2026"
lang: de-DE
documentclass: scrbook
classoption: [11pt, a4paper, oneside, openany, DIV=13]
has-frontmatter: true
+26
View File
@@ -0,0 +1,26 @@
% secure-agents-colors.tex — Farbpalette für *Secure Coding Agents with Flue*
% Geladen via Pandoc `-H`. Vorausgesetzt: xcolor (Template lädt es).
\IfFileExists{xcolor.sty}{\usepackage{xcolor}}{}
% --- Hauptpalette (Enterprise Security: Navy / Cyan / Emerald) ------------
\definecolor{secureagentsnavy}{HTML}{0B1220} % Tiefes Navy (H1, Kopf, TOC)
\definecolor{secureagentscyan}{HTML}{00D4FF} % Elektrisches Cyan (Akzent)
\definecolor{secureagentsemerald}{HTML}{2A9D8F} % Gedämpftes Emerald (Linien, Seitenzahl)
\definecolor{secureagentstext}{HTML}{2C2C2C} % Anthrazit (Fließtext)
\definecolor{secureagentsslates}{HTML}{4A5568} % Schiefer (Zitate, Hinweise)
\definecolor{secureagentsparchment}{HTML}{F2F6F8}% Kühles Pergament (Boxen)
\definecolor{secureagentslink}{HTML}{0B3A5C} % Link-Navy
% Aliase für Template-Kompatibilität mit nexttoken-Namensschema
\colorlet{nexttokenblue}{secureagentsnavy}
\colorlet{nexttokengold}{secureagentsemerald}
\colorlet{nexttokenburgundy}{secureagentscyan}
\colorlet{nexttokentext}{secureagentstext}
\colorlet{nexttokenslate}{secureagentsslates}
\colorlet{nexttokenparchment}{secureagentsparchment}
\colorlet{nexttokenlink}{secureagentslink}
\colorlet{secureagentsnavy!soft}{secureagentsnavy!18!white}
\colorlet{secureagentscyan!soft}{secureagentscyan!20!white}
\colorlet{secureagentsemerald!soft}{secureagentsemerald!25!white}
+166
View File
@@ -0,0 +1,166 @@
\documentclass[
$if(fontsize)$
$fontsize$,
$else$
11pt,
$endif$
$if(papersize)$
$papersize$paper,
$else$
a4paper,
$endif$
oneside,
openany,
DIV=12,
BCOR=0mm,
$for(classoption)$
$classoption$$sep$,
$endfor$
]{scrbook}
\usepackage{xcolor}
\definecolor{nexttokenlink}{HTML}{0B3A5C}
$if(geometry)$
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
\usepackage{amsmath,amssymb}
$if(numbersections)$
\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
$else$
\setcounter{secnumdepth}{-\maxdimen}
$endif$
\usepackage{iftex}
\ifLuaTeX
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\setsansfont{Latin Modern Sans}
\setmonofont{Latin Modern Mono}
\else
\usepackage{lmodern}
\fi
\usepackage{setspace}
\usepackage[autostyle=true,english=american]{csquotes}
\MakeOuterQuote{"}
\IfFileExists{microtype.sty}{%
\usepackage{microtype}%
\UseMicrotypeSet[protrusion]{basicmath}%
}{}
\usepackage{booktabs}
\usepackage{calc}
\usepackage{enumitem}
\usepackage{graphicx}
\usepackage{longtable,array}
\providecommand{\tightlist}{\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
$for(header-includes)$
$header-includes$
$endfor$
$highlighting-macros$
\IfFileExists{pdf/templates/secure-agents-preamble.tex}{%
\input{pdf/templates/secure-agents-preamble.tex}%
}{%
\InputIfFileExists{secure-agents-preamble.tex}{}{}%
}
\usepackage{hyperref}
\hypersetup{
$if(title-meta)$
pdftitle={$title-meta$},
$endif$
$if(author-meta)$
pdfauthor={$author-meta$},
$endif$
pdflang={en},
$if(colorlinks)$
colorlinks=true,
linkcolor=$if(linkcolor)$$linkcolor$$else$nexttokenlink$endif$,
urlcolor=$if(urlcolor)$$urlcolor$$else$nexttokenlink$endif$,
citecolor=$if(citecolor)$$citecolor$$else$nexttokenlink$endif$
$else$
hidelinks
$endif$
}
$if(title)$
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
$endif$
$if(subtitle)$
\usepackage{etoolbox}
\makeatletter
\providecommand{\subtitle}[1]{%
\apptocmd{\@title}{\par {\large #1 \par}}{}{}
}
\makeatother
\subtitle{$subtitle$}
$endif$
\author{$for(author)$$author$$sep$ \and $endfor$}
\date{$date$}
\begin{document}
\ProjectCover
\ProjectHalfTitle
$if(has-frontmatter)$
\frontmatter
$endif$
\IfFileExists{pdf/front/impressum.tex}{%
\input{pdf/front/impressum.tex}%
}{}
$for(include-before)$
$include-before$
$endfor$
$if(toc)$
$if(toc-title)$
\renewcommand*\contentsname{$toc-title$}
$endif$
{
$if(colorlinks)$
\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$nexttokenlink$endif$}
$endif$
\setcounter{tocdepth}{$if(toc-depth)$$toc-depth$$else$2$endif$}
\tableofcontents
}
$endif$
$if(lof)$
\listoffigures
$endif$
$if(lot)$
\listoftables
$endif$
$if(linestretch)$
\setstretch{$linestretch$}
$endif$
$if(has-frontmatter)$
\mainmatter
$endif$
$body$
$if(has-frontmatter)$
\backmatter
$endif$
$for(include-after)$
$include-after$
$endfor$
\end{document}
+267
View File
@@ -0,0 +1,267 @@
% secure-agents-preamble.tex — Präambel für *Secure Coding Agents with Flue*
% Portiert und verschlankt aus nexttoken-preamble.tex (ki-hinterm-vorhang).
% Makros: \ProjectCover, \ProjectHalfTitle, \ProjectCoverImage, \ProjectPartPage
% ===========================================================================
% 1) FONTS
% ===========================================================================
\directlua{
luaotfload.add_fallback("secureagentsfb", {"DejaVu Serif:mode=node;"})
}
\setmainfont{Charter}[
Ligatures=TeX,
Scale=MatchLowercase,
RawFeature={fallback=secureagentsfb}
]
\setsansfont{DejaVu Sans}[
Ligatures=TeX,
Scale=MatchLowercase
]
\setmonofont{DejaVu Sans Mono}[
Scale=MatchLowercase
]
% ===========================================================================
% 2) KOMA-Script Überschriften
% ===========================================================================
\addtokomafont{chapter}{\color{nexttokenblue}\sffamily\bfseries}
\addtokomafont{part}{\color{nexttokenblue}\sffamily\bfseries}
\addtokomafont{section}{\color{nexttokenblue}}
\addtokomafont{subsection}{\color{nexttokengold}}
\addtokomafont{disposition}{\normalcolor}
\RedeclareSectionCommand[beforeskip=1.8\baselineskip,afterskip=.8\baselineskip]{chapter}
\RedeclareSectionCommand[beforeskip=1.3\baselineskip,afterskip=.5\baselineskip]{section}
\RedeclareSectionCommand[beforeskip=1.0\baselineskip,afterskip=.3\baselineskip]{subsection}
% ===========================================================================
% 3) Kopf-/Fußzeile
% ===========================================================================
\usepackage{scrlayer-scrpage}
\clearpairofpagestyles
\lehead{\headmark}
\rohead{\headmark}
\chead{}
\cfoot*{\pagemark}
\setkomafont{pagehead}{\color{nexttokenblue}\sffamily}
\setkomafont{pagenumber}{\color{nexttokengold}\sffamily\bfseries}
\KOMAoptions{headsepline=.6pt}
\addtokomafont{headsepline}{\color{nexttokengold}}
% ===========================================================================
% 4) TOC
% ===========================================================================
\setcounter{tocdepth}{2}
\setcounter{secnumdepth}{0}
\setkomafont{partentry}{\color{nexttokenblue}\bfseries\sffamily}
\setkomafont{chapterentry}{\color{nexttokenblue}\sffamily}
\KOMAoptions{toc=chapterentrywithdots}
% ===========================================================================
% 5) Pandoc-Shaded
% ===========================================================================
\usepackage{framed}
\usepackage{color}
\definecolor{shadecolor}{RGB}{248,248,248}
% ===========================================================================
% 6) Zitat-Box
% ===========================================================================
\usepackage{mdframed}
\newmdenv[
leftline=true,
rightline=false,
topline=false,
bottomline=false,
linewidth=2.5pt,
linecolor=nexttokengold,
backgroundcolor=nexttokenslate!6!white,
leftmargin=0pt,
rightmargin=0pt,
innerleftmargin=12pt,
innerrightmargin=6pt,
innertopmargin=4pt,
innerbottommargin=4pt,
skipabove=10pt,
skipbelow=10pt
]{secureagentsquotebox}
\newenvironment{secureagentsquote}
{\begin{secureagentsquotebox}\itshape\color{nexttokenslate}}
{\end{secureagentsquotebox}}
% ===========================================================================
% 7) tcolorbox (boxes.lua → nexttoken* env names for filter reuse)
% ===========================================================================
\usepackage{tcolorbox}
\tcbuselibrary{breakable,skins}
\usepackage{float}
\usepackage{placeins}
\floatplacement{figure}{htbp}
\setcounter{topnumber}{3}
\setcounter{bottomnumber}{2}
\setcounter{totalnumber}{5}
\renewcommand{\topfraction}{0.85}
\renewcommand{\bottomfraction}{0.7}
\renewcommand{\textfraction}{0.12}
\renewcommand{\floatpagefraction}{0.7}
\setlength{\textfloatsep}{12pt plus 3pt minus 2pt}
\setlength{\floatsep}{10pt plus 2pt minus 2pt}
\setlength{\intextsep}{10pt plus 2pt minus 2pt}
\newtcolorbox{nexttokenintro}[1]{
colback=nexttokenparchment,
colframe=nexttokengold,
coltext=nexttokentext,
boxrule=0.6pt,
arc=4pt,
left=10pt, right=10pt, top=8pt, bottom=8pt,
fontupper=\small,
breakable,
sharp corners=downhill,
title={\sffamily\bfseries\color{nexttokenblue}#1},
titlerule=0pt,
colbacktitle=nexttokengold!10!white,
coltitle=nexttokenblue,
title after break={\sffamily\bfseries\color{nexttokenblue}#1\ (continued)}
}
\newtcolorbox{nexttokensummary}[1]{
colback=nexttokenparchment!40,
colframe=nexttokenblue,
coltext=nexttokentext,
boxrule=0.8pt,
arc=4pt,
left=10pt, right=10pt, top=10pt, bottom=8pt,
fontupper=\small,
breakable,
sharp corners=downhill,
title={\sffamily\bfseries\color{nexttokenblue}#1},
titlerule=0pt,
colbacktitle=nexttokenblue!12!white,
coltitle=nexttokenblue,
title after break={\sffamily\bfseries\color{nexttokenblue}#1\ (continued)}
}
\newtcolorbox{nexttokenvertiefung}[1]{
colback=nexttokenparchment!92!nexttokengold,
colframe=nexttokengold,
coltext=nexttokentext,
boxrule=0.8pt,
arc=4pt,
left=10pt, right=10pt, top=10pt, bottom=8pt,
fontupper=\small,
breakable,
sharp corners=downhill,
title={\sffamily\bfseries\color{nexttokenblue}#1},
titlerule=0pt,
colbacktitle=nexttokengold!14!white,
coltitle=nexttokenblue,
title after break={\sffamily\bfseries\color{nexttokenblue}#1\ (continued)}
}
\newtcolorbox{nexttokeninfo}[1]{
colback=nexttokenblue!6!white,
colframe=nexttokenblue,
coltext=nexttokentext,
boxrule=0.7pt,
arc=4pt,
left=10pt, right=10pt, top=10pt, bottom=8pt,
fontupper=\small,
breakable,
sharp corners=downhill,
title={\sffamily\bfseries\color{nexttokenblue}#1},
titlerule=0pt,
colbacktitle=nexttokenblue!12!white,
coltitle=nexttokenblue,
title after break={\sffamily\bfseries\color{nexttokenblue}#1\ (continued)}
}
% ===========================================================================
% 8) Cover- und Part-Page-Befehle
% ===========================================================================
\usepackage{eso-pic}
\newcommand{\ProjectHalfTitle}{%
\clearpage
\thispagestyle{empty}%
\null
\vspace*{0.28\textheight}%
\begin{center}
{\sffamily\color{nexttokengold}\Large\bfseries\MakeUppercase{Secure Coding Agents with Flue}\par}
\vspace{0.7cm}
\rule{0.35\textwidth}{0.8pt}\par
\vspace{0.7cm}
{\sffamily\color{nexttokenblue}\LARGE\bfseries Enterprise-ready Data Protection,\par
\vspace{0.15cm} Logging \& Compliance Patterns\par}
\vspace{1.6cm}
{\sffamily\color{nexttokentext}\large Martin Richardt\par}
\end{center}
\vfill
\clearpage
}
\newcommand{\ProjectCoverImage}[1]{%
\AddToShipoutPictureBG*{%
\AtPageLowerLeft{%
\includegraphics[width=\paperwidth,height=\paperheight]{#1}%
}%
}%
\null\vfill
}
\newcommand{\ProjectCover}{%
\begin{titlepage}
\thispagestyle{empty}%
\IfFileExists{assets/cover/cover.jpg}{%
\ProjectCoverImage{assets/cover/cover.jpg}%
}{%
\IfFileExists{assets/cover/cover.png}{%
\ProjectCoverImage{assets/cover/cover.png}%
}{%
\centering
\vspace*{1.5cm}
{\sffamily\color{nexttokengold}\Large\bfseries\MakeUppercase{Secure Coding Agents with Flue}\par}
\vspace{0.6cm}
\rule{0.5\textwidth}{1.2pt}\par
\vspace{0.8cm}
{\sffamily\color{nexttokenblue}\Huge\bfseries Enterprise-ready Data Protection,\par
\vspace{0.2cm} Logging \& Compliance Patterns\par}
\vspace{0.8cm}
\rule{0.5\textwidth}{1.2pt}\par
\vspace{1.0cm}
{\sffamily\color{nexttokentext}\Large Security patterns for coding agents\par}
\vfill
{\sffamily\color{nexttokenslate}\footnotesize Martin Richardt\par}
}%
}%
\end{titlepage}
}
% \ProjectPartPage{nr}{title}{image path} — reserved for later manuscript parts
\newcommand{\ProjectPartPage}[3]{%
\cleardoubleoddpage
\thispagestyle{empty}%
\begingroup
\centering
\vspace*{0.5cm}%
{\sffamily\color{nexttokengold}\Huge\bfseries Teil #1\par}%
\vspace{0.35cm}%
\rule{0.4\textwidth}{1.2pt}\par
\vspace{0.4cm}%
{\sffamily\color{nexttokenblue}\huge\bfseries #2\par}%
\vspace{0.45cm}%
\IfFileExists{#3}{%
\includegraphics[width=0.92\textwidth,height=0.72\textheight,keepaspectratio]{#3}\par
}{%
\fbox{\parbox{0.92\textwidth}{\centering\vspace{1.4cm}%
\sffamily\color{nexttokenslate}\small (Teil-Bild folgt: #3)\par
\vspace{1.4cm}}\par}%
}%
\vfill
\endgroup
\clearpage
}
\AtBeginDocument{\color{nexttokentext}\raggedbottom}
+148
View File
@@ -0,0 +1,148 @@
#!/usr/bin/env python3
"""Assemble *Secure Coding Agents with Flue* from manuskript/*.md sources.
Reads chapters in fixed CHAPTER_ORDER, injects optional Part-Pages,
writes build/book.md. Source files are never modified.
CLI:
python3 scripts/assemble_book.py [--out PATH]
"""
from __future__ import annotations
import argparse
import pathlib
import re
REPO_ROOT = pathlib.Path(__file__).resolve().parent.parent
SOURCE_DIR = REPO_ROOT / "manuskript"
BUILD_DIR = REPO_ROOT / "build"
DEFAULT_TARGET = BUILD_DIR / "book.md"
CHAPTER_ORDER = [
("prolog.md", "body"),
("kapitel-01-warum-sichere-agents.md", "body"),
("kapitel-02-flue-architektur.md", "body"),
("kapitel-03-bedrohungsmodell.md", "body"),
("kapitel-04-datenfluss-llm.md", "body"),
("kapitel-05-dlp-pattern-matching.md", "body"),
("kapitel-06-entropie-filter.md", "body"),
("kapitel-07-sandbox-strategien.md", "body"),
("kapitel-08-tool-permissions.md", "body"),
("kapitel-09-logging-audit.md", "body"),
("kapitel-10-enterprise-patterns.md", "body"),
("kapitel-11-betrieb-playbooks.md", "body"),
("epilog.md", "body"),
("glossar.md", "body"),
("literatur.md", "body"),
("ueber-den-autor.md", "body"),
("kolophon.md", "body"),
]
BACKMATTER_BEFORE = {"glossar.md"}
# Part dividers (images optional — placeholder if missing)
PART_BEFORE = {
"kapitel-01-warum-sichere-agents.md": (
1,
"Grundlagen",
"assets/parts/teil-01.png",
),
"kapitel-04-datenfluss-llm.md": (
2,
"Datenschutz und DLP",
"assets/parts/teil-02.png",
),
"kapitel-07-sandbox-strategien.md": (
3,
"Isolation und Runtime",
"assets/parts/teil-03.png",
),
"kapitel-09-logging-audit.md": (
4,
"Compliance und Betrieb",
"assets/parts/teil-04.png",
),
}
FIGURE_MARKERS: dict[str, list[str]] = {}
_H1_RE = re.compile(r"^#\s+(.*?)\s*$")
def first_h1_title(text: str) -> str | None:
for line in text.splitlines():
m = _H1_RE.match(line)
if m:
return m.group(1)
return None
def make_part_page_block(number: int, title: str, image: str) -> str:
return (
"```{=latex}\n"
f"\\ProjectPartPage{{{number}}}{{{title}}}{{{image}}}\n"
"```\n"
)
def assemble(out_path: pathlib.Path) -> None:
BUILD_DIR.mkdir(parents=True, exist_ok=True)
parts: list[str] = []
for filename, kind in CHAPTER_ORDER:
src = SOURCE_DIR / filename
if not src.exists():
raise SystemExit(f"Quelldatei nicht gefunden: {src}")
if filename in PART_BEFORE:
number, title, image = PART_BEFORE[filename]
parts.append(make_part_page_block(number, title, image))
if filename in BACKMATTER_BEFORE:
parts.append("```{=latex}\n\\backmatter\n```")
if kind == "part":
pass
content = src.read_text(encoding="utf-8").rstrip("\n")
if content.startswith("---"):
end = content.find("\n---", 3)
if end != -1:
content = content[end + 4 :].lstrip("\n")
parts.append(content)
for marker in FIGURE_MARKERS.get(filename, []):
if marker in content:
continue
parts.append("")
parts.append(marker)
book_md = "\n\n".join(parts).strip() + "\n"
out_path.write_text(book_md, encoding="utf-8")
n_parts = len(PART_BEFORE)
print(
f"Assembliert: {len(CHAPTER_ORDER)} Dateien "
f"({n_parts} Part-Pages) -> {out_path}"
)
def main() -> int:
parser = argparse.ArgumentParser(
description="Assemble Secure Coding Agents with Flue into build/book.md"
)
parser.add_argument(
"--out",
type=pathlib.Path,
default=DEFAULT_TARGET,
help="Output path (default: build/book.md)",
)
args = parser.parse_args()
assemble(args.out)
return 0
if __name__ == "__main__":
raise SystemExit(main())
+202
View File
@@ -0,0 +1,202 @@
#!/usr/bin/env python3
"""Build the book cover: art base + precise typography overlay.
Requires: Pillow (pip install pillow)
Art base: assets/cover/cover-art.jpg (text-free background)
Output: assets/cover/cover.jpg, cover-hires.png, cover-web.jpg
"""
from __future__ import annotations
from pathlib import Path
from PIL import Image, ImageDraw, ImageEnhance, ImageFilter, ImageFont
ROOT = Path(__file__).resolve().parents[1]
ART = ROOT / "assets" / "cover" / "cover-art.jpg"
OUT = ROOT / "assets" / "cover"
W, H = 1600, 2400
# macOS system fonts (same approach as ki-hinterm-vorhang)
BASK = "/System/Library/Fonts/Supplemental/Baskerville.ttc"
AVEN = "/System/Library/Fonts/Avenir Next.ttc"
HELV = "/System/Library/Fonts/Helvetica.ttc"
# --- tunable layout (fractions of canvas height) ---------------------------
KICKER_Y = 0.078
TITLE_Y = 0.125
TITLE_SIZE = 62
SUB_SIZE = 23
TAG_SIZE = 16
AUTHOR_SIZE = 26
AUTHOR_Y = 0.875
YEAR_Y = 0.925
def font(path: str, index: int, size: int) -> ImageFont.FreeTypeFont:
return ImageFont.truetype(path, size=size, index=index)
def main() -> None:
if not ART.exists():
raise SystemExit(f"Missing art base: {ART}")
bg = Image.open(ART).convert("RGBA").resize((W, H), Image.Resampling.LANCZOS)
# Soft readability veil behind the title block only
panel = Image.new("RGBA", (W, H), (0, 0, 0, 0))
pd = ImageDraw.Draw(panel)
pd.rounded_rectangle([120, 140, W - 120, 720], radius=40, fill=(4, 10, 24, 92))
panel = panel.filter(ImageFilter.GaussianBlur(48))
base = Image.alpha_composite(bg, panel)
# Soft veil for author/footer band
foot = Image.new("RGBA", (W, H), (0, 0, 0, 0))
fd = ImageDraw.Draw(foot)
fd.rounded_rectangle([200, int(H * 0.84), W - 200, int(H * 0.97)], radius=28, fill=(4, 10, 24, 70))
foot = foot.filter(ImageFilter.GaussianBlur(28))
base = Image.alpha_composite(base, foot)
# Baskerville: 0 Regular, 1 Bold, 4 SemiBold
# Avenir Next: 5 Medium, 7 Regular, 10 Ultra Light
title_f = font(BASK, 4, TITLE_SIZE)
sub_f = font(AVEN, 5, SUB_SIZE)
kicker_f = font(AVEN, 5, 16)
tag_f = font(AVEN, 7, TAG_SIZE)
author_f = font(AVEN, 5, AUTHOR_SIZE)
year_f = font(AVEN, 7, 15)
WHITE = (238, 242, 248, 252)
SUB = (186, 204, 222, 230)
KICKER = (100, 210, 230, 220)
TAG = (130, 170, 185, 175)
AUTHOR = (220, 228, 238, 245)
YEAR = (120, 150, 170, 160)
CYAN = (0, 212, 255, 210)
EMERALD = (42, 157, 143, 180)
LINE = (160, 195, 210, 140)
layer = Image.new("RGBA", (W, H), (0, 0, 0, 0))
draw = ImageDraw.Draw(layer)
def measure(fnt, text: str) -> tuple[int, int]:
b = draw.textbbox((0, 0), text, font=fnt)
return b[2] - b[0], b[3] - b[1]
def draw_text(x, y, text, fnt, fill, shadow=True):
if shadow:
draw.text((x + 1, y + 2), text, font=fnt, fill=(0, 0, 0, 100))
draw.text((x, y), text, font=fnt, fill=fill)
def draw_centered(y, text, fnt, fill, tracking=0, shadow=True) -> int:
if tracking <= 0:
w, h = measure(fnt, text)
draw_text((W - w) // 2, y, text, fnt, fill, shadow=shadow)
return h
chars = list(text)
widths = [measure(fnt, c)[0] for c in chars]
total = sum(widths) + tracking * max(len(chars) - 1, 0)
x = (W - total) // 2
h = measure(fnt, text)[1]
for c, cw in zip(chars, widths):
draw_text(x, y, c, fnt, fill, shadow=shadow)
x += cw + tracking
return h
def draw_lines(y, lines, fnt, fill, gap=8) -> int:
th = 0
for line in lines:
h = draw_centered(y + th, line, fnt, fill)
th += h + gap
return th
def rule(y, width, with_dot=False):
rx = (W - width) // 2
if with_dot:
gap = 11
draw.line([(rx, y), (W // 2 - gap, y)], fill=LINE, width=1)
draw.line([(W // 2 + gap, y), (rx + width, y)], fill=LINE, width=1)
cx = W // 2
draw.ellipse([cx - 3.2, y - 3.2, cx + 3.2, y + 3.2], outline=CYAN, width=1)
draw.ellipse([cx - 1.2, y - 1.2, cx + 1.2, y + 1.2], fill=CYAN)
else:
draw.line([(rx, y), (rx + width, y)], fill=LINE, width=1)
# 1) Kicker
y = int(H * KICKER_Y)
draw_centered(y, "SECURITY ENGINEERING", kicker_f, KICKER, tracking=10, shadow=False)
kw = measure(kicker_f, "SECURITY ENGINEERING")[0] + 10 * 20
kx = (W - kw) // 2
draw.line([(kx, y + 26), (kx + kw, y + 26)], fill=CYAN, width=1)
# 2) Title — two lines
y = int(H * TITLE_Y)
th = 0
for i, line in enumerate(["Secure Coding Agents", "with Flue"]):
size = TITLE_SIZE if i == 0 else int(TITLE_SIZE * 0.88)
fnt = font(BASK, 4, size)
h = draw_centered(y + th, line, fnt, WHITE, tracking=0.4)
th += h + (10 if i == 0 else 0)
# 3) Divider
y_rule = y + th + 24
rule(y_rule, 120, with_dot=True)
# 4) Subtitle
y_sub = y_rule + 26
sh = draw_lines(
y_sub,
[
"Enterprise-ready Data Protection,",
"Logging & Compliance Patterns",
],
sub_f,
SUB,
gap=7,
)
# 5) Thematic tags
y_tag = y_sub + sh + 22
draw_centered(
y_tag,
"DLP · Sandbox · Audit",
tag_f,
TAG,
tracking=2,
shadow=False,
)
# subtle emerald accent under tags
tw = measure(tag_f, "DLP · Sandbox · Audit")[0]
draw.line(
[((W - tw) // 2, y_tag + 28), ((W + tw) // 2, y_tag + 28)],
fill=EMERALD,
width=1,
)
# 6) Author
y_author = int(H * AUTHOR_Y)
rule(y_author - 20, 64, with_dot=False)
draw_centered(y_author, "Martin Richardt", author_f, AUTHOR)
# 7) Year
draw_centered(int(H * YEAR_Y), "2026", year_f, YEAR, tracking=10, shadow=False)
rgb = Image.alpha_composite(base, layer).convert("RGB")
rgb = ImageEnhance.Contrast(rgb).enhance(1.03)
rgb = ImageEnhance.Color(rgb).enhance(1.04)
OUT.mkdir(parents=True, exist_ok=True)
rgb.save(OUT / "cover-hires.png", "PNG")
rgb.save(OUT / "cover.jpg", "JPEG", quality=93, optimize=True, progressive=True)
mid = rgb.resize((800, 1200), Image.Resampling.LANCZOS)
mid.save(OUT / "cover-web.jpg", "JPEG", quality=88, optimize=True)
print(f"Wrote {OUT / 'cover.jpg'} ({W}×{H})")
print(
f"sizes: title={TITLE_SIZE} sub={SUB_SIZE} author={AUTHOR_SIZE} "
f"| author_y={AUTHOR_Y:.0%} tags='DLP · Sandbox · Audit'"
)
if __name__ == "__main__":
main()