Files
FullStackTemplate/SECURITY.md
Christian Schindler 4a6b4a0ae8 feat: Enhance security and validation in backend
- Added helmet for security headers and configured content security policy
- Implemented CORS with a whitelist for allowed origins
- Introduced express-validator for input validation in API endpoints
- Set request size limits to prevent DoS attacks
- Added global error handling and 404 response
- Updated TypeScript configuration to use node16 module resolution
- Improved Docker Compose configuration for security and resource limits
- Created a comprehensive .env.example for environment configuration
- Implemented automated security scans in CI/CD with Trivy
- Added cleanup script for debugging ports
- Established a detailed security policy document
2025-12-01 08:37:35 +01:00

5.8 KiB

🔒 Security Policy

Sicherheitsarchitektur

Dieses Template wurde mit einem Security-First-Ansatz entwickelt und ist optimiert für den Einsatz mit Gitea Actions und anderen CI/CD-Systemen.

🛡️ Implementierte Sicherheitsmaßnahmen

Container Security

Non-Root Container ( Kritisch)

Alle Container laufen als nicht-privilegierte Benutzer:

  • Application Container: UID 1000 (appuser)
  • PostgreSQL Container: UID 70 (Standard postgres-User)
  • Frontend Dev Container: UID 1000 (node)

Warum wichtig?: Container die als root laufen, können bei einem Breakout den Host kompromittieren.

Security Options

security_opt:
  - no-new-privileges:true  # Verhindert Privilege Escalation
cap_drop:
  - ALL                     # Entfernt alle Linux Capabilities
cap_add:
  - NET_BIND_SERVICE        # Nur benötigte Capabilities

Resource Limits

resources:
  limits:
    cpus: '2.0'
    memory: 2G

Verhindert DoS-Angriffe durch Resource-Exhaustion.

Network Security

Isolierte Datenbank

  • PostgreSQL ist nicht nach außen exponiert
  • Nur über internes Docker-Netzwerk erreichbar
  • Für lokales Debugging kann der Port bei Bedarf freigegeben werden

CORS-Whitelist

const allowedOrigins = [
  'https://your-domain.com',
  'https://www.your-domain.com'
];

Nur explizit erlaubte Origins dürfen API-Requests durchführen.

Application Security

Security Headers (Helmet.js)

  • Content-Security-Policy: Verhindert XSS-Angriffe
  • Strict-Transport-Security: Erzwingt HTTPS
  • X-Content-Type-Options: Verhindert MIME-Sniffing
  • X-Frame-Options: Verhindert Clickjacking
  • Permissions-Policy: Kontrolliert Browser-Features

Input-Validierung

Alle API-Endpoints validieren ihre Inputs:

app.post('/api/print', [
  body('photoId').isInt({ min: 1 }),
  body('copies').isInt({ min: 1, max: 100 }),
  validateRequest
], handler);

Request Size Limits

app.use(express.json({ limit: '10mb' }));

Verhindert DoS durch große Payloads.

Database Security

Authentifizierung

  • Verwendet scram-sha-256 statt MD5
  • Keine Default-Passwörter (müssen gesetzt werden)
  • Sichere Passwortgenerierung empfohlen

Secrets Management

  • Keine Secrets im Code
  • .env in .gitignore
  • .env.example als Vorlage

🔍 CI/CD Security Scans

Automatische Scans in Gitea Actions

1. Quellcode-Scan

trivy fs --severity CRITICAL,HIGH --exit-code 1 .

Scannt auf Schwachstellen in Dependencies.

2. Docker Image-Scan

trivy image --severity CRITICAL,HIGH $IMAGE_NAME

Scannt fertige Docker Images.

3. IaC-Scan

trivy config --severity CRITICAL,HIGH .

Prüft Dockerfiles und docker-compose.yml.

4. Automatische Fixes

Bei gefundenen Schwachstellen:

  • Führt npm audit fix aus
  • Erstellt automatischen Commit
  • Baut neue Docker Images

Tägliche Security-Scans

  • Laufen täglich um 6:00 UTC (Cron-Job)
  • Prüfen auf neue Schwachstellen
  • Erstellen automatische Updates

⚠️ Bekannte Einschränkungen

Kein Rate Limiting

Rate Limiting ist absichtlich nicht implementiert, da es in Development-Umgebungen Probleme verursachen kann.

Für Production: Implementiere Rate Limiting über:

  • Traefik/Nginx Rate Limiting
  • express-rate-limit Middleware
  • CloudFlare oder ähnliche Services

Keine End-to-End Verschlüsselung

Das Template setzt voraus, dass TLS/HTTPS auf Reverse-Proxy-Ebene (z.B. Traefik) implementiert wird.

🚨 Vulnerability Reporting

Sicherheitslücken melden

Wenn du eine Sicherheitslücke in diesem Template findest:

  1. NICHT als öffentliches GitHub Issue melden
  2. Sende eine E-Mail an: [security@your-domain.com]
  3. Beschreibe das Problem detailliert
  4. Füge PoC hinzu (falls vorhanden)

Response Timeline

  • Initial Response: Innerhalb von 48 Stunden
  • Fix & Patch: Abhängig von Severity (Critical: 7 Tage, High: 30 Tage)
  • Public Disclosure: Nach Patch-Veröffentlichung

Security Checklist vor Deployment

Pflicht (vor jedem Deployment)

  • .env Datei erstellt und ausgefüllt
  • Starke Secrets generiert (min. 32 Zeichen)
  • NODE_ENV=production gesetzt
  • CORS-Origins auf Production-Domains angepasst
  • PostgreSQL-Passwort geändert
  • JWT-Secret geändert

Empfohlen

  • TLS/HTTPS konfiguriert (Traefik mit Let's Encrypt)
  • Monitoring & Alerting eingerichtet
  • Backup-Strategie implementiert
  • Secrets in Vault oder Secret Manager
  • Logging konfiguriert (keine Secrets in Logs!)
  • Firewall-Regeln geprüft

Optional (Production)

  • Rate Limiting aktiviert
  • WAF (Web Application Firewall) vorgeschaltet
  • DDoS-Protection aktiv
  • Penetration Testing durchgeführt
  • Security Headers im Reverse Proxy verdoppelt

📚 Weitere Ressourcen

Standards & Best Practices

Tools

📝 Changelog

Version 1.0.0 (2024)

  • Non-root Container für alle Services
  • Security Headers mit Helmet.js
  • Input-Validierung mit express-validator
  • CORS-Whitelist
  • Resource Limits
  • Isolierte PostgreSQL-Datenbank
  • Automatische Security-Scans in CI/CD
  • scram-sha-256 Authentifizierung für PostgreSQL

📄 License

Dieses Security-Dokument ist Teil des Full Stack TypeScript Templates und unterliegt der MIT-Lizenz.