fix(security): SOPS-Regel reparieren + Session-Secret fail-closed - #1
Merged
Merged
Conversation
Zwei Findings aus dem Review von e4b2621: .sops.yaml: path_regex `^*.$` ist keine gueltige Go-Regex (`*` ohne vorangehendes Atom). Neue Secret-Dateien und `sops updatekeys` griffen dadurch nicht; values.sops.yaml funktionierte nur, weil die Empfaenger bereits in dessen Metadaten stehen. Ersetzt durch `\.sops\.ya?ml$` — bewusst eng, damit nicht das ganze Repo verschluesselt wird. app.py: `_load_app_secret()` war fail-open — fehlte FLASK_SECRET_KEY, startete die App kommentarlos mit einem Zufallskey. Sessions starben dann bei jedem Restart und der Zweck des SOPS-Commits war still ausgehebelt. Jetzt fail-closed: bei FLASK_ENV == "production" und fehlendem oder leerem Secret bricht der Start mit RuntimeError ab. Der Zufalls-Fallback bleibt der lokalen Entwicklung vorbehalten; der Secret-Wert landet in keiner Meldung. Abgesichert durch tests/unit/test_app_secret.py (6 Tests: Key gesetzt mit/ohne Production, fehlender und leerer Key in Production, Dev- Fallback nicht deterministisch, kein Secret-Leak in der Fehlermeldung). Volle Unit-Suite: 133 passed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

0 New Issues
0 Fixed Issues
0 Accepted Issues
Behebt zwei Findings aus einem Review des Commits
e4b2621("non-root securityContext + FLASK_SECRET_KEY via SOPS")..sops.yaml— ungültige Regexcreation_rules[0].path_regex: ^*.$ist keine gültige Go-Regex (*ohne vorangehendes Atom → missing argument to repetition operator). Folge: neue Secret-Dateien undsops updatekeysgreifen nicht. Das bestehendemayflowerDeploy/production/values.sops.yamlfunktioniert nur deshalb, weil die Empfänger bereits in dessen Metadaten stehen — eine Key-Rotation wäre ins Leere gelaufen.Ersetzt durch
\.sops\.ya?ml$, bewusst eng gehalten, damit nicht das ganze Repo als zu verschlüsseln gilt. Trifft die vorhandene Datei und künftige*.sops.yml/*.sops.yaml.app.py— Session-Secret war fail-open_load_app_secret()fiel aufos.urandom(32).hex()zurück, sobaldFLASK_SECRET_KEYfehlte — auch in Production. Bei einem Tippfehler im values-Merge wäre die App kommentarlos mit einem Zufallskey gestartet: Sessions sterben bei jedem Restart und der Zweck des SOPS-Commits ist still ausgehebelt. Der Docstring forderte das korrekte Verhalten bereits, erzwungen wurde es nicht.Jetzt fail-closed: bei
FLASK_ENV == "production"(dieselbe Bedingung wie beiSESSION_COOKIE_SECURE) und fehlendem oder leerem Secret bricht der Start mitRuntimeErrorab. Der Zufalls-Fallback bleibt der lokalen Entwicklung vorbehalten. Der Secret-Wert landet in keiner Meldung und in keinem Log.Hinweis für das Deployment: Der Start schlägt jetzt fehl, wenn
FLASK_SECRET_KEYin Production nicht ankommt. Genau das ist gewollt — vor dem Rollout bitte prüfen, dass das Secret übervalues.sops.yamlsauber im Pod landet.Tests
Neu:
tests/unit/test_app_secret.pymit 6 Tests — Key gesetzt (mit und ohne Production), fehlender Key in Production, leerer Key in Production, Dev-Fallback nicht deterministisch, und kein Secret-Leak in der Fehlermeldung. Isolation übermonkeypatch.setenv/delenvnach dem Muster austest_app_workers.py.Volle Unit-Suite: 133 passed.
Nicht in diesem PR
Beim Review fiel zusätzlich auf, dass
/api/tests/statusund/api/reports/<name>keine Ownership-Prüfung haben — ein Nutzer kann Läufe und Reports anderer abrufen. Bewusst außerhalb des Scopes dieses PRs.🤖 Generated with Claude Code