'use client' /** * Security Dashboard - DevSecOps * * Security scan results, vulnerability tracking, and compliance status * Migrated from old admin (/admin/security) */ import { useEffect, useState, useCallback } from 'react' import { PagePurpose } from '@/components/common/PagePurpose' import { DevOpsPipelineSidebarResponsive } from '@/components/infrastructure/DevOpsPipelineSidebar' interface ToolStatus { name: string installed: boolean version: string | null last_run: string | null last_findings: number } interface Finding { id: string tool: string severity: string title: string message: string | null file: string | null line: number | null found_at: string } interface SeveritySummary { critical: number high: number medium: number low: number info: number total: number } interface HistoryItem { timestamp: string title: string description: string status: string } type ScanType = 'secrets' | 'sast' | 'deps' | 'containers' | 'sbom' | 'all' interface MonitoringMetric { name: string value: number unit: string status: 'ok' | 'warning' | 'critical' trend: 'up' | 'down' | 'stable' } interface ActiveAlert { id: string severity: 'critical' | 'high' | 'medium' | 'low' title: string source: string timestamp: string acknowledged: boolean } export default function SecurityDashboardPage() { const [tools, setTools] = useState([]) const [findings, setFindings] = useState([]) const [summary, setSummary] = useState({ critical: 0, high: 0, medium: 0, low: 0, info: 0, total: 0 }) const [history, setHistory] = useState([]) const [loading, setLoading] = useState(true) const [scanning, setScanning] = useState(null) const [error, setError] = useState(null) const [activeTab, setActiveTab] = useState<'overview' | 'findings' | 'tools' | 'history' | 'monitoring'>('overview') const [monitoringMetrics, setMonitoringMetrics] = useState([]) const [activeAlerts, setActiveAlerts] = useState([]) const [severityFilter, setSeverityFilter] = useState(null) const [toolFilter, setToolFilter] = useState(null) const [showFullDocs, setShowFullDocs] = useState(false) const [isInitialLoad, setIsInitialLoad] = useState(true) const [scanMessage, setScanMessage] = useState(null) const [lastScanTime, setLastScanTime] = useState(null) const fetchData = useCallback(async (showLoadingSpinner = false) => { // Only show loading spinner on initial load, not on auto-refresh if (showLoadingSpinner) { setLoading(true) } setError(null) try { const [toolsRes, findingsRes, summaryRes, historyRes] = await Promise.all([ fetch('/api/v1/security/tools'), fetch('/api/v1/security/findings'), fetch('/api/v1/security/summary'), fetch('/api/v1/security/history'), ]) if (toolsRes.ok) { setTools(await toolsRes.json()) } if (findingsRes.ok) { setFindings(await findingsRes.json()) } if (summaryRes.ok) { setSummary(await summaryRes.json()) } if (historyRes.ok) { setHistory(await historyRes.json()) } // Fetch monitoring data const [metricsRes, alertsRes] = await Promise.all([ fetch('/api/v1/security/monitoring/metrics'), fetch('/api/v1/security/monitoring/alerts'), ]) if (metricsRes.ok) { setMonitoringMetrics(await metricsRes.json()) } else { // Default metrics if API not available setMonitoringMetrics([ { name: 'API Latency', value: 45, unit: 'ms', status: 'ok', trend: 'stable' }, { name: 'Auth Failures', value: 3, unit: '/h', status: 'ok', trend: 'down' }, { name: 'Rate Limit Hits', value: 12, unit: '/h', status: 'warning', trend: 'up' }, { name: 'Failed Logins', value: 0, unit: '/24h', status: 'ok', trend: 'stable' }, { name: 'SSL Expiry', value: 45, unit: 'days', status: 'ok', trend: 'down' }, { name: 'Open Ports', value: 8, unit: '', status: 'ok', trend: 'stable' }, ]) } if (alertsRes.ok) { setActiveAlerts(await alertsRes.json()) } else { setActiveAlerts([]) } } catch (err) { setError(err instanceof Error ? err.message : 'Verbindung zum Backend fehlgeschlagen') } finally { setLoading(false) setIsInitialLoad(false) } }, []) // Initial load only - runs once useEffect(() => { fetchData(true) // Show loading spinner on initial load // eslint-disable-next-line react-hooks/exhaustive-deps }, []) // Auto-refresh every 60 seconds (without loading spinner) useEffect(() => { const interval = setInterval(() => fetchData(false), 60000) return () => clearInterval(interval) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const scanTypeLabels: Record = { secrets: 'Secrets (Gitleaks)', sast: 'SAST (Semgrep + Bandit)', deps: 'Dependencies (Trivy + Grype)', containers: 'Container', sbom: 'SBOM (Syft)', all: 'Full Scan', } const runScan = async (scanType: ScanType) => { console.log(`Starting scan: ${scanType}`) setScanning(scanType) setError(null) setScanMessage(`${scanTypeLabels[scanType]} wird gestartet...`) try { const response = await fetch(`/api/v1/security/scan/${scanType}`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, }) console.log(`Scan response status: ${response.status}`) if (!response.ok) { const errorText = await response.text() console.error(`Scan error: ${errorText}`) throw new Error(`Scan fehlgeschlagen: ${response.status} - ${errorText}`) } const result = await response.json() console.log('Scan result:', result) // Show success message setScanMessage(`${scanTypeLabels[scanType]} laeuft im Hintergrund. Ergebnisse werden in wenigen Sekunden aktualisiert.`) setLastScanTime(new Date().toLocaleTimeString('de-DE')) // Refresh data after scan completes setTimeout(() => { fetchData(false) setScanMessage(null) }, 5000) setTimeout(() => fetchData(false), 15000) setTimeout(() => fetchData(false), 30000) } catch (err) { console.error('Scan error:', err) setError(err instanceof Error ? err.message : 'Scan fehlgeschlagen - Pruefe Browser-Konsole') setScanMessage(null) } finally { setScanning(null) } } const getSeverityBadge = (severity: string) => { const base = 'px-3 py-1 rounded-full text-xs font-semibold uppercase' switch (severity.toUpperCase()) { case 'CRITICAL': return `${base} bg-red-100 text-red-800` case 'HIGH': return `${base} bg-orange-100 text-orange-800` case 'MEDIUM': return `${base} bg-yellow-100 text-yellow-800` case 'LOW': return `${base} bg-green-100 text-green-800` default: return `${base} bg-blue-100 text-blue-800` } } const getStatusBadge = (installed: boolean) => { return installed ? 'px-2 py-1 rounded text-xs font-semibold bg-green-100 text-green-800' : 'px-2 py-1 rounded text-xs font-semibold bg-red-100 text-red-800' } const getHistoryStatusColor = (status: string) => { switch (status) { case 'success': return 'bg-green-500' case 'warning': return 'bg-yellow-500' case 'error': return 'bg-red-500' default: return 'bg-slate-400' } } const getOverallStatus = () => { if (summary.critical > 0) { return { label: 'Critical Issues', color: 'bg-red-100 text-red-800' } } if (summary.high > 0) { return { label: 'High Issues', color: 'bg-orange-100 text-orange-800' } } if (summary.medium > 0) { return { label: 'Warnings', color: 'bg-yellow-100 text-yellow-800' } } return { label: 'Secure', color: 'bg-green-100 text-green-800' } } const filteredFindings = findings.filter(f => { if (severityFilter && f.severity.toUpperCase() !== severityFilter.toUpperCase()) return false if (toolFilter && f.tool.toLowerCase() !== toolFilter.toLowerCase()) return false return true }) const toolDescriptions: Record = { gitleaks: { icon: '🔑', desc: 'Secrets Detection in Git History' }, semgrep: { icon: '🔍', desc: 'Static Application Security Testing (SAST)' }, bandit: { icon: '🐍', desc: 'Python Security Linter' }, trivy: { icon: '🔒', desc: 'Container & Filesystem Vulnerability Scanner' }, grype: { icon: '🐛', desc: 'Vulnerability Scanner for Dependencies' }, syft: { icon: '📦', desc: 'SBOM Generator (CycloneDX/SPDX)' }, } // Map tool names to backend scan types const toolToScanType: Record = { gitleaks: 'secrets', semgrep: 'sast', bandit: 'sast', trivy: 'deps', grype: 'deps', syft: 'sbom', } const status = getOverallStatus() return (
{/* DevOps Pipeline Sidebar */} {/* Header with Status */}

Security Status

{status.label}
Auto-Refresh aktiv
{/* Severity Summary */}
{summary.critical}
Critical
{summary.high}
High
{summary.medium}
Medium
{summary.low}
Low
{summary.info}
Info
{summary.total}
Total
{/* Tabs */}
{(['overview', 'findings', 'tools', 'history', 'monitoring'] as const).map(tab => ( ))}
{/* Scan Status Message */} {scanMessage && (
{scanMessage} {lastScanTime && ( (gestartet um {lastScanTime}) )}
)} {error && (
{error}
)} {loading ? (
) : ( <> {/* Overview Tab */} {activeTab === 'overview' && (
{/* Tools Grid */}

DevSecOps Tools

{tools.map(tool => { const info = toolDescriptions[tool.name.toLowerCase()] || { icon: '🔧', desc: 'Security Tool' } return (
{info.icon} {tool.name}
{tool.installed ? 'Installiert' : 'Nicht installiert'}

{info.desc}

{tool.version || '-'} Letzter Scan: {tool.last_run || 'Nie'}
) })}
{/* Recent Findings */}

Aktuelle Findings

{findings.length === 0 ? (
🎉 Keine Findings gefunden. Das ist gut!
) : (
{findings.slice(0, 10).map((finding, idx) => ( ))}
Severity Tool Finding Datei Gefunden
{finding.severity} {finding.tool} {finding.title} {finding.file || '-'} {finding.found_at ? new Date(finding.found_at).toLocaleString('de-DE', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }) : '-'}
{findings.length > 10 && ( )}
)}
)} {/* Findings Tab */} {activeTab === 'findings' && (
{/* Filters */}
{['CRITICAL', 'HIGH', 'MEDIUM', 'LOW', 'INFO'].map(sev => ( ))} {['gitleaks', 'semgrep', 'bandit', 'trivy', 'grype'].map(t => ( ))}
{filteredFindings.length === 0 ? (
Keine Findings mit diesem Filter gefunden.
) : (
{filteredFindings.map((finding, idx) => ( ))}
Severity Tool Finding Datei Zeile Gefunden
{finding.severity} {finding.tool}
{finding.title}
{finding.message && (
{finding.message}
)}
{finding.file || '-'} {finding.line || '-'} {finding.found_at ? new Date(finding.found_at).toLocaleDateString('de-DE') : '-'}
)}
)} {/* Tools Tab */} {activeTab === 'tools' && (
{tools.map(tool => { const info = toolDescriptions[tool.name.toLowerCase()] || { icon: '🔧', desc: 'Security Tool' } return (
{info.icon}

{tool.name}

{info.desc}

{tool.installed ? 'Installiert' : 'Nicht installiert'}
Version: {tool.version || '-'}
Letzter Scan: {tool.last_run || 'Nie'}
Findings: {tool.last_findings}
) })}
)} {/* History Tab */} {activeTab === 'history' && (
{history.length === 0 ? (
Keine Scan-Historie vorhanden.
) : (
{history.map((item, idx) => (
{item.title} {new Date(item.timestamp).toLocaleString('de-DE')}

{item.description}

))}
)}
)} {/* Monitoring Tab */} {activeTab === 'monitoring' && (
{/* Real-time Metrics */}

Security Metriken

{monitoringMetrics.map((metric, idx) => (
{metric.name} {metric.trend === 'up' ? '↑' : metric.trend === 'down' ? '↓' : '→'}
{metric.value} {metric.unit}
))}
{/* Active Alerts */}

Aktive Alerts {activeAlerts.filter(a => !a.acknowledged).length > 0 && ( {activeAlerts.filter(a => !a.acknowledged).length} )}

{activeAlerts.length === 0 ? (
Keine aktiven Security-Alerts
) : (
{activeAlerts.map((alert) => (
{alert.severity}
{alert.title}
{alert.source} • {new Date(alert.timestamp).toLocaleString('de-DE')}
{!alert.acknowledged && ( )}
))}
)}
{/* Security Overview Cards */}

Authentifizierung

Aktive Sessions 24
Fehlgeschlagene Logins (24h) 0
2FA-Quote 100%

SSL/TLS

Zertifikate 5 aktiv
Naechster Ablauf 45 Tage
TLS Version 1.3

Firewall

Blockierte IPs (24h) 12
Rate Limit Hits 7
WAF Status Aktiv
{/* Link to CI/CD for pipeline monitoring */}
Pipeline Security
Security-Scans in CI/CD Pipelines und Container-Status
CI/CD Dashboard →
)} )}
{/* Documentation Section */}

Security Dokumentation

{/* Short Description */}

Das Security Dashboard bietet einen zentralen Ueberblick ueber alle DevSecOps-Aktivitaeten. Es integriert 6 Security-Tools fuer umfassende Code- und Infrastruktur-Sicherheit: Secrets Detection, Static Analysis (SAST), Dependency Scanning und SBOM-Generierung.

{/* Tool Quick Reference */}
🔑

Gitleaks

Secrets

🔍

Semgrep

SAST

🐍

Bandit

Python

🔒

Trivy

Container

🐛

Grype

Dependencies

📦

Syft

SBOM

{/* Full Documentation (Expandable) */} {showFullDocs && (

1. Security Tools Uebersicht

🔑 Gitleaks - Secrets Detection

Durchsucht die gesamte Git-Historie nach versehentlich eingecheckten Secrets wie API-Keys, Passwoertern und Tokens.

  • Scan-Bereich: Git-Historie, Commits, Branches
  • Erkannte Secrets: AWS Keys, GitHub Tokens, Private Keys, Passwoerter
  • Ausgabe: JSON-Report mit Fundstelle, Commit-Hash, Autor

🔍 Semgrep - Static Application Security Testing

Fuehrt regelbasierte statische Code-Analyse durch, um Sicherheitsluecken und Anti-Patterns zu finden.

  • Unterstuetzte Sprachen: Python, JavaScript, TypeScript, Go, Java
  • Regelsets: OWASP Top 10, CWE, Security Best Practices
  • Findings: SQL Injection, XSS, Path Traversal, Insecure Deserialization

🐍 Bandit - Python Security Linter

Spezialisierter Security-Linter fuer Python-Code mit Fokus auf haeufige Sicherheitsprobleme.

  • Checks: Hardcoded Passwords, SQL Injection, Shell Injection
  • Severity Levels: LOW, MEDIUM, HIGH
  • Confidence: LOW, MEDIUM, HIGH

🔒 Trivy - Container & Filesystem Scanner

Scannt Container-Images und Dateisysteme auf bekannte Schwachstellen (CVEs).

  • Scan-Typen: Container Images, Filesystems, Git Repositories
  • Datenbanken: NVD, GitHub Advisory, Alpine SecDB, RedHat OVAL
  • Ausgabe: CVE-ID, Severity, Fixed Version, Description

🐛 Grype - Dependency Vulnerability Scanner

Analysiert Software-Abhaengigkeiten auf bekannte Sicherheitsluecken.

  • Package Manager: npm, pip, go mod, Maven, Gradle
  • Input: SBOM (CycloneDX/SPDX), Lockfiles, Container Images
  • Matching: CPE-basiert, Package URL (purl)

📦 Syft - SBOM Generator

Erstellt Software Bill of Materials (SBOM) fuer Compliance und Supply-Chain-Security.

  • Formate: CycloneDX (JSON/XML), SPDX, Syft JSON
  • Erfassung: Packages, Lizenzen, Versionen, Checksums
  • Compliance: NIS2, ISO 27001, DSGVO Art. 32

2. Severity-Klassifizierung

Severity CVSS Score Reaktionszeit Beispiele
CRITICAL9.0 - 10.0Sofort (24h)RCE, Auth Bypass, Exposed Secrets
HIGH7.0 - 8.91-3 TageSQL Injection, XSS, Path Traversal
MEDIUM4.0 - 6.91-2 WochenInformation Disclosure, CSRF
LOW0.1 - 3.9Naechster SprintMinor Info Leak, Best Practice
INFO0.0OptionalEmpfehlungen, Hinweise

3. Scan-Workflow

{`┌─────────────────────────────────────────────────────────────┐
│                    Security Scan Pipeline                    │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  1. Secrets Detection (Gitleaks)                            │
│     └── Scannt Git-Historie nach API-Keys & Credentials     │
│                          ↓                                   │
│  2. Static Analysis (Semgrep + Bandit)                      │
│     └── Code-Analyse auf Sicherheitsluecken                 │
│                          ↓                                   │
│  3. Dependency Scan (Trivy + Grype)                         │
│     └── CVE-Check aller Abhaengigkeiten                     │
│                          ↓                                   │
│  4. SBOM Generation (Syft)                                  │
│     └── Software Bill of Materials erstellen                │
│                          ↓                                   │
│  5. Report & Dashboard                                       │
│     └── Ergebnisse aggregieren und visualisieren            │
│                                                              │
└─────────────────────────────────────────────────────────────┘`}
                

4. Remediation-Strategien

Bei Secrets-Findings:

  1. Secret sofort rotieren (neue API-Keys, Passwoerter)
  2. Git-Historie bereinigen (BFG Repo-Cleaner oder git filter-branch)
  3. Betroffene Systeme auf unauthorisierte Zugriffe pruefen
  4. Secret-Scanning in Pre-Commit-Hooks aktivieren

Bei SAST-Findings:

  1. Finding-Details und betroffene Code-Stelle analysieren
  2. Empfohlene Fix-Strategie aus Semgrep-Dokumentation anwenden
  3. Unit-Tests fuer den Fix schreiben
  4. Code-Review durch Security-erfahrenen Entwickler

Bei Dependency-Vulnerabilities:

  1. Pruefen ob ein Patch/Update verfuegbar ist
  2. Abhaengigkeit auf gepatchte Version aktualisieren
  3. Falls kein Patch: Workaround oder Alternative evaluieren
  4. Temporaer: WAF-Regel als Mitigation

5. CI/CD Integration

Security-Scans sind in die Gitea Actions Pipeline integriert:

  • Pre-Commit: Gitleaks (lokale Secrets-Pruefung)
  • Pull Request: Semgrep, Bandit, Trivy (Blocking bei Critical)
  • Main Branch: Full Scan + SBOM-Update
  • Nightly: Dependency-Update-Check

6. Compliance-Mapping

Regulation Artikel Erfuellt durch
DSGVOArt. 32Alle Security-Scans, Vulnerability Management
NIS2Art. 21SBOM, Supply-Chain-Security, Incident Response
ISO 27001A.12.6Vulnerability Management, Patch Management
OWASPTop 10SAST (Semgrep), Secrets Detection

7. API-Endpunkte

Methode Endpoint Beschreibung
GET/api/v1/security/toolsTool-Status abrufen
GET/api/v1/security/findingsAlle Findings abrufen
GET/api/v1/security/summarySeverity-Zusammenfassung
GET/api/v1/security/historyScan-Historie
POST/api/v1/security/scan/allFull Scan starten
POST/api/v1/security/scan/[tool]Einzelnes Tool scannen
)}
) }