6.9 KiB
Admin-Leitfaden: *_SECRET-Werte in Env-Dateien verschlüsseln
Diese Anleitung beschreibt, wie das PowerOn-Gateway-Tool scripts/script_security_encrypt_all_env_files.py alle unverschlüsselten *_SECRET-Variablen in env_dev.env, env_int.env und env_prod.env verschlüsselt.
1) Einsatz in beliebigen Repositories & Voraussetzungen
Das Tool kann in jedem Repository eingesetzt werden, sofern die untenstehenden Vorbedingungen erfüllt sind. Standardmäßig ist es im Ordner gateway integriert und erwartet dort seine Abhängigkeiten. In anderen Repos müssen Sie die Gateway-Komponenten bereitstellen oder den PYTHONPATH entsprechend setzen.
- Ausführungspfad: Entweder im Verzeichnis, das die Gateway-Module
modules/sharedenthält (z. B.gateway), oder mit gesetztemPYTHONPATH, sodassmodules/shared/configuration.pyimportiert werden kann. - Python: Python 3.10+ mit Abhängigkeiten (siehe Kapitel „Vorbedingungen“). Installation z. B.:
- Windows PowerShell im Repo-Root:
python -m venv .venv && .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt
- Windows PowerShell im Repo-Root:
- Dateien:
- Eine
config.ini(im gleichen Projektteil wie diemodules), die zumindestAPP_ENV_TYPEundAPP_KEY_SYSVARenthält. - Die zu verarbeitenden Env-Dateien:
env_dev.env,env_int.env,env_prod.env(oder eine Teilmenge via--files).
- Eine
- Rechte: Schreibrechte auf die Env-Dateien, Leserechte auf die Masterkey-Quelle (siehe Punkt 2).
Hinweis: Das Tool importiert encryptValue aus modules/shared/configuration.py. Stellen Sie sicher, dass dieser Pfad importierbar ist (Start im Gateway-Verzeichnis oder PYTHONPATH setzen). Das Script fuegt gateway automatisch zu sys.path hinzu.
Vorbedingungen
-
requirements.txtim Projekt (Minimalbeispiel):cryptography>=41.0.0Falls Sie das Tool im bestehenden Gateway verwenden, nutzen Sie stattdessen die dortige Datei
gateway/requirements.txt. -
Notwendige Gateway-Komponenten (sofern außerhalb von
gatewayverwendet):modules/shared/configuration.py(liefertAPP_CONFIG,_getMasterKey,encryptValue,decryptValue)- Optional, aber unterstützt:
modules/shared/auditLogger.py(Audit-Events; Ausfall ist toleriert) config.iniim gleichen Baum wiemodules, mit mindestens:APP_ENV_TYPE = dev|int|prod(kann pro Env-Datei zusätzlich gesetzt werden)APP_KEY_SYSVAR = <OS_ENV_NAME|Pfad_zur_Keydatei>
-
Struktur/Importpfade sicherstellen:
- Entweder das Tool im Ordner ausführen, der die
modules-Struktur enthält (z. B.gateway). - Oder
PYTHONPATHso setzen, dassmodulesauflösbar ist, z. B. PowerShell:$env:PYTHONPATH = (Resolve-Path .) python tool_security_encrypt_all_env_files.py --dry-run
- Entweder das Tool im Ordner ausführen, der die
2) Masterkey: Herkunft pro Umgebung
Die Verschlüsselung verwendet pro Umgebung einen Masterkey, der in modules/shared/configuration.py über _get_master_key(env_type) ermittelt wird. Quelle des Keys:
-
APP_KEY_SYSVAR(ausconfig.inioder.env) gibt entweder- den Namen einer OS-Umgebungsvariablen an, die den Masterkey direkt enthält, oder
- einen Dateipfad zu einer Key-Datei an.
-
Auflösung in dieser Reihenfolge:
- Wenn eine OS-Umgebungsvariable mit dem Namen
APP_KEY_SYSVARexistiert, wird deren Wert direkt als Masterkey verwendet. - Wenn keine OS-Variable gefunden wird, wird der Wert als Pfad interpretiert. Existiert die Datei, wird sie gelesen. Erwartetes Format je Zeile:
env = key, z. B.:dev = <masterkey_dev>int = <masterkey_int>prod = <masterkey_prod>Für die Zielumgebung (z. B.prod) wird die passend benannte Zeile verwendet.
- Wenn eine OS-Umgebungsvariable mit dem Namen
-
Der abgeleitete Key wird per PBKDF2 in einen 32-Byte-Schlüssel umgewandelt und für Fernet genutzt. Der verschlüsselte Wert erhält ein Präfix gemäß Umgebung:
DEV_ENC:,INT_ENC:,PROD_ENC:(weitere unterstützt:TEST_ENC:,STAGING_ENC:).
Wichtig: Die Umgebung für die Verschlüsselung wird pro Datei aus der jeweiligen Datei selbst gelesen (APP_ENV_TYPE=<dev|int|prod>). D. h. env_prod.env wird mit prod-Key verschlüsselt, unabhängig von der aktuellen Prozess-Umgebung.
3) Anwendung und Verhalten
Tool: gateway/tool_security_encrypt_all_env_files.py
-
Standardlauf (alle drei Dateien, mit Backup):
python tool_security_encrypt_all_env_files.pyWirkung:
- Liest je Datei
APP_ENV_TYPE. - Findet alle Schlüssel, deren Name auf
_SECRETendet, und deren Werte noch kein*_ENC:-Präfix haben. - Unterstützt einzeilige und mehrzeilige JSON-Werte (Klammer-Auf/Zu wird erkannt).
- Verschlüsselt die Werte mit dem passenden Umgebungs-Key und ersetzt die Originalwerte in der Datei durch den umgebungsspezifischen Prefix, z.B.
DEV_ENC:<payload>,INT_ENC:<payload>,PROD_ENC:<payload>(abhaengig vonAPP_ENV_TYPE). - Legt vor Änderungen eine Backup-Datei mit Zeitstempel neben der Originaldatei an, z. B.
env_prod.env.20251015_101530.backup.
- Liest je Datei
-
Trockenlauf (nur anzeigen, nichts schreiben):
python tool_security_encrypt_all_env_files.py --dry-runWirkung: Listet, welche Zeilen/Keys verschlüsselt würden. Es werden keine Änderungen vorgenommen und keine Backups erstellt.
-
Ohne Backups ausführen:
python tool_security_encrypt_all_env_files.py --no-backupWirkung: Schreibt Änderungen ohne vorherige Backup-Datei.
-
Nur bestimmte Dateien verarbeiten:
python tool_security_encrypt_all_env_files.py --files env_dev.env env_prod.env
Ausgabe/Ergebnis:
- Pro Datei: Anzahl gefundener Secrets, Anzahl verschlüsselter Secrets, ggf. Backup-Datei, Fehler.
- Zusammenfassung am Ende über alle verarbeiteten Dateien.
Was wird als „bereits verschlüsselt“ erkannt?
- Alle Werte, die mit einem der Präfixe beginnen:
DEV_ENC:,INT_ENC:,PROD_ENC:,TEST_ENC:,STAGING_ENC:. Diese werden übersprungen.
Fehlerbilder und Checks:
- Fehlt
APP_KEY_SYSVARinconfig.ini/.envoder zeigt er auf eine nicht existierende OS-Variable/Datei, schlägt die Verschlüsselung fehl. - Fehlt in einer Key-Datei der passende Eintrag für die Zielumgebung, wird ein Fehler gemeldet.
- Schreibfehler (z. B. fehlende Rechte) verhindern das Aktualisieren der Env-Datei.
Best Practices
- Änderungen zuerst mit
--dry-runprüfen. - Vor Produktivläufen sicherstellen, dass
APP_KEY_SYSVARkorrekt auf OS-Variable oder Key-Datei zeigt und die Datei einen Eintrag für die Zielumgebung enthält. - Backups beibehalten, um bei Bedarf Änderungen zurückzurollen.
- JSON-Secrets in Env-Dateien korrekt mit
{ ... }kapseln; das Tool erkennt und ersetzt mehrzeilige JSON-Blöcke vollständig.
Referenz
- Schlüsselauflösung und Verschlüsselung:
gateway/modules/shared/configuration.py(_get_master_key,_derive_encryption_key,encrypt_value). - Batch-Tool:
gateway/tool_security_encrypt_all_env_files.py(encrypt_all_secrets_in_file,process_all_env_files).