Files
NSCT---Neutral-Search-Crawl…/SECURITY.md
NSCT Agent e9410be941 Stage 0: Repository und Architekturgrundlage
- Pyproject.toml mit FastAPI, Pydantic v2, SQLAlchemy, httpx, asyncio,
  BeautifulSoup4, selectolax, trafilatura, uvicorn, pytest-asyncio
- Multi-stage Dockerfile (Python 3.12-slim, Non-Root-User nsct)
- docker-compose.yml (nsct-api + postgres + optional searxng)
- .env.example mit allen Config-Parametern
- Config-System: AppSettings mit LLMConfig, VisionConfig, AudioConfig,
  DatabaseConfig — komplett aus Environment, keine Hardcodes
- Strukturiertes Logging mit research_id/llm_request_id Tracking
- Pydantic v2 Schemas: SearchQuery, Source, Claim, EvidenceRelation,
  CitationEdge, ResearchReport
- SQLAlchemy 2.0 Declarative Models + async Engine Factory
- SSRF-Schutz: URL-Validation, IP-Blocklist (RFC1918, Cloud Metadata,
  file://, ftp://)
- Provider-Interfaces: LLMProvider, VisionProvider, AudioProvider,
  SearchProvider, ContentFetcher als ABCs
- Health-Endpoints: /health, /ready (LLM-Connect-Test), /providers
- FastAPI App mit CORS, lifespan (LLM Pre-Flight)
- CLI-Stub mit Entry-Points: nsct, nsct-core, nsct-api
- 6 Test-Cases: /health, /ready, /providers + No-Secrets-Test
- Vollständige Dokumentation: README, ARCHITECTURE, SECURITY,
  METHODOLOGY, API, DEPLOYMENT
- .gitignore (Python, Docker, IDE, .env)
2026-08-23 11:33:45 +00:00

105 lines
4.4 KiB
Markdown

# NSCT — Sicherheitsgrundsätze
## 1. Grundprinzip
NSCT verarbeitet **untrusted input** von überall im Web. Jede externe Quelle
kann versuchen, die Integrität des Systems zu kompromittieren. Alle
Sicherheitsmaßnahmen folgen dem "zero trust" Prinzip.
## 2. Control Plane vs. Evidence Plane
```
┌─────────────────────────────────────────────────────────┐
│ CONTROL PLANE │
│ (vertrauenswürdige, interne Daten) │
│ │
│ • Konfiguration (Environment Variables) │
│ • Strukturierter Prompt (LLM Instruktionen) │
│ • Normierte Claims (bereinigt, de-biased) │
│ • EvidenceRelations (Vergleichsergebnisse) │
└──────────────┬──────────────────────────────────────────┘
│ LLM verarbeitet NUR strukturierte Daten
┌──────────────▼──────────────────────────────────────────┐
│ EVIDENCE PLANE │
│ (untrusted, externe Daten) │
│ │
│ • Roh-Webcontent (HTML, Text) │
│ • Search-Provider-Ergebnisse │
│ • Extrahierte Claims (roh, unverarbeitet) │
│ • Audio/Vision-Rohdaten │
└─────────────────────────────────────────────────────────┘
```
**Regel:** Webcontent wechselt niemals direkt die Grenze von Evidence Plane
in die Control Plane als Prompt-Text.
## 3. SSRF-Schutz
Jede outbound-HTTP-Anfrage muss durch `nsct/security/policy.py`:
1. **Schema-Check:** Nur `http://` und `https://` erlaubt
2. **IP-Blocklist:**
- `127.0.0.0/8` — Loopback
- `10.0.0.0/8` — Private Class A
- `172.16.0.0/12` — Private Class B
- `192.168.0.0/16` — Private Class C
- `169.254.0.0/16` — Link-local / Link-local
- `192.0.0.0/24` — IETF Protocol Assignments
- `100.64.0.0/10` — Shared Address Space
- `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24` — TEST-NET
3. **Metadata-Endpunkte:** Cloud-Instance-Metadata (`169.254.169.254`, etc.)
4. **Schemata:** `file://`, `ftp://`, `gopher://`, `ldap://`, `data://` blockiert
## 4. Prompt-Isolation
Der LLM darf **niemals** rohen Webcontent als Teil des Prompts sehen. Der
einzige Weg, Webcontent für den LLM verfügbar zu machen, ist über strukturierte
Daten:
```json
{
"source": {
"url": "https://example.com",
"domain": "example.com",
"title": "Titel",
"author": "Autor",
"content_type": "news",
"language": "de"
},
"claims": [
{
"id": "uuid",
"normalized_claim": "De-biased claim text",
"claim_type": "factual",
"confidence": 0.95
}
]
}
```
Der LLM sieht **nur** dieses JSON — nie den HTML/Raw-Text.
## 5. Untrusted Data Handling
| Quelle | Risiko | Schutzmaßnahme |
|--------|--------|---------------|
| Search Provider | Fake-Scores, Manipulation | Score != Evidence-Ranking; nur als Eingabe |
| Web Content | XSS, Prompt-Injection, SSRF | HTML-Extraktion → Text, strikte Schema-Validierung |
| LLM Output | Halluzination, Bias | Claims mit confidence scoring; keine single-source truth |
| Audio/Vision | Manipulierte Inputs | Content-Type-Validierung; Größ Limits |
## 6. Docker-Sicherheit
- **Non-Root-User:** `nsct` (UID 1000)
- **Read-Only-Filesystem:** `read_only: true` wo möglich
- **Dropped Capabilities:** `cap_drop: [ALL]`
- **No Secrets in Image:** `.env` wird nicht gebuildet
- **Resource Limits:** Memory und CPU begrenzt pro Container
## 7. Compliance
- Keine Speicherung von personenbezogenen Daten über die Quellen-Metadaten hinaus
- Claims und Evidence Relations werden nur so lange gespeichert wie nötig
- Alle Daten sind exportierbar und löschbar (SQLAlchemy cascade)