- 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
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-AngriffeStrict-Transport-Security: Erzwingt HTTPSX-Content-Type-Options: Verhindert MIME-SniffingX-Frame-Options: Verhindert ClickjackingPermissions-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-256statt MD5 - Keine Default-Passwörter (müssen gesetzt werden)
- Sichere Passwortgenerierung empfohlen
Secrets Management
- Keine Secrets im Code
.envin.gitignore.env.exampleals 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 fixaus - 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:
- NICHT als öffentliches GitHub Issue melden
- Sende eine E-Mail an: [security@your-domain.com]
- Beschreibe das Problem detailliert
- 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)
.envDatei erstellt und ausgefüllt- Starke Secrets generiert (min. 32 Zeichen)
NODE_ENV=productiongesetzt- 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.