From 0125199c766d3bc971ab6642dae7c126dc4e4d65 Mon Sep 17 00:00:00 2001 From: Sharang Parnerkar <30073382+mighty840@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:50:15 +0200 Subject: [PATCH] refactor(admin): split controls, training, control-provenance, iace/verification pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each page.tsx exceeded the 500-LOC hard cap. Extracted components and hooks into colocated _components/ and _hooks/ directories; page.tsx is now a thin orchestrator. - controls/page.tsx: 944 → 180 LOC; extracted ControlCard, AddControlForm, LoadingSkeleton, TransitionErrorBanner, StatsCards, FilterBar, RAGPanel into _components/ and useControlsData, useRAGSuggestions into _hooks/; types into _types.ts - training/page.tsx: 780 → 288 LOC; extracted ContentTab (inline content generator tab) into _components/ContentTab.tsx - control-provenance/page.tsx: 739 → 122 LOC; extracted MarkdownRenderer, UsageBadge, PermBadge, LicenseMatrix, SourceRegistry into _components/; PROVENANCE_SECTIONS static data into _data/provenance-sections.ts - iace/[projectId]/verification/page.tsx: 673 → 196 LOC; extracted StatusBadge, VerificationForm, CompleteModal, SuggestEvidenceModal, VerificationTable into _components/ Zero behavior changes; logic relocated verbatim. Co-Authored-By: Claude Sonnet 4.6 --- .../_components/LicenseMatrix.tsx | 56 + .../_components/MarkdownRenderer.tsx | 38 + .../_components/SourceRegistry.tsx | 57 + .../_components/UsageBadge.tsx | 25 + .../_data/provenance-sections.ts | 404 +++++ .../app/sdk/control-provenance/page.tsx | 671 +------- .../controls/_components/AddControlForm.tsx | 104 ++ .../sdk/controls/_components/ControlCard.tsx | 163 ++ .../sdk/controls/_components/FilterBar.tsx | 37 + .../controls/_components/LoadingSkeleton.tsx | 18 + .../app/sdk/controls/_components/RAGPanel.tsx | 135 ++ .../sdk/controls/_components/StatsCards.tsx | 32 + .../_components/TransitionErrorBanner.tsx | 40 + .../sdk/controls/_hooks/useControlsData.ts | 197 +++ .../sdk/controls/_hooks/useRAGSuggestions.ts | 53 + admin-compliance/app/sdk/controls/_types.ts | 56 + admin-compliance/app/sdk/controls/page.tsx | 867 +--------- .../_components/CompleteModal.tsx | 74 + .../verification/_components/StatusBadge.tsx | 15 + .../_components/SuggestEvidenceModal.tsx | 126 ++ .../_components/VerificationForm.tsx | 115 ++ .../_components/VerificationTable.tsx | 93 ++ .../iace/[projectId]/verification/page.tsx | 539 +------ .../sdk/training/_components/ContentTab.tsx | 392 +++++ admin-compliance/app/sdk/training/page.tsx | 1388 ++--------------- 25 files changed, 2447 insertions(+), 3248 deletions(-) create mode 100644 admin-compliance/app/sdk/control-provenance/_components/LicenseMatrix.tsx create mode 100644 admin-compliance/app/sdk/control-provenance/_components/MarkdownRenderer.tsx create mode 100644 admin-compliance/app/sdk/control-provenance/_components/SourceRegistry.tsx create mode 100644 admin-compliance/app/sdk/control-provenance/_components/UsageBadge.tsx create mode 100644 admin-compliance/app/sdk/control-provenance/_data/provenance-sections.ts create mode 100644 admin-compliance/app/sdk/controls/_components/AddControlForm.tsx create mode 100644 admin-compliance/app/sdk/controls/_components/ControlCard.tsx create mode 100644 admin-compliance/app/sdk/controls/_components/FilterBar.tsx create mode 100644 admin-compliance/app/sdk/controls/_components/LoadingSkeleton.tsx create mode 100644 admin-compliance/app/sdk/controls/_components/RAGPanel.tsx create mode 100644 admin-compliance/app/sdk/controls/_components/StatsCards.tsx create mode 100644 admin-compliance/app/sdk/controls/_components/TransitionErrorBanner.tsx create mode 100644 admin-compliance/app/sdk/controls/_hooks/useControlsData.ts create mode 100644 admin-compliance/app/sdk/controls/_hooks/useRAGSuggestions.ts create mode 100644 admin-compliance/app/sdk/controls/_types.ts create mode 100644 admin-compliance/app/sdk/iace/[projectId]/verification/_components/CompleteModal.tsx create mode 100644 admin-compliance/app/sdk/iace/[projectId]/verification/_components/StatusBadge.tsx create mode 100644 admin-compliance/app/sdk/iace/[projectId]/verification/_components/SuggestEvidenceModal.tsx create mode 100644 admin-compliance/app/sdk/iace/[projectId]/verification/_components/VerificationForm.tsx create mode 100644 admin-compliance/app/sdk/iace/[projectId]/verification/_components/VerificationTable.tsx create mode 100644 admin-compliance/app/sdk/training/_components/ContentTab.tsx diff --git a/admin-compliance/app/sdk/control-provenance/_components/LicenseMatrix.tsx b/admin-compliance/app/sdk/control-provenance/_components/LicenseMatrix.tsx new file mode 100644 index 0000000..46b4378 --- /dev/null +++ b/admin-compliance/app/sdk/control-provenance/_components/LicenseMatrix.tsx @@ -0,0 +1,56 @@ +import { UsageBadge } from './UsageBadge' + +interface LicenseInfo { + license_id: string + name: string + terms_url: string | null + commercial_use: string + ai_training_restriction: string | null + tdm_allowed_under_44b: string | null + deletion_required: boolean + notes: string | null +} + +export function LicenseMatrix({ licenses, loading }: { licenses: LicenseInfo[]; loading: boolean }) { + return ( +
+

Lizenz-Matrix

+

Uebersicht aller Lizenzen mit ihren erlaubten Nutzungsarten.

+ {loading ? ( +
+ ) : ( +
+ + + + + + + + + + + + {licenses.map(lic => ( + + + + + + + + ))} + +
LizenzKommerziellAI-TrainingTDM (§44b)Loeschpflicht
+
{lic.license_id}
+
{lic.name}
+
+ {lic.deletion_required + ? Ja + : Nein} +
+
+ )} +
+ ) +} diff --git a/admin-compliance/app/sdk/control-provenance/_components/MarkdownRenderer.tsx b/admin-compliance/app/sdk/control-provenance/_components/MarkdownRenderer.tsx new file mode 100644 index 0000000..edf0c5d --- /dev/null +++ b/admin-compliance/app/sdk/control-provenance/_components/MarkdownRenderer.tsx @@ -0,0 +1,38 @@ +export function MarkdownRenderer({ content }: { content: string }) { + let html = content + .replace(/&/g, '&') + .replace(//g, '>') + + html = html.replace( + /^```[\w]*\n([\s\S]*?)^```$/gm, + (_m, code: string) => `
${code.trimEnd()}
` + ) + + html = html.replace( + /^(\|.+\|)\n(\|[\s:|-]+\|)\n((?:\|.+\|\n?)*)/gm, + (_m, header: string, _sep: string, body: string) => { + const ths = header.split('|').filter((c: string) => c.trim()).map((c: string) => + `${c.trim()}` + ).join('') + const rows = body.trim().split('\n').map((row: string) => { + const tds = row.split('|').filter((c: string) => c.trim()).map((c: string) => + `${c.trim()}` + ).join('') + return `${tds}` + }).join('') + return `${ths}${rows}
` + } + ) + + html = html.replace(/^### (.+)$/gm, '

$1

') + html = html.replace(/^## (.+)$/gm, '

$1

') + html = html.replace(/\*\*(.+?)\*\*/g, '$1') + html = html.replace(/`([^`]+)`/g, '$1') + html = html.replace(/^- (.+)$/gm, '
  • $1
  • ') + html = html.replace(/((?:]*>.*<\/li>\n?)+)/g, '
      $1
    ') + html = html.replace(/^(\d+)\. (.+)$/gm, '
  • $2
  • ') + html = html.replace(/^(?!<[hultdp]|$)(.+)$/gm, '

    $1

    ') + + return
    +} diff --git a/admin-compliance/app/sdk/control-provenance/_components/SourceRegistry.tsx b/admin-compliance/app/sdk/control-provenance/_components/SourceRegistry.tsx new file mode 100644 index 0000000..21b6136 --- /dev/null +++ b/admin-compliance/app/sdk/control-provenance/_components/SourceRegistry.tsx @@ -0,0 +1,57 @@ +import { ExternalLink } from 'lucide-react' +import { PermBadge } from './UsageBadge' + +interface SourceInfo { + source_id: string + title: string + publisher: string + url: string | null + version_label: string | null + language: string + license_id: string + license_name: string + commercial_use: string + allowed_analysis: boolean + allowed_store_excerpt: boolean + allowed_ship_embeddings: boolean + allowed_ship_in_product: boolean + vault_retention_days: number + vault_access_tier: string +} + +export function SourceRegistry({ sources, loading }: { sources: SourceInfo[]; loading: boolean }) { + return ( +
    +

    Quellenregister

    +

    Alle registrierten Quellen mit ihren Berechtigungen.

    + {loading ? ( +
    + ) : ( +
    + {sources.map(src => ( +
    +
    +
    +

    {src.title}

    +

    {src.publisher} — {src.license_name}

    +
    + {src.url && ( + + + Quelle + + )} +
    +
    + + + + +
    +
    + ))} +
    + )} +
    + ) +} diff --git a/admin-compliance/app/sdk/control-provenance/_components/UsageBadge.tsx b/admin-compliance/app/sdk/control-provenance/_components/UsageBadge.tsx new file mode 100644 index 0000000..af26117 --- /dev/null +++ b/admin-compliance/app/sdk/control-provenance/_components/UsageBadge.tsx @@ -0,0 +1,25 @@ +import { CheckCircle2, Lock } from 'lucide-react' + +const USAGE_CONFIG: Record = { + allowed: { bg: 'bg-green-100 text-green-800', label: 'Erlaubt' }, + restricted: { bg: 'bg-yellow-100 text-yellow-800', label: 'Eingeschraenkt' }, + prohibited: { bg: 'bg-red-100 text-red-800', label: 'Verboten' }, + unclear: { bg: 'bg-gray-100 text-gray-600', label: 'Unklar' }, + yes: { bg: 'bg-green-100 text-green-800', label: 'Ja' }, + no: { bg: 'bg-red-100 text-red-800', label: 'Nein' }, + 'n/a': { bg: 'bg-gray-100 text-gray-400', label: 'k.A.' }, +} + +export function UsageBadge({ value }: { value: string }) { + const c = USAGE_CONFIG[value] || USAGE_CONFIG.unclear + return {c.label} +} + +export function PermBadge({ label, allowed }: { label: string; allowed: boolean }) { + return ( +
    + {allowed ? : } + {label} +
    + ) +} diff --git a/admin-compliance/app/sdk/control-provenance/_data/provenance-sections.ts b/admin-compliance/app/sdk/control-provenance/_data/provenance-sections.ts new file mode 100644 index 0000000..103e30b --- /dev/null +++ b/admin-compliance/app/sdk/control-provenance/_data/provenance-sections.ts @@ -0,0 +1,404 @@ +export interface ProvenanceSection { + id: string + title: string + content: string +} + +export const PROVENANCE_SECTIONS: ProvenanceSection[] = [ + { + id: 'methodology', + title: 'Methodik der Control-Erstellung', + content: `## Unabhaengige Formulierung + +Alle Controls in der Canonical Control Library wurden **eigenstaendig formuliert** und folgen einer +**unabhaengigen Taxonomie**. Es werden keine proprietaeren Bezeichner, Nummern oder Strukturen +aus geschuetzten Quellen uebernommen. + +### Dreistufiger Prozess + +1. **Offene Recherche** — Identifikation von Security-Anforderungen aus oeffentlichen, frei zugaenglichen + Frameworks (OWASP, NIST, ENISA). Jede Anforderung wird aus mindestens 2 unabhaengigen offenen Quellen belegt. + +2. **Eigenstaendige Formulierung** — Jedes Control wird mit eigener Sprache, eigener Struktur und eigener + Taxonomie (z.B. AUTH-001, NET-001) verfasst. Kein Copy-Paste, keine Paraphrase geschuetzter Texte. + +3. **Too-Close-Pruefung** — Automatisierte Aehnlichkeitspruefung gegen Quelltexte mit 5 Metriken + (Token Overlap, N-Gram Jaccard, Embedding Cosine, LCS Ratio, Exact-Phrase). Nur Controls mit + Status PASS oder WARN (+ Human Review) werden freigegeben. + +### Rechtliche Grundlage + +- **UrhG §44b** — Text & Data Mining erlaubt fuer Analyse; Kopien werden danach geloescht +- **UrhG §23** — Hinreichender Abstand zum Originalwerk durch eigene Formulierung +- **BSI Nutzungsbedingungen** — Kommerzielle Nutzung nur mit Zustimmung; wir nutzen BSI-Dokumente + ausschliesslich als Analysegrundlage, nicht im Produkt`, + }, + { + id: 'filters', + title: 'Filter in der Control Library', + content: `## Dropdown-Filter + +Die Control Library bietet 7 Filter-Dropdowns, um die ueber 3.000 Controls effizient zu durchsuchen: + +### Schweregrad (Severity) + +| Stufe | Farbe | Bedeutung | +|-------|-------|-----------| +| **Kritisch** | Rot | Sicherheitskritische Controls — Verstoesse fuehren zu schwerwiegenden Risiken | +| **Hoch** | Orange | Wichtige Controls — sollten zeitnah umgesetzt werden | +| **Mittel** | Gelb | Standardmaessige Controls — empfohlene Umsetzung | +| **Niedrig** | Gruen | Nice-to-have Controls — zusaetzliche Haertung | + +### Domain + +Das Praefix der Control-ID (z.B. \`AUTH-001\`, \`SEC-042\`). Kennzeichnet den thematischen Bereich. +Die haeufigsten Domains: + +| Domain | Anzahl | Thema | +|--------|--------|-------| +| SEC | ~700 | Allgemeine Sicherheit, Systemhaertung | +| COMP | ~470 | Compliance, Regulierung, Nachweispflichten | +| DATA | ~400 | Datenschutz, Datenklassifizierung, DSGVO | +| AI | ~290 | KI-Regulierung (AI Act, Transparenz, Erklaerbarkeit) | +| LOG | ~230 | Logging, Monitoring, SIEM | +| AUTH | ~200 | Authentifizierung, Zugriffskontrolle | +| NET | ~150 | Netzwerksicherheit, Transport, Firewall | +| CRYP | ~90 | Kryptographie, Schluesselmanagement | +| ACC | ~25 | Zugriffskontrolle (Access Control) | +| INC | ~25 | Incident Response, Vorfallmanagement | + +Zusaetzlich existieren spezialisierte Domains wie CRA, ARC (Architektur), API, PKI, SUP (Supply Chain) u.v.m. + +### Status (Release State) + +| Status | Bedeutung | +|--------|-----------| +| **Draft** | Entwurf — noch nicht freigegeben | +| **Approved** | Freigegeben fuer Kunden | +| **Review noetig** | Muss manuell geprueft werden | +| **Zu aehnlich** | Too-Close-Check hat Warnung ausgeloest | +| **Duplikat** | Wurde als Duplikat eines anderen Controls erkannt | + +### Nachweis (Verification Method) + +| Methode | Farbe | Beschreibung | +|---------|-------|-------------| +| **Code Review** | Blau | Nachweis durch Quellcode-Inspektion | +| **Dokument** | Amber | Nachweis durch Richtlinien, Prozesse, Schulungen | +| **Tool** | Teal | Nachweis durch automatisierte Scans/Monitoring | +| **Hybrid** | Lila | Kombination aus mehreren Methoden | + +### Kategorie + +Thematische Einordnung (17 Kategorien). Kategorien sind **thematisch**, Domains **strukturell**. +Ein AUTH-Control kann z.B. die Kategorie "Netzwerksicherheit" haben. + +### Zielgruppe (Target Audience) + +| Zielgruppe | Bedeutung | +|------------|-----------| +| **Unternehmen** | Fuer Endkunden/Firmen relevant | +| **Behoerden** | Spezifisch fuer oeffentliche Verwaltung | +| **Anbieter** | Fuer SaaS/Plattform-Anbieter | +| **Alle** | Allgemein anwendbar | + +### Dokumentenursprung (Source) + +Filtert nach der Quelldokument-Herkunft des Controls. Zeigt alle Quellen sortiert nach +Haeufigkeit. Die wichtigsten Quellen: + +| Quelle | Typ | +|--------|-----| +| KI-Verordnung (EU) 2024/1689 | EU-Recht | +| Cyber Resilience Act (EU) 2024/2847 | EU-Recht | +| DSGVO (EU) 2016/679 | EU-Recht | +| NIS2-Richtlinie (EU) 2022/2555 | EU-Recht | +| NIST SP 800-53, CSF 2.0, SSDF | US-Standards | +| OWASP Top 10, ASVS, SAMM | Open Source | +| ENISA Guidelines | EU-Agentur | +| CISA Secure by Design | US-Behoerde | +| BDSG, TKG, GewO, HGB | Deutsche Gesetze | +| EDPB Leitlinien | EU Datenschutz |`, + }, + { + id: 'badges', + title: 'Badges & Lizenzregeln', + content: `## Badges in der Control Library + +Jedes Control zeigt mehrere farbige Badges: + +### Lizenzregel-Badge (Rule 1 / 2 / 3) + +Die Lizenzregel bestimmt, wie ein Control erstellt und genutzt werden darf: + +| Badge | Farbe | Regel | Bedeutung | +|-------|-------|-------|-----------| +| **Free Use** | Gruen | Rule 1 | Quelle ist Public Domain oder EU-Recht — Originaltext darf gezeigt werden | +| **Zitation** | Blau | Rule 2 | Quelle ist CC-BY oder aehnlich — Zitation + Quellenangabe erforderlich | +| **Reformuliert** | Amber | Rule 3 | Quelle hat eingeschraenkte Lizenz — Control wurde eigenstaendig reformuliert, kein Originaltext | + +### Processing-Path + +| Pfad | Bedeutung | +|------|-----------| +| **structured** | Control wurde direkt aus strukturierten Daten (Tabellen, Listen) extrahiert | +| **llm_reform** | Control wurde mit LLM eigenstaendig formuliert (bei Rule 3 zwingend) | + +### Referenzen (Open Anchors) + +Zeigt die Anzahl der verlinkten Open-Source-Referenzen (OWASP, NIST, ENISA etc.). +Jedes freigegebene Control muss mindestens 1 Open Anchor haben. + +### Weitere Badges + +| Badge | Bedeutung | +|-------|-----------| +| Score | Risiko-Score (0-10) | +| Severity-Badge | Schweregrad (Kritisch/Hoch/Mittel/Niedrig) | +| State-Badge | Freigabestatus (Draft/Approved/etc.) | +| Kategorie-Badge | Thematische Kategorie | +| Zielgruppe-Badge | Enterprise/Behoerden/Anbieter/Alle |`, + }, + { + id: 'taxonomy', + title: 'Unabhaengige Taxonomie', + content: `## Eigenes Klassifikationssystem + +Die Canonical Control Library verwendet ein **eigenes Domain-Schema**, das sich bewusst von +proprietaeren Frameworks unterscheidet. Die Domains werden **automatisch** durch den +Control Generator vergeben, basierend auf dem Inhalt der Quelldokumente. + +### Top-10 Domains + +| Domain | Anzahl | Thema | Hauptquellen | +|--------|--------|-------|-------------| +| SEC | ~700 | Allgemeine Sicherheit | CRA, NIS2, BSI, ENISA | +| COMP | ~470 | Compliance & Regulierung | DSGVO, AI Act, Richtlinien | +| DATA | ~400 | Datenschutz & Datenklassifizierung | DSGVO, BDSG, EDPB | +| AI | ~290 | KI-Regulierung & Ethik | AI Act, HLEG, OECD | +| LOG | ~230 | Logging & Monitoring | NIST, OWASP | +| AUTH | ~200 | Authentifizierung & Session | NIST SP 800-63, OWASP | +| NET | ~150 | Netzwerksicherheit | NIST, ENISA | +| CRYP | ~90 | Kryptographie & Schluessel | NIST SP 800-57 | +| ACC | ~25 | Zugriffskontrolle | OWASP ASVS | +| INC | ~25 | Incident Response | NIS2, CRA | + +### Spezialisierte Domains + +Neben den Top-10 gibt es ueber 90 weitere Domains fuer spezifische Themen: + +- **CRA** — Cyber Resilience Act spezifisch +- **ARC** — Sichere Architektur +- **API** — API-Security +- **PKI** — Public Key Infrastructure +- **SUP** — Supply Chain Security +- **VUL** — Vulnerability Management +- **BCP** — Business Continuity +- **PHY** — Physische Sicherheit +- u.v.m. + +### ID-Format + +Control-IDs folgen dem Muster \`DOMAIN-NNN\` (z.B. AUTH-001, SEC-042). Dieses Format ist +**nicht von BSI oder anderen proprietaeren Standards abgeleitet**, sondern folgt einem +allgemein ueblichen Nummerierungsschema.`, + }, + { + id: 'open-sources', + title: 'Offene Referenzquellen', + content: `## Primaere offene Quellen + +Alle Controls sind in mindestens einer der folgenden **frei zugaenglichen** Quellen verankert: + +### OWASP (CC BY-SA 4.0 — kommerziell erlaubt) +- **ASVS** — Application Security Verification Standard v4.0.3 +- **MASVS** — Mobile Application Security Verification Standard v2.1 +- **Top 10** — OWASP Top 10 (2021) +- **Cheat Sheets** — OWASP Cheat Sheet Series +- **SAMM** — Software Assurance Maturity Model + +### NIST (Public Domain — keine Einschraenkungen) +- **SP 800-53 Rev.5** — Security and Privacy Controls +- **SP 800-63B** — Digital Identity Guidelines (Authentication) +- **SP 800-57** — Key Management Recommendations +- **SP 800-52 Rev.2** — TLS Implementation Guidelines +- **SP 800-92** — Log Management Guide +- **SP 800-218 (SSDF)** — Secure Software Development Framework +- **SP 800-60** — Information Types to Security Categories + +### ENISA (CC BY 4.0 — kommerziell erlaubt) +- Good Practices for IoT/Mobile Security +- Data Protection Engineering +- Algorithms, Key Sizes and Parameters Report + +### Weitere offene Quellen +- **SLSA** (Supply-chain Levels for Software Artifacts) — Google Open Source +- **CIS Controls v8** (CC BY-NC-ND — nur fuer interne Analyse)`, + }, + { + id: 'restricted-sources', + title: 'Geschuetzte Quellen — Nur interne Analyse', + content: `## Quellen mit eingeschraenkter Nutzung + +Die folgenden Quellen werden **ausschliesslich intern zur Analyse** verwendet. +Kein Text, keine Struktur, keine Bezeichner aus diesen Quellen erscheinen im Produkt. + +### BSI (Nutzungsbedingungen — kommerziell eingeschraenkt) +- TR-03161 Teil 1-3 (Mobile, Web, Hintergrunddienste) +- Nutzung: TDM unter UrhG §44b, Kopien werden geloescht +- Kein Shipping von Zitaten, Embeddings oder Strukturen + +### ISO/IEC (Kostenpflichtig — kein Shipping) +- ISO 27001, ISO 27002 +- Nutzung: Nur als Referenz fuer Mapping, kein Text im Produkt + +### ETSI (Restriktiv — kein kommerzieller Gebrauch) +- Nutzung: Nur als Hintergrundwissen, kein direkter Einfluss + +### Trennungsprinzip + +| Ebene | Geschuetzte Quelle | Offene Quelle | +|-------|--------------------|---------------| +| Analyse | ✅ Darf gelesen werden | ✅ Darf gelesen werden | +| Inspiration | ✅ Darf Ideen liefern | ✅ Darf Ideen liefern | +| Formulierung | ❌ Keine Uebernahme | ✅ Darf zitiert werden | +| Struktur | ❌ Keine Uebernahme | ✅ Darf verwendet werden | +| Produkttext | ❌ Nicht erlaubt | ✅ Erlaubt |`, + }, + { + id: 'verification-methods', + title: 'Verifikationsmethoden', + content: `## Nachweis-Klassifizierung + +Jedes Control wird einer von vier Verifikationsmethoden zugeordnet. Dies bestimmt, +**wie** ein Kunde den Nachweis fuer die Einhaltung erbringen kann: + +| Methode | Beschreibung | Beispiele | +|---------|-------------|-----------| +| **Code Review** | Nachweis durch Quellcode-Inspektion | Input-Validierung, Encryption-Konfiguration, Auth-Logic | +| **Dokument** | Nachweis durch Richtlinien, Prozesse, Schulungen | Notfallplaene, Schulungsnachweise, Datenschutzkonzepte | +| **Tool** | Nachweis durch automatisierte Tools/Scans | SIEM-Logs, Vulnerability-Scans, Monitoring-Dashboards | +| **Hybrid** | Kombination aus mehreren Methoden | Zugriffskontrollen (Code + Policy + Tool) | + +### Bedeutung fuer Kunden + +- **Code Review Controls** koennen direkt im SDK-Scan geprueft werden +- **Dokument Controls** erfordern manuelle Uploads (PDFs, Links) +- **Tool Controls** koennen per API-Integration automatisch nachgewiesen werden +- **Hybrid Controls** benoetigen mehrere Nachweisarten`, + }, + { + id: 'categories', + title: 'Thematische Kategorien', + content: `## 17 Sicherheitskategorien + +Controls sind in thematische Kategorien gruppiert, um Kunden eine +uebersichtliche Navigation zu ermoeglichen: + +| Kategorie | Beschreibung | +|-----------|-------------| +| Verschluesselung & Kryptographie | TLS, Key Management, Algorithmen | +| Authentisierung & Zugriffskontrolle | Login, MFA, RBAC, Session-Management | +| Netzwerksicherheit | Firewall, Segmentierung, VPN, DNS | +| Datenschutz & Datensicherheit | DSGVO, Datenklassifizierung, Anonymisierung | +| Logging & Monitoring | SIEM, Audit-Logs, Alerting | +| Vorfallmanagement | Incident Response, Meldepflichten | +| Notfall & Wiederherstellung | BCM, Disaster Recovery, Backups | +| Compliance & Audit | Zertifizierungen, Audits, Berichtspflichten | +| Lieferkettenmanagement | Vendor Risk, SBOM, Third-Party | +| Physische Sicherheit | Zutritt, Gebaeudesicherheit | +| Personal & Schulung | Security Awareness, Rollenkonzepte | +| Anwendungssicherheit | SAST, DAST, Secure Coding | +| Systemhaertung & -betrieb | Patching, Konfiguration, Hardening | +| Risikomanagement | Risikoanalyse, Bewertung, Massnahmen | +| Sicherheitsorganisation | ISMS, Richtlinien, Governance | +| Hardware & Plattformsicherheit | TPM, Secure Boot, Firmware | +| Identitaetsmanagement | SSO, Federation, Directory | + +### Abgrenzung zu Domains + +Kategorien sind **thematisch**, Domains (AUTH, NET, etc.) sind **strukturell**. +Ein Control AUTH-005 (Domain AUTH) hat die Kategorie "authentication", +aber ein Control NET-012 (Domain NET) koennte ebenfalls die Kategorie +"authentication" haben, wenn es um Netzwerk-Authentifizierung geht.`, + }, + { + id: 'master-library', + title: 'Master Library Strategie', + content: `## RAG-First Ansatz + +Die Canonical Control Library folgt einer **RAG-First-Strategie**: + +### Schritt 1: Rule 1+2 Controls aus RAG generieren + +Prioritaet haben Controls aus Quellen mit **Originaltext-Erlaubnis**: + +| Welle | Quellen | Lizenzregel | Vorteil | +|-------|---------|------------|---------| +| 1 | OWASP (ASVS, MASVS, Top10) | Rule 2 (CC-BY-SA, Zitation) | Originaltext + Zitation | +| 2 | NIST (SP 800-53, CSF, SSDF) | Rule 1 (Public Domain) | Voller Text, keine Einschraenkungen | +| 3 | EU-Verordnungen (DSGVO, AI Act, NIS2, CRA) | Rule 1 (EU Law) | Gesetzestext + Erklaerung | +| 4 | Deutsche Gesetze (BDSG, TTDSG, TKG) | Rule 1 (DE Law) | Gesetzestext + Erklaerung | + +### Schritt 2: Dedup gegen BSI Rule-3 Controls + +Die ~880 BSI Rule-3 Controls werden **gegen** die neuen Rule 1+2 Controls abgeglichen: + +- Wenn ein BSI-Control ein Duplikat eines OWASP/NIST-Controls ist → **OWASP/NIST bevorzugt** + (weil Originaltext + Zitation erlaubt) +- BSI-Duplikate werden als \`deprecated\` markiert +- Tags und Anchors werden in den behaltenen Control zusammengefuehrt + +### Schritt 3: Aktueller Stand + +Aktuell: **~3.100+ Controls** (Stand Maerz 2026), davon: +- Viele mit \`source_original_text\` (Originaltext fuer Kunden sichtbar) +- Viele mit \`source_citation\` (Quellenangabe mit Lizenz) +- Klare Nachweismethode (\`verification_method\`) +- Thematische Kategorie (\`category\`) + +### Verstaendliche Texte + +Zusaetzlich zum Originaltext (der oft juristisch/technisch formuliert ist) +enthaelt jedes Control ein eigenstaendig formuliertes **Ziel** (objective) +und eine **Begruendung** (rationale) in verstaendlicher Sprache.`, + }, + { + id: 'validation', + title: 'Automatisierte Validierung', + content: `## CI/CD-Pruefungen + +Jedes Control wird bei jedem Commit automatisch geprueft: + +### 1. Schema-Validierung +- Alle Pflichtfelder vorhanden +- Control-ID Format: \`^[A-Z]{2,6}-[0-9]{3}$\` +- Severity: low, medium, high, critical +- Risk Score: 0-10 + +### 2. No-Leak Scanner +Regex-Pruefung gegen verbotene Muster in produktfaehigen Feldern: +- \`O.[A-Za-z]+_[0-9]+\` — BSI Objective-IDs +- \`TR-03161\` — Direkte BSI-TR-Referenzen +- \`BSI-TR-\` — BSI-spezifische Locators +- \`Anforderung [A-Z].[0-9]+\` — BSI-Anforderungsformat + +### 3. Open Anchor Check +Jedes freigegebene Control muss mindestens 1 Open-Source-Referenz haben. + +### 4. Too-Close Detektor (5 Metriken) + +| Metrik | Warn | Fail | Beschreibung | +|--------|------|------|-------------| +| Exact Phrase | ≥8 Tokens | ≥12 Tokens | Laengste identische Token-Sequenz | +| Token Overlap | ≥0.20 | ≥0.30 | Jaccard-Aehnlichkeit der Token-Mengen | +| 3-Gram Jaccard | ≥0.10 | ≥0.18 | Zeichenketten-Aehnlichkeit | +| Embedding Cosine | ≥0.86 | ≥0.92 | Semantische Aehnlichkeit (bge-m3) | +| LCS Ratio | ≥0.35 | ≥0.50 | Longest Common Subsequence | + +**Entscheidungslogik:** +- **PASS** — Kein Fail + max 1 Warn +- **WARN** — Max 2 Warn, kein Fail → Human Review erforderlich +- **FAIL** — Irgendein Fail → Blockiert, Umformulierung noetig`, + }, +] diff --git a/admin-compliance/app/sdk/control-provenance/page.tsx b/admin-compliance/app/sdk/control-provenance/page.tsx index 66aa9d8..c42f5b2 100644 --- a/admin-compliance/app/sdk/control-provenance/page.tsx +++ b/admin-compliance/app/sdk/control-provenance/page.tsx @@ -1,452 +1,27 @@ 'use client' import { useState, useEffect } from 'react' -import { - Shield, BookOpen, ExternalLink, CheckCircle2, AlertTriangle, - Lock, Scale, FileText, Eye, ArrowLeft, -} from 'lucide-react' +import { Shield, FileText } from 'lucide-react' import Link from 'next/link' - -// ============================================================================= -// TYPES -// ============================================================================= +import { PROVENANCE_SECTIONS } from './_data/provenance-sections' +import { MarkdownRenderer } from './_components/MarkdownRenderer' +import { LicenseMatrix } from './_components/LicenseMatrix' +import { SourceRegistry } from './_components/SourceRegistry' interface LicenseInfo { - license_id: string - name: string - terms_url: string | null - commercial_use: string - ai_training_restriction: string | null - tdm_allowed_under_44b: string | null - deletion_required: boolean - notes: string | null + license_id: string; name: string; terms_url: string | null; commercial_use: string + ai_training_restriction: string | null; tdm_allowed_under_44b: string | null + deletion_required: boolean; notes: string | null } interface SourceInfo { - source_id: string - title: string - publisher: string - url: string | null - version_label: string | null - language: string - license_id: string - license_name: string - commercial_use: string - allowed_analysis: boolean - allowed_store_excerpt: boolean - allowed_ship_embeddings: boolean - allowed_ship_in_product: boolean - vault_retention_days: number - vault_access_tier: string + source_id: string; title: string; publisher: string; url: string | null + version_label: string | null; language: string; license_id: string; license_name: string + commercial_use: string; allowed_analysis: boolean; allowed_store_excerpt: boolean + allowed_ship_embeddings: boolean; allowed_ship_in_product: boolean + vault_retention_days: number; vault_access_tier: string } -// ============================================================================= -// STATIC PROVENANCE DOCUMENTATION -// ============================================================================= - -const PROVENANCE_SECTIONS = [ - { - id: 'methodology', - title: 'Methodik der Control-Erstellung', - content: `## Unabhaengige Formulierung - -Alle Controls in der Canonical Control Library wurden **eigenstaendig formuliert** und folgen einer -**unabhaengigen Taxonomie**. Es werden keine proprietaeren Bezeichner, Nummern oder Strukturen -aus geschuetzten Quellen uebernommen. - -### Dreistufiger Prozess - -1. **Offene Recherche** — Identifikation von Security-Anforderungen aus oeffentlichen, frei zugaenglichen - Frameworks (OWASP, NIST, ENISA). Jede Anforderung wird aus mindestens 2 unabhaengigen offenen Quellen belegt. - -2. **Eigenstaendige Formulierung** — Jedes Control wird mit eigener Sprache, eigener Struktur und eigener - Taxonomie (z.B. AUTH-001, NET-001) verfasst. Kein Copy-Paste, keine Paraphrase geschuetzter Texte. - -3. **Too-Close-Pruefung** — Automatisierte Aehnlichkeitspruefung gegen Quelltexte mit 5 Metriken - (Token Overlap, N-Gram Jaccard, Embedding Cosine, LCS Ratio, Exact-Phrase). Nur Controls mit - Status PASS oder WARN (+ Human Review) werden freigegeben. - -### Rechtliche Grundlage - -- **UrhG §44b** — Text & Data Mining erlaubt fuer Analyse; Kopien werden danach geloescht -- **UrhG §23** — Hinreichender Abstand zum Originalwerk durch eigene Formulierung -- **BSI Nutzungsbedingungen** — Kommerzielle Nutzung nur mit Zustimmung; wir nutzen BSI-Dokumente - ausschliesslich als Analysegrundlage, nicht im Produkt`, - }, - { - id: 'filters', - title: 'Filter in der Control Library', - content: `## Dropdown-Filter - -Die Control Library bietet 7 Filter-Dropdowns, um die ueber 3.000 Controls effizient zu durchsuchen: - -### Schweregrad (Severity) - -| Stufe | Farbe | Bedeutung | -|-------|-------|-----------| -| **Kritisch** | Rot | Sicherheitskritische Controls — Verstoesse fuehren zu schwerwiegenden Risiken | -| **Hoch** | Orange | Wichtige Controls — sollten zeitnah umgesetzt werden | -| **Mittel** | Gelb | Standardmaessige Controls — empfohlene Umsetzung | -| **Niedrig** | Gruen | Nice-to-have Controls — zusaetzliche Haertung | - -### Domain - -Das Praefix der Control-ID (z.B. \`AUTH-001\`, \`SEC-042\`). Kennzeichnet den thematischen Bereich. -Die haeufigsten Domains: - -| Domain | Anzahl | Thema | -|--------|--------|-------| -| SEC | ~700 | Allgemeine Sicherheit, Systemhaertung | -| COMP | ~470 | Compliance, Regulierung, Nachweispflichten | -| DATA | ~400 | Datenschutz, Datenklassifizierung, DSGVO | -| AI | ~290 | KI-Regulierung (AI Act, Transparenz, Erklaerbarkeit) | -| LOG | ~230 | Logging, Monitoring, SIEM | -| AUTH | ~200 | Authentifizierung, Zugriffskontrolle | -| NET | ~150 | Netzwerksicherheit, Transport, Firewall | -| CRYP | ~90 | Kryptographie, Schluesselmanagement | -| ACC | ~25 | Zugriffskontrolle (Access Control) | -| INC | ~25 | Incident Response, Vorfallmanagement | - -Zusaetzlich existieren spezialisierte Domains wie CRA, ARC (Architektur), API, PKI, SUP (Supply Chain) u.v.m. - -### Status (Release State) - -| Status | Bedeutung | -|--------|-----------| -| **Draft** | Entwurf — noch nicht freigegeben | -| **Approved** | Freigegeben fuer Kunden | -| **Review noetig** | Muss manuell geprueft werden | -| **Zu aehnlich** | Too-Close-Check hat Warnung ausgeloest | -| **Duplikat** | Wurde als Duplikat eines anderen Controls erkannt | - -### Nachweis (Verification Method) - -| Methode | Farbe | Beschreibung | -|---------|-------|-------------| -| **Code Review** | Blau | Nachweis durch Quellcode-Inspektion | -| **Dokument** | Amber | Nachweis durch Richtlinien, Prozesse, Schulungen | -| **Tool** | Teal | Nachweis durch automatisierte Scans/Monitoring | -| **Hybrid** | Lila | Kombination aus mehreren Methoden | - -### Kategorie - -Thematische Einordnung (17 Kategorien). Kategorien sind **thematisch**, Domains **strukturell**. -Ein AUTH-Control kann z.B. die Kategorie "Netzwerksicherheit" haben. - -### Zielgruppe (Target Audience) - -| Zielgruppe | Bedeutung | -|------------|-----------| -| **Unternehmen** | Fuer Endkunden/Firmen relevant | -| **Behoerden** | Spezifisch fuer oeffentliche Verwaltung | -| **Anbieter** | Fuer SaaS/Plattform-Anbieter | -| **Alle** | Allgemein anwendbar | - -### Dokumentenursprung (Source) - -Filtert nach der Quelldokument-Herkunft des Controls. Zeigt alle Quellen sortiert nach -Haeufigkeit. Die wichtigsten Quellen: - -| Quelle | Typ | -|--------|-----| -| KI-Verordnung (EU) 2024/1689 | EU-Recht | -| Cyber Resilience Act (EU) 2024/2847 | EU-Recht | -| DSGVO (EU) 2016/679 | EU-Recht | -| NIS2-Richtlinie (EU) 2022/2555 | EU-Recht | -| NIST SP 800-53, CSF 2.0, SSDF | US-Standards | -| OWASP Top 10, ASVS, SAMM | Open Source | -| ENISA Guidelines | EU-Agentur | -| CISA Secure by Design | US-Behoerde | -| BDSG, TKG, GewO, HGB | Deutsche Gesetze | -| EDPB Leitlinien | EU Datenschutz |`, - }, - { - id: 'badges', - title: 'Badges & Lizenzregeln', - content: `## Badges in der Control Library - -Jedes Control zeigt mehrere farbige Badges: - -### Lizenzregel-Badge (Rule 1 / 2 / 3) - -Die Lizenzregel bestimmt, wie ein Control erstellt und genutzt werden darf: - -| Badge | Farbe | Regel | Bedeutung | -|-------|-------|-------|-----------| -| **Free Use** | Gruen | Rule 1 | Quelle ist Public Domain oder EU-Recht — Originaltext darf gezeigt werden | -| **Zitation** | Blau | Rule 2 | Quelle ist CC-BY oder aehnlich — Zitation + Quellenangabe erforderlich | -| **Reformuliert** | Amber | Rule 3 | Quelle hat eingeschraenkte Lizenz — Control wurde eigenstaendig reformuliert, kein Originaltext | - -### Processing-Path - -| Pfad | Bedeutung | -|------|-----------| -| **structured** | Control wurde direkt aus strukturierten Daten (Tabellen, Listen) extrahiert | -| **llm_reform** | Control wurde mit LLM eigenstaendig formuliert (bei Rule 3 zwingend) | - -### Referenzen (Open Anchors) - -Zeigt die Anzahl der verlinkten Open-Source-Referenzen (OWASP, NIST, ENISA etc.). -Jedes freigegebene Control muss mindestens 1 Open Anchor haben. - -### Weitere Badges - -| Badge | Bedeutung | -|-------|-----------| -| Score | Risiko-Score (0-10) | -| Severity-Badge | Schweregrad (Kritisch/Hoch/Mittel/Niedrig) | -| State-Badge | Freigabestatus (Draft/Approved/etc.) | -| Kategorie-Badge | Thematische Kategorie | -| Zielgruppe-Badge | Enterprise/Behoerden/Anbieter/Alle |`, - }, - { - id: 'taxonomy', - title: 'Unabhaengige Taxonomie', - content: `## Eigenes Klassifikationssystem - -Die Canonical Control Library verwendet ein **eigenes Domain-Schema**, das sich bewusst von -proprietaeren Frameworks unterscheidet. Die Domains werden **automatisch** durch den -Control Generator vergeben, basierend auf dem Inhalt der Quelldokumente. - -### Top-10 Domains - -| Domain | Anzahl | Thema | Hauptquellen | -|--------|--------|-------|-------------| -| SEC | ~700 | Allgemeine Sicherheit | CRA, NIS2, BSI, ENISA | -| COMP | ~470 | Compliance & Regulierung | DSGVO, AI Act, Richtlinien | -| DATA | ~400 | Datenschutz & Datenklassifizierung | DSGVO, BDSG, EDPB | -| AI | ~290 | KI-Regulierung & Ethik | AI Act, HLEG, OECD | -| LOG | ~230 | Logging & Monitoring | NIST, OWASP | -| AUTH | ~200 | Authentifizierung & Session | NIST SP 800-63, OWASP | -| NET | ~150 | Netzwerksicherheit | NIST, ENISA | -| CRYP | ~90 | Kryptographie & Schluessel | NIST SP 800-57 | -| ACC | ~25 | Zugriffskontrolle | OWASP ASVS | -| INC | ~25 | Incident Response | NIS2, CRA | - -### Spezialisierte Domains - -Neben den Top-10 gibt es ueber 90 weitere Domains fuer spezifische Themen: - -- **CRA** — Cyber Resilience Act spezifisch -- **ARC** — Sichere Architektur -- **API** — API-Security -- **PKI** — Public Key Infrastructure -- **SUP** — Supply Chain Security -- **VUL** — Vulnerability Management -- **BCP** — Business Continuity -- **PHY** — Physische Sicherheit -- u.v.m. - -### ID-Format - -Control-IDs folgen dem Muster \`DOMAIN-NNN\` (z.B. AUTH-001, SEC-042). Dieses Format ist -**nicht von BSI oder anderen proprietaeren Standards abgeleitet**, sondern folgt einem -allgemein ueblichen Nummerierungsschema.`, - }, - { - id: 'open-sources', - title: 'Offene Referenzquellen', - content: `## Primaere offene Quellen - -Alle Controls sind in mindestens einer der folgenden **frei zugaenglichen** Quellen verankert: - -### OWASP (CC BY-SA 4.0 — kommerziell erlaubt) -- **ASVS** — Application Security Verification Standard v4.0.3 -- **MASVS** — Mobile Application Security Verification Standard v2.1 -- **Top 10** — OWASP Top 10 (2021) -- **Cheat Sheets** — OWASP Cheat Sheet Series -- **SAMM** — Software Assurance Maturity Model - -### NIST (Public Domain — keine Einschraenkungen) -- **SP 800-53 Rev.5** — Security and Privacy Controls -- **SP 800-63B** — Digital Identity Guidelines (Authentication) -- **SP 800-57** — Key Management Recommendations -- **SP 800-52 Rev.2** — TLS Implementation Guidelines -- **SP 800-92** — Log Management Guide -- **SP 800-218 (SSDF)** — Secure Software Development Framework -- **SP 800-60** — Information Types to Security Categories - -### ENISA (CC BY 4.0 — kommerziell erlaubt) -- Good Practices for IoT/Mobile Security -- Data Protection Engineering -- Algorithms, Key Sizes and Parameters Report - -### Weitere offene Quellen -- **SLSA** (Supply-chain Levels for Software Artifacts) — Google Open Source -- **CIS Controls v8** (CC BY-NC-ND — nur fuer interne Analyse)`, - }, - { - id: 'restricted-sources', - title: 'Geschuetzte Quellen — Nur interne Analyse', - content: `## Quellen mit eingeschraenkter Nutzung - -Die folgenden Quellen werden **ausschliesslich intern zur Analyse** verwendet. -Kein Text, keine Struktur, keine Bezeichner aus diesen Quellen erscheinen im Produkt. - -### BSI (Nutzungsbedingungen — kommerziell eingeschraenkt) -- TR-03161 Teil 1-3 (Mobile, Web, Hintergrunddienste) -- Nutzung: TDM unter UrhG §44b, Kopien werden geloescht -- Kein Shipping von Zitaten, Embeddings oder Strukturen - -### ISO/IEC (Kostenpflichtig — kein Shipping) -- ISO 27001, ISO 27002 -- Nutzung: Nur als Referenz fuer Mapping, kein Text im Produkt - -### ETSI (Restriktiv — kein kommerzieller Gebrauch) -- Nutzung: Nur als Hintergrundwissen, kein direkter Einfluss - -### Trennungsprinzip - -| Ebene | Geschuetzte Quelle | Offene Quelle | -|-------|--------------------|---------------| -| Analyse | ✅ Darf gelesen werden | ✅ Darf gelesen werden | -| Inspiration | ✅ Darf Ideen liefern | ✅ Darf Ideen liefern | -| Formulierung | ❌ Keine Uebernahme | ✅ Darf zitiert werden | -| Struktur | ❌ Keine Uebernahme | ✅ Darf verwendet werden | -| Produkttext | ❌ Nicht erlaubt | ✅ Erlaubt |`, - }, - { - id: 'verification-methods', - title: 'Verifikationsmethoden', - content: `## Nachweis-Klassifizierung - -Jedes Control wird einer von vier Verifikationsmethoden zugeordnet. Dies bestimmt, -**wie** ein Kunde den Nachweis fuer die Einhaltung erbringen kann: - -| Methode | Beschreibung | Beispiele | -|---------|-------------|-----------| -| **Code Review** | Nachweis durch Quellcode-Inspektion | Input-Validierung, Encryption-Konfiguration, Auth-Logic | -| **Dokument** | Nachweis durch Richtlinien, Prozesse, Schulungen | Notfallplaene, Schulungsnachweise, Datenschutzkonzepte | -| **Tool** | Nachweis durch automatisierte Tools/Scans | SIEM-Logs, Vulnerability-Scans, Monitoring-Dashboards | -| **Hybrid** | Kombination aus mehreren Methoden | Zugriffskontrollen (Code + Policy + Tool) | - -### Bedeutung fuer Kunden - -- **Code Review Controls** koennen direkt im SDK-Scan geprueft werden -- **Dokument Controls** erfordern manuelle Uploads (PDFs, Links) -- **Tool Controls** koennen per API-Integration automatisch nachgewiesen werden -- **Hybrid Controls** benoetigen mehrere Nachweisarten`, - }, - { - id: 'categories', - title: 'Thematische Kategorien', - content: `## 17 Sicherheitskategorien - -Controls sind in thematische Kategorien gruppiert, um Kunden eine -uebersichtliche Navigation zu ermoeglichen: - -| Kategorie | Beschreibung | -|-----------|-------------| -| Verschluesselung & Kryptographie | TLS, Key Management, Algorithmen | -| Authentisierung & Zugriffskontrolle | Login, MFA, RBAC, Session-Management | -| Netzwerksicherheit | Firewall, Segmentierung, VPN, DNS | -| Datenschutz & Datensicherheit | DSGVO, Datenklassifizierung, Anonymisierung | -| Logging & Monitoring | SIEM, Audit-Logs, Alerting | -| Vorfallmanagement | Incident Response, Meldepflichten | -| Notfall & Wiederherstellung | BCM, Disaster Recovery, Backups | -| Compliance & Audit | Zertifizierungen, Audits, Berichtspflichten | -| Lieferkettenmanagement | Vendor Risk, SBOM, Third-Party | -| Physische Sicherheit | Zutritt, Gebaeudesicherheit | -| Personal & Schulung | Security Awareness, Rollenkonzepte | -| Anwendungssicherheit | SAST, DAST, Secure Coding | -| Systemhaertung & -betrieb | Patching, Konfiguration, Hardening | -| Risikomanagement | Risikoanalyse, Bewertung, Massnahmen | -| Sicherheitsorganisation | ISMS, Richtlinien, Governance | -| Hardware & Plattformsicherheit | TPM, Secure Boot, Firmware | -| Identitaetsmanagement | SSO, Federation, Directory | - -### Abgrenzung zu Domains - -Kategorien sind **thematisch**, Domains (AUTH, NET, etc.) sind **strukturell**. -Ein Control AUTH-005 (Domain AUTH) hat die Kategorie "authentication", -aber ein Control NET-012 (Domain NET) koennte ebenfalls die Kategorie -"authentication" haben, wenn es um Netzwerk-Authentifizierung geht.`, - }, - { - id: 'master-library', - title: 'Master Library Strategie', - content: `## RAG-First Ansatz - -Die Canonical Control Library folgt einer **RAG-First-Strategie**: - -### Schritt 1: Rule 1+2 Controls aus RAG generieren - -Prioritaet haben Controls aus Quellen mit **Originaltext-Erlaubnis**: - -| Welle | Quellen | Lizenzregel | Vorteil | -|-------|---------|------------|---------| -| 1 | OWASP (ASVS, MASVS, Top10) | Rule 2 (CC-BY-SA, Zitation) | Originaltext + Zitation | -| 2 | NIST (SP 800-53, CSF, SSDF) | Rule 1 (Public Domain) | Voller Text, keine Einschraenkungen | -| 3 | EU-Verordnungen (DSGVO, AI Act, NIS2, CRA) | Rule 1 (EU Law) | Gesetzestext + Erklaerung | -| 4 | Deutsche Gesetze (BDSG, TTDSG, TKG) | Rule 1 (DE Law) | Gesetzestext + Erklaerung | - -### Schritt 2: Dedup gegen BSI Rule-3 Controls - -Die ~880 BSI Rule-3 Controls werden **gegen** die neuen Rule 1+2 Controls abgeglichen: - -- Wenn ein BSI-Control ein Duplikat eines OWASP/NIST-Controls ist → **OWASP/NIST bevorzugt** - (weil Originaltext + Zitation erlaubt) -- BSI-Duplikate werden als \`deprecated\` markiert -- Tags und Anchors werden in den behaltenen Control zusammengefuehrt - -### Schritt 3: Aktueller Stand - -Aktuell: **~3.100+ Controls** (Stand Maerz 2026), davon: -- Viele mit \`source_original_text\` (Originaltext fuer Kunden sichtbar) -- Viele mit \`source_citation\` (Quellenangabe mit Lizenz) -- Klare Nachweismethode (\`verification_method\`) -- Thematische Kategorie (\`category\`) - -### Verstaendliche Texte - -Zusaetzlich zum Originaltext (der oft juristisch/technisch formuliert ist) -enthaelt jedes Control ein eigenstaendig formuliertes **Ziel** (objective) -und eine **Begruendung** (rationale) in verstaendlicher Sprache.`, - }, - { - id: 'validation', - title: 'Automatisierte Validierung', - content: `## CI/CD-Pruefungen - -Jedes Control wird bei jedem Commit automatisch geprueft: - -### 1. Schema-Validierung -- Alle Pflichtfelder vorhanden -- Control-ID Format: \`^[A-Z]{2,6}-[0-9]{3}$\` -- Severity: low, medium, high, critical -- Risk Score: 0-10 - -### 2. No-Leak Scanner -Regex-Pruefung gegen verbotene Muster in produktfaehigen Feldern: -- \`O.[A-Za-z]+_[0-9]+\` — BSI Objective-IDs -- \`TR-03161\` — Direkte BSI-TR-Referenzen -- \`BSI-TR-\` — BSI-spezifische Locators -- \`Anforderung [A-Z].[0-9]+\` — BSI-Anforderungsformat - -### 3. Open Anchor Check -Jedes freigegebene Control muss mindestens 1 Open-Source-Referenz haben. - -### 4. Too-Close Detektor (5 Metriken) - -| Metrik | Warn | Fail | Beschreibung | -|--------|------|------|-------------| -| Exact Phrase | ≥8 Tokens | ≥12 Tokens | Laengste identische Token-Sequenz | -| Token Overlap | ≥0.20 | ≥0.30 | Jaccard-Aehnlichkeit der Token-Mengen | -| 3-Gram Jaccard | ≥0.10 | ≥0.18 | Zeichenketten-Aehnlichkeit | -| Embedding Cosine | ≥0.86 | ≥0.92 | Semantische Aehnlichkeit (bge-m3) | -| LCS Ratio | ≥0.35 | ≥0.50 | Longest Common Subsequence | - -**Entscheidungslogik:** -- **PASS** — Kein Fail + max 1 Warn -- **WARN** — Max 2 Warn, kein Fail → Human Review erforderlich -- **FAIL** — Irgendein Fail → Blockiert, Umformulierung noetig`, - }, -] - -// ============================================================================= -// PAGE -// ============================================================================= - export default function ControlProvenancePage() { const [licenses, setLicenses] = useState([]) const [sources, setSources] = useState([]) @@ -475,7 +50,6 @@ export default function ControlProvenancePage() { return (
    - {/* Header */}
    @@ -485,10 +59,7 @@ export default function ControlProvenancePage() { Dokumentation der unabhaengigen Herkunft aller Security Controls — rechtssicherer Nachweis

    - + Zur Control Library @@ -513,29 +84,19 @@ export default function ControlProvenancePage() { {section.title} ))} -

    Live-Daten

    - - + {['license-matrix', 'source-registry'].map(id => ( + + ))}
    @@ -543,7 +104,6 @@ export default function ControlProvenancePage() { {/* Right: Content */}
    - {/* Static documentation sections */} {currentSection && (

    {currentSection.title}

    @@ -552,188 +112,11 @@ export default function ControlProvenancePage() {
    )} - - {/* License Matrix (live data) */} - {activeSection === 'license-matrix' && ( -
    -

    Lizenz-Matrix

    -

    - Uebersicht aller Lizenzen mit ihren erlaubten Nutzungsarten. -

    - {loading ? ( -
    - ) : ( -
    - - - - - - - - - - - - {licenses.map(lic => ( - - - - - - - - ))} - -
    LizenzKommerziellAI-TrainingTDM (§44b)Loeschpflicht
    -
    {lic.license_id}
    -
    {lic.name}
    -
    - - - - - - - {lic.deletion_required ? ( - Ja - ) : ( - Nein - )} -
    -
    - )} -
    - )} - - {/* Source Registry (live data) */} - {activeSection === 'source-registry' && ( -
    -

    Quellenregister

    -

    - Alle registrierten Quellen mit ihren Berechtigungen. -

    - {loading ? ( -
    - ) : ( -
    - {sources.map(src => ( -
    -
    -
    -

    {src.title}

    -

    {src.publisher} — {src.license_name}

    -
    - {src.url && ( - - - Quelle - - )} -
    -
    - - - - -
    -
    - ))} -
    - )} -
    - )} + {activeSection === 'license-matrix' && } + {activeSection === 'source-registry' && }
    ) } - -// ============================================================================= -// HELPER COMPONENTS -// ============================================================================= - -function UsageBadge({ value }: { value: string }) { - const config: Record = { - allowed: { bg: 'bg-green-100 text-green-800', label: 'Erlaubt' }, - restricted: { bg: 'bg-yellow-100 text-yellow-800', label: 'Eingeschraenkt' }, - prohibited: { bg: 'bg-red-100 text-red-800', label: 'Verboten' }, - unclear: { bg: 'bg-gray-100 text-gray-600', label: 'Unklar' }, - yes: { bg: 'bg-green-100 text-green-800', label: 'Ja' }, - no: { bg: 'bg-red-100 text-red-800', label: 'Nein' }, - 'n/a': { bg: 'bg-gray-100 text-gray-400', label: 'k.A.' }, - } - const c = config[value] || config.unclear - return {c.label} -} - -function PermBadge({ label, allowed }: { label: string; allowed: boolean }) { - return ( -
    - {allowed ? ( - - ) : ( - - )} - {label} -
    - ) -} - -function MarkdownRenderer({ content }: { content: string }) { - let html = content - .replace(/&/g, '&') - .replace(//g, '>') - - // Code blocks - html = html.replace( - /^```[\w]*\n([\s\S]*?)^```$/gm, - (_m, code: string) => `
    ${code.trimEnd()}
    ` - ) - - // Tables - html = html.replace( - /^(\|.+\|)\n(\|[\s:|-]+\|)\n((?:\|.+\|\n?)*)/gm, - (_m, header: string, _sep: string, body: string) => { - const ths = header.split('|').filter((c: string) => c.trim()).map((c: string) => - `${c.trim()}` - ).join('') - const rows = body.trim().split('\n').map((row: string) => { - const tds = row.split('|').filter((c: string) => c.trim()).map((c: string) => - `${c.trim()}` - ).join('') - return `${tds}` - }).join('') - return `${ths}${rows}
    ` - } - ) - - // Headers - html = html.replace(/^### (.+)$/gm, '

    $1

    ') - html = html.replace(/^## (.+)$/gm, '

    $1

    ') - - // Bold - html = html.replace(/\*\*(.+?)\*\*/g, '$1') - - // Inline code - html = html.replace(/`([^`]+)`/g, '$1') - - // Lists - html = html.replace(/^- (.+)$/gm, '
  • $1
  • ') - html = html.replace(/((?:]*>.*<\/li>\n?)+)/g, '
      $1
    ') - - // Numbered lists - html = html.replace(/^(\d+)\. (.+)$/gm, '
  • $2
  • ') - - // Paragraphs - html = html.replace(/^(?!<[hultdp]|$)(.+)$/gm, '

    $1

    ') - - return
    -} diff --git a/admin-compliance/app/sdk/controls/_components/AddControlForm.tsx b/admin-compliance/app/sdk/controls/_components/AddControlForm.tsx new file mode 100644 index 0000000..96eae40 --- /dev/null +++ b/admin-compliance/app/sdk/controls/_components/AddControlForm.tsx @@ -0,0 +1,104 @@ +'use client' + +import { useState } from 'react' +import type { ControlType } from '@/lib/sdk' + +interface FormData { + name: string + description: string + type: ControlType + category: string + owner: string +} + +export function AddControlForm({ + onSubmit, + onCancel, +}: { + onSubmit: (data: FormData) => void + onCancel: () => void +}) { + const [formData, setFormData] = useState({ + name: '', + description: '', + type: 'TECHNICAL', + category: '', + owner: '', + }) + + return ( +
    +

    Neue Kontrolle

    +
    +
    + + setFormData({ ...formData, name: e.target.value })} + placeholder="z.B. Zugriffskontrolle" + className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" + /> +
    +
    + +