You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Follow-up: Enforce Secrets Manager consumption for namespace workloads #36
In issue #35 we implemented namespace-scoped Kubernetes access and deterministic metadata binding to the app landing zone Secrets Manager instance via namespace annotations.
Current state:
stackit.cloud/secretsmanager-instance-id is set on managed namespaces.
This is a stable contract, but does not yet enforce workload-side secret consumption policy.
Goal
Add enforceable controls so workloads in managed namespaces must use the intended Secrets Manager integration path instead of unmanaged plain Kubernetes secrets.
Denied: kind: Secret im Strict-Mode wird geblockt.
Audit: Verstoß wird gemeldet, aber nicht geblockt.
Break-glass: Ausnahme greift nur im erlaubten Rahmen.
Offene Entscheidungen zur Abstimmung
Policy Engine: Kyverno oder Gatekeeper als Standard?
Sync-Mechanismus: ESO als Standardpfad festlegen?
Startmodus für neue Namespaces: audit oder soft?
Umgang mit bestehendem Legacy-Workload: globaler Cutover oder pro Namespace Migrationsfenster?
Break-glass: erlaubt oder vollständig verbieten?
Sollen wir Secret komplett verbieten oder bestimmte Typen (z. B. Token) zulassen?
Sollen Dev-Rollen get/list/watch secrets grundsätzlich verlieren, auch in Nicht-Enforcement-Namespaces?
Wie strikt soll die Bindung an die Namespace-Annotation stackit.cloud/secretsmanager-instance-id werden?
Wollen wir zuerst nur Corporate LZs erzwingen oder Corporate + Public?
Welche Nachweise brauchen wir für Compliance (Audit-Events, regelmäßiger Report, CI-Checks)?
Wenn wir diese 10 Punkte entscheiden, kann ich daraus ein konkretes Implementierungs-Design inkl. Terraform-Schema, Policy-Regeln und Tests in kleinen PR-fähigen Schritten ableiten.
Activity
lweberru commentedon Jun 11, 2026
Aufbauend auf dem aktuellen Stand aus #35 und den heutigen Diskussionen schlage ich folgende Zielarchitektur vor.
Vorschlag: Durchsetzbare Secret-Nutzung
Kernidee:
Damit erreichen wir:
Konkreter Rollout-Vorschlag
Phase 0: Audit / Dry-Run
Phase 1: Soft Enforcement
Phase 2: Strict Enforcement
stackit.cloud/secretsmanager-instance-id).Terraform-/Modul-Integration (Vorschlag)
Neue Konfiguration unter
landing_zones[].namespace_service:secrets_enforcement.enabled(bool)secrets_enforcement.mode(audit|soft|strict)secrets_enforcement.policy_engine(kyverno|gatekeeper)secrets_enforcement.allow_opaque_secret_types(optional list)secrets_enforcement.break_glass(optional object mit allowlist + ttl)Outputs:
Tests (akzeptanznah)
kind: Secretim Strict-Mode wird geblockt.Offene Entscheidungen zur Abstimmung
auditodersoft?Secretkomplett verbieten oder bestimmte Typen (z. B. Token) zulassen?get/list/watch secretsgrundsätzlich verlieren, auch in Nicht-Enforcement-Namespaces?stackit.cloud/secretsmanager-instance-idwerden?Wenn wir diese 10 Punkte entscheiden, kann ich daraus ein konkretes Implementierungs-Design inkl. Terraform-Schema, Policy-Regeln und Tests in kleinen PR-fähigen Schritten ableiten.
lweberru commentedon Jun 11, 2026
Decision update (confirmed)
Wir übernehmen die vorgeschlagenen Defaults und ergänzen explizit: Das gesamte Secrets-Enforcement-Feature bleibt optional/aktivierbar (opt-in).
Finale Entscheidungen:
Zusätzliche Leitplanke (wichtig):
namespace_service.secrets_enforcement.enabled = true|false(Default: false).Nächster Umsetzungsschritt:
lweberru commentedon Jun 11, 2026
Milestone 1 umgesetzt (Schema + Feature Flags + Groundwork)
Status: done
Implementiert:
landing_zones[].namespace_service.secrets_enforcementenabled(default: false)mode(audit|soft|strict, default: audit)policy_engine(kyverno|gatekeeper, default: kyverno)allow_opaque_secret_typesbreak_glass(enabled,ttl_hours,principals)namespace-service.tfstackit.cloud/secrets-enforcement-enabledstackit.cloud/secrets-enforcement-modestackit.cloud/secrets-policy-enginesecrets_enforcement.enabled == falselanding_zone_namespace_secret_enforcementlanding_zone_namespace_service_requests.secrets_enforcementValidierung:
tofu validateerfolgreichHinweis:
lweberru commentedon Jun 11, 2026
Milestone 2 (Teil 1) umgesetzt: Kyverno Policy-Rollout (opt-in)
Status: in progress
Neu implementiert:
kubernetes_manifest.landing_zone_secret_enforcement_policynamespace_service.secrets_enforcement.enabled = truenamespace_service.secrets_enforcement.policy_engine = "kyverno"audit->validationFailureAction: Auditsoft|strict->validationFailureAction: Enforcesoft: blockt direkte Secret CREATEstrict: blockt direkte Secret CREATE/UPDATE/PATCHlanding_zone_namespace_secret_enforcement_policiesGuardrail:
policy_engine=gatekeeperist aktuell noch nicht implementiert und wird übercheckexplizit blockiert (statt stiller No-op).Validierung:
tofu validateerfolgreichOffen für Milestone 2 (Teil 2):
lweberru commentedon Jun 11, 2026
Milestone 2 (Teil 2) umgesetzt: Testabdeckung + Schema-Konsistenz
Status: done
Ergänzt/angepasst:
platform_kubernetes.network.sna_network_prefix_length(Konsistenz zu Modul-Input).secrets_enforcement_audit_plansecrets_enforcement_strict_plansecrets_enforcement_gatekeeper_not_implementedValidierung:
tofu validateerfolgreichtofu test -filter=tests/hub_spoke.tftest.hclerfolgreichSuccess! 4 passed, 0 failed.Hinweis:
enabled=true+policy_engine=kyvernogebunden.lweberru commentedon Jun 11, 2026
Scope update (confirmed): Gatekeeper out, Kyverno-only
Entsprechend der Abstimmung wurde Gatekeeper aus dem Scope entfernt.
Umgesetzt:
secrets_enforcementist jetzt Kyverno-only.policy_enginewurde aus dem Input-Schema entfernt.kyvernoharmonisiert.Validierung:
tofu validateerfolgreichtofu test -filter=tests/hub_spoke.tftest.hclerfolgreichSuccess! 3 passed, 0 failed.Hinweis:
secrets_enforcement.enabled = true.