462 lines
No EOL
19 KiB
HTML
462 lines
No EOL
19 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Key Management - Praktische Umsetzung & Werkzeuge</title>
|
|
<style>
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
line-height: 1.6;
|
|
color: #333;
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: 20px;
|
|
background: #f5f5f5;
|
|
}
|
|
h1 {
|
|
color: #2c3e50;
|
|
border-bottom: 3px solid #3498db;
|
|
padding-bottom: 10px;
|
|
}
|
|
h2 {
|
|
color: #34495e;
|
|
margin-top: 30px;
|
|
border-bottom: 2px solid #ecf0f1;
|
|
padding-bottom: 8px;
|
|
}
|
|
h3 {
|
|
color: #7f8c8d;
|
|
margin-top: 20px;
|
|
}
|
|
.architecture-box {
|
|
background: white;
|
|
border: 1px solid #ddd;
|
|
border-radius: 8px;
|
|
padding: 20px;
|
|
margin: 20px 0;
|
|
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
}
|
|
.highlight {
|
|
background: #fff3cd;
|
|
padding: 15px;
|
|
border-left: 4px solid #ffc107;
|
|
margin: 20px 0;
|
|
}
|
|
.info-box {
|
|
background: #d1ecf1;
|
|
border: 1px solid #bee5eb;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 20px 0;
|
|
}
|
|
.security-note {
|
|
background: #f8d7da;
|
|
border: 1px solid #f5c6cb;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 20px 0;
|
|
}
|
|
.process-flow {
|
|
background: #e7f3ff;
|
|
border: 1px solid #b3d9ff;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 20px 0;
|
|
}
|
|
.warning-box {
|
|
background: #fff3cd;
|
|
border: 1px solid #ffeeba;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 20px 0;
|
|
border-left: 4px solid #ffc107;
|
|
}
|
|
.success-box {
|
|
background: #d4edda;
|
|
border: 1px solid #c3e6cb;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 20px 0;
|
|
}
|
|
.workflow-step {
|
|
background: #f8f9fa;
|
|
border: 1px solid #dee2e6;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 15px 0;
|
|
border-left: 4px solid #6c757d;
|
|
}
|
|
.workflow-step h4 {
|
|
margin-top: 0;
|
|
color: #495057;
|
|
}
|
|
ul, ol {
|
|
margin: 10px 0;
|
|
padding-left: 30px;
|
|
}
|
|
li {
|
|
margin: 5px 0;
|
|
}
|
|
.file-structure {
|
|
background: #f8f9fa;
|
|
border: 1px solid #dee2e6;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 15px 0;
|
|
font-family: monospace;
|
|
}
|
|
.tool-description {
|
|
background: #e8f5e8;
|
|
border: 1px solid #c3e6cb;
|
|
border-radius: 5px;
|
|
padding: 15px;
|
|
margin: 15px 0;
|
|
}
|
|
.tool-description h4 {
|
|
margin-top: 0;
|
|
color: #155724;
|
|
}
|
|
.code-example {
|
|
background: #2c3e50;
|
|
color: #ecf0f1;
|
|
padding: 15px;
|
|
border-radius: 5px;
|
|
overflow-x: auto;
|
|
font-family: 'Courier New', monospace;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Key Management - Praktische Umsetzung & Werkzeuge</h1>
|
|
|
|
<div class="architecture-box">
|
|
<h2>1. Kern-Anforderungen & Prinzipien</h2>
|
|
|
|
<div class="security-note">
|
|
<h3>🔒 Grundprinzipien</h3>
|
|
<ul>
|
|
<li><strong>Keine Plain-Text Keys im Code:</strong> Keys werden nur verschlüsselt gespeichert</li>
|
|
<li><strong>Lokale Entwicklung:</strong> Keys können lokal ohne Internetzugang entschlüsselt werden</li>
|
|
<li><strong>Absolute Dev/Prod Trennung:</strong> Keine Überschneidung zwischen Development und Production</li>
|
|
<li><strong>Minimaler Aufwand:</strong> Neue Keys direkt im Code erfassen können</li>
|
|
<li><strong>Keine Provider-Abhängigkeit:</strong> Master Keys werden bei uns gespeichert</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>1.1 File-Struktur</h3>
|
|
<div class="file-structure">
|
|
repository/
|
|
├── config.ini # Generische Konfiguration
|
|
├── .env # Instanz-spezifische Umgebungsvariablen
|
|
├── .env.development # Development-spezifische Keys
|
|
├── .env.production # Production-spezifische Keys
|
|
└── src/
|
|
└── utils/
|
|
└── config.py # getConfig() Funktion
|
|
</div>
|
|
|
|
<h3>1.2 Key-Format</h3>
|
|
<div class="info-box">
|
|
<h4>Verschlüsselte Keys haben folgendes Format:</h4>
|
|
<ul>
|
|
<li><strong>Development Keys:</strong> <code>DEV_ENC:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</code></li>
|
|
<li><strong>Production Keys:</strong> <code>PROD_ENC:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</code></li>
|
|
<li><strong>Metadata:</strong> <code>PROD_ENC:encrypted_value|LIMIT:1000/hour|TRACK:true</code></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>2. Master Key Management</h2>
|
|
|
|
<h3>2.1 Master Key Storage - Eigene V-Domäne</h3>
|
|
<div class="info-box">
|
|
<h4>Master Keys werden bei uns gespeichert:</h4>
|
|
<ul>
|
|
<li><strong>Development Master Key:</strong> Lokal auf Entwickler-Maschine (~/.keytool/dev-master.key)</li>
|
|
<li><strong>Production Master Key:</strong> Auf eigener V-Domäne (z.B. keys.internal.company.com)</li>
|
|
<li><strong>Keine Cloud-Provider:</strong> Vollständige Kontrolle über Key-Storage</li>
|
|
<li><strong>HSM-Backed:</strong> Hardware Security Module für Production Keys</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>2.2 Master Key Nutzung für Decryption</h3>
|
|
<div class="process-flow">
|
|
<h4>Workflow für Key-Decryption:</h4>
|
|
<ol>
|
|
<li><strong>Key-Format erkennen:</strong> DEV_ENC: oder PROD_ENC: Prefix parsen</li>
|
|
<li><strong>Master Key laden:</strong> Entsprechenden Master Key aus Storage laden</li>
|
|
<li><strong>Environment-Check:</strong> Sicherstellen, dass Key in richtiger Umgebung entschlüsselt wird</li>
|
|
<li><strong>Decryption:</strong> Key mit Master Key entschlüsseln</li>
|
|
<li><strong>Metadata parsen:</strong> Limits und Tracking-Informationen extrahieren</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<h3>2.3 Environment-Separation</h3>
|
|
<div class="security-note">
|
|
<h4>🔐 Strikte Trennung:</h4>
|
|
<ul>
|
|
<li><strong>Development:</strong> Kann nur DEV_ENC: Keys entschlüsseln</li>
|
|
<li><strong>Production:</strong> Kann nur PROD_ENC: Keys entschlüsseln</li>
|
|
<li><strong>Cross-Decryption:</strong> Wird blockiert - Security Feature</li>
|
|
<li><strong>Automatische Erkennung:</strong> Environment wird automatisch erkannt</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>3. Encryption Tool - Lokale Nutzung</h2>
|
|
|
|
<h3>3.1 Tool-Funktionalität</h3>
|
|
<div class="tool-description">
|
|
<h4>Das Encryption Tool bietet:</h4>
|
|
<ul>
|
|
<li><strong>Lokale Nutzung:</strong> Funktioniert ohne Internetzugang</li>
|
|
<li><strong>Automatische File-Auswahl:</strong> Repository, Instanz, Key-Name auswählen</li>
|
|
<li><strong>Copy/Paste Integration:</strong> Key direkt einfügen und verschlüsseln</li>
|
|
<li><strong>Automatisches Speichern:</strong> Verschlüsselter Key wird im richtigen File gespeichert</li>
|
|
<li><strong>Environment-Aware:</strong> Erkennt automatisch ob DEV oder PROD</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>3.2 Tool-Workflow</h3>
|
|
<div class="workflow-step">
|
|
<h4>Schritt 1: Repository & Instanz auswählen</h4>
|
|
<p>Tool zeigt verfügbare Repositories und deren Instanzen an</p>
|
|
</div>
|
|
|
|
<div class="workflow-step">
|
|
<h4>Schritt 2: Key-Name definieren</h4>
|
|
<p>Neuen Key-Namen eingeben (z.B. API_KEY_CUSTOMER_001)</p>
|
|
</div>
|
|
|
|
<div class="workflow-step">
|
|
<h4>Schritt 3: Plain-Text Key einfügen</h4>
|
|
<p>Key per Copy/Paste einfügen</p>
|
|
</div>
|
|
|
|
<div class="workflow-step">
|
|
<h4>Schritt 4: Automatische Verschlüsselung</h4>
|
|
<p>Tool verschlüsselt Key und speichert ihn im richtigen File</p>
|
|
</div>
|
|
|
|
<h3>3.3 Tool-Integration</h3>
|
|
<div class="info-box">
|
|
<h4>Integration in den Entwickler-Workflow:</h4>
|
|
<ul>
|
|
<li><strong>Command Line Tool:</strong> <code>keytool encrypt --repo=repo-name --instance=dev --key=API_KEY --value=plaintext</code></li>
|
|
<li><strong>IDE Integration:</strong> Plugin für VS Code/IntelliJ</li>
|
|
<li><strong>Git Hooks:</strong> Automatische Validierung vor Commit</li>
|
|
<li><strong>CI/CD Integration:</strong> Automatische Key-Validierung bei Deployment</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>4. getConfig() Funktion - Praktische Umsetzung</h2>
|
|
|
|
<h3>4.1 Funktionalität</h3>
|
|
<div class="info-box">
|
|
<h4>Die getConfig() Funktion:</h4>
|
|
<ul>
|
|
<li><strong>Config Loading:</strong> Lädt config.ini und .env Files beim App-Start</li>
|
|
<li><strong>Automatische Decryption:</strong> Entschlüsselt alle verschlüsselten Keys</li>
|
|
<li><strong>Environment Detection:</strong> Erkennt automatisch Development/Production</li>
|
|
<li><strong>Variable Access:</strong> Stellt entschlüsselte Keys als Variablen zur Verfügung</li>
|
|
<li><strong>Metadata Handling:</strong> Verarbeitet Limits und Tracking-Informationen</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>4.2 Implementierungs-Logik</h3>
|
|
<div class="process-flow">
|
|
<h4>getConfig() Workflow:</h4>
|
|
<ol>
|
|
<li><strong>File Loading:</strong> config.ini und .env Files laden</li>
|
|
<li><strong>Environment Detection:</strong> Dev/Prod automatisch erkennen</li>
|
|
<li><strong>Master Key Loading:</strong> Entsprechenden Master Key laden</li>
|
|
<li><strong>Key Scanning:</strong> Alle verschlüsselten Keys identifizieren</li>
|
|
<li><strong>Decryption:</strong> Keys mit Master Key entschlüsseln</li>
|
|
<li><strong>Metadata Parsing:</strong> Limits und Tracking-Informationen extrahieren</li>
|
|
<li><strong>Variable Setup:</strong> Entschlüsselte Keys als Variablen verfügbar machen</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<h3>4.3 Usage im Code</h3>
|
|
<div class="code-example">
|
|
# In der Anwendung
|
|
from utils.config import getConfig
|
|
|
|
config = getConfig()
|
|
|
|
# Zugriff auf entschlüsselte Keys
|
|
api_key = config.get('API_KEY_CUSTOMER_001')
|
|
db_password = config.get('DB_PASSWORD')
|
|
|
|
# Mit Customer-Context
|
|
customer_api_key = config.get('API_KEY', customer_id='CUSTOMER_001')
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>5. Repository & Instanz Management</h2>
|
|
|
|
<h3>5.1 Multi-Repository Struktur</h3>
|
|
<div class="info-box">
|
|
<h4>Verwaltung vieler Repositories:</h4>
|
|
<ul>
|
|
<li><strong>Zentrale Registry:</strong> Alle Repositories und Instanzen werden zentral verwaltet</li>
|
|
<li><strong>Instanz-spezifische .env Files:</strong> Jede Instanz hat eigene .env Datei</li>
|
|
<li><strong>Automatische Synchronisation:</strong> Keys werden automatisch zwischen Repositories synchronisiert</li>
|
|
<li><strong>Versionierung:</strong> Alle Key-Änderungen werden versioniert</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>5.2 Instanz-spezifische Konfiguration</h3>
|
|
<div class="file-structure">
|
|
repository/
|
|
├── .env.development # Development Keys
|
|
├── .env.staging # Staging Keys
|
|
├── .env.production # Production Keys
|
|
└── .env.local # Lokale Override Keys
|
|
</div>
|
|
|
|
<h3>5.3 Deployment-Integration</h3>
|
|
<div class="process-flow">
|
|
<h4>Automatisches Deployment:</h4>
|
|
<ol>
|
|
<li><strong>Code auf GitHub main:</strong> Trigger für automatisches Deployment</li>
|
|
<li><strong>Key-Validierung:</strong> Alle Keys werden auf Gültigkeit geprüft</li>
|
|
<li><strong>Environment-Matching:</strong> Richtige .env Files werden für Ziel-Umgebung geladen</li>
|
|
<li><strong>Key-Decryption:</strong> Keys werden in Ziel-Umgebung entschlüsselt</li>
|
|
<li><strong>App-Start:</strong> Anwendung startet mit entschlüsselten Keys</li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>6. Sicherheits-Features</h2>
|
|
|
|
<h3>6.1 Key-Validierung</h3>
|
|
<div class="security-note">
|
|
<h4>🔒 Automatische Sicherheits-Checks:</h4>
|
|
<ul>
|
|
<li><strong>Plain-Text Detection:</strong> Blockiert Commits mit unverschlüsselten Keys</li>
|
|
<li><strong>Environment-Mismatch:</strong> Verhindert PROD Keys in DEV Umgebung</li>
|
|
<li><strong>Key-Rotation:</strong> Automatische Warnung bei veralteten Keys</li>
|
|
<li><strong>Usage-Tracking:</strong> Überwachung von Key-Nutzung (nur Production)</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>6.2 Git Integration</h2>
|
|
<div class="info-box">
|
|
<h4>Git Hooks und CI/CD:</h4>
|
|
<ul>
|
|
<li><strong>Pre-commit Hook:</strong> Prüft auf Plain-Text Keys</li>
|
|
<li><strong>Pre-push Hook:</strong> Validiert Key-Format und Environment</li>
|
|
<li><strong>CI/CD Pipeline:</strong> Automatische Key-Validierung bei jedem Build</li>
|
|
<li><strong>Deployment Check:</strong> Verhindert Deployment mit ungültigen Keys</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>7. Praktische Implementierung</h2>
|
|
|
|
<h3>7.1 Tool-Setup</h3>
|
|
<div class="workflow-step">
|
|
<h4>Entwickler-Setup:</h4>
|
|
<ol>
|
|
<li><strong>Master Key generieren:</strong> Lokalen Development Master Key erstellen</li>
|
|
<li><strong>Tool installieren:</strong> Encryption Tool lokal installieren</li>
|
|
<li><strong>Repository registrieren:</strong> Lokale Repositories im Tool registrieren</li>
|
|
<li><strong>Test-Key erstellen:</strong> Ersten verschlüsselten Key erstellen</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<h3>7.2 Täglicher Workflow</h3>
|
|
<div class="process-flow">
|
|
<h4>Entwickler-Alltag:</h4>
|
|
<ol>
|
|
<li><strong>Neuen Key benötigen:</strong> API Key für neuen Customer</li>
|
|
<li><strong>Tool starten:</strong> Encryption Tool öffnen</li>
|
|
<li><strong>Kontext wählen:</strong> Repository, Instanz, Key-Name auswählen</li>
|
|
<li><strong>Key einfügen:</strong> Plain-Text Key per Copy/Paste einfügen</li>
|
|
<li><strong>Automatische Verschlüsselung:</strong> Tool verschlüsselt und speichert</li>
|
|
<li><strong>Code verwenden:</strong> getConfig() kann Key sofort nutzen</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<h3>7.3 Key-Rotation</h3>
|
|
<div class="success-box">
|
|
<h4>✨ Einfache Key-Rotation:</h4>
|
|
<ul>
|
|
<li><strong>Automatische Erkennung:</strong> Tool erkennt Keys die rotiert werden müssen</li>
|
|
<li><strong>One-Command Rotation:</strong> Alle Keys einer Instanz mit einem Befehl rotieren</li>
|
|
<li><strong>Grace Period:</strong> Alte Keys bleiben 24h gültig für Übergang</li>
|
|
<li><strong>Automatische Benachrichtigung:</strong> Team wird über Rotation informiert</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>8. Monitoring & Alerts</h2>
|
|
|
|
<h3>8.1 Key-Monitoring</h3>
|
|
<div class="info-box">
|
|
<h4>Überwachung der Keys:</h4>
|
|
<ul>
|
|
<li><strong>Key-Age:</strong> Tage bis zur Rotation</li>
|
|
<li><strong>Usage-Patterns:</strong> Wie oft werden Keys verwendet</li>
|
|
<li><strong>Environment-Mismatches:</strong> PROD Keys in DEV Umgebung</li>
|
|
<li><strong>Plain-Text Detection:</strong> Unverschlüsselte Keys im Code</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h3>8.2 Alert-System</h3>
|
|
<div class="warning-box">
|
|
<h4>Automatische Benachrichtigungen:</h4>
|
|
<ul>
|
|
<li><strong>Rotation Due:</strong> Key muss in 7 Tagen rotiert werden</li>
|
|
<li><strong>Security Violation:</strong> PROD Key in DEV Umgebung</li>
|
|
<li><strong>Plain-Text Alert:</strong> Unverschlüsselter Key im Code gefunden</li>
|
|
<li><strong>Usage Anomaly:</strong> Ungewöhnliche Key-Nutzung</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="architecture-box">
|
|
<h2>9. Zusammenfassung der Werkzeuge</h2>
|
|
|
|
<div class="tool-description">
|
|
<h3>9.1 Encryption Tool</h3>
|
|
<ul>
|
|
<li><strong>Zweck:</strong> Neue Keys verschlüsseln und in richtige Files speichern</li>
|
|
<li><strong>Input:</strong> Repository, Instanz, Key-Name, Plain-Text Key</li>
|
|
<li><strong>Output:</strong> Verschlüsselter Key im richtigen .env File</li>
|
|
<li><strong>Lokale Nutzung:</strong> Funktioniert ohne Internetzugang</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="tool-description">
|
|
<h3>9.2 getConfig() Funktion</h3>
|
|
<ul>
|
|
<li><strong>Zweck:</strong> Config Files laden und Keys entschlüsseln</li>
|
|
<li><strong>Input:</strong> config.ini und .env Files</li>
|
|
<li><strong>Output:</strong> Entschlüsselte Keys als Variablen</li>
|
|
<li><strong>Integration:</strong> Wird beim App-Start aufgerufen</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="tool-description">
|
|
<h3>9.3 Master Key Storage</h3>
|
|
<ul>
|
|
<li><strong>Development:</strong> Lokal auf Entwickler-Maschine</li>
|
|
<li><strong>Production:</strong> Auf eigener V-Domäne</li>
|
|
<li><strong>Keine Provider:</strong> Vollständige Kontrolle</li>
|
|
<li><strong>Environment-Separation:</strong> Absolute Trennung Dev/Prod</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html> |