Skip to content

Commit e605057

Browse files
committed
✨ clean up leftover override secrets when spaceId is removed and add warning for space-scoped service accounts
1 parent 119e2c6 commit e605057

4 files changed

Lines changed: 41 additions & 0 deletions

File tree

pkg/utils/k8s/space_config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ func SyncConfigOverrideSecret(
4444
m *v1alpha2.MondooAuditConfig,
4545
) error {
4646
if m.Spec.SpaceID == "" {
47+
// Clean up any leftover override secret from when spaceId was previously set
48+
derivedSecret := &corev1.Secret{}
49+
key := client.ObjectKey{Name: m.Name + ConfigOverrideSecretSuffix, Namespace: m.Namespace}
50+
if err := kubeClient.Get(ctx, key, derivedSecret); err == nil {
51+
_ = kubeClient.Delete(ctx, derivedSecret)
52+
}
4753
return nil
4854
}
4955

pkg/utils/k8s/space_config_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,35 @@ func TestSyncConfigOverrideSecret(t *testing.T) {
7979
assert.NoError(t, err)
8080
})
8181

82+
t.Run("cleans up override secret when spaceId is removed", func(t *testing.T) {
83+
leftoverSecret := &corev1.Secret{
84+
ObjectMeta: metav1.ObjectMeta{
85+
Name: "test" + ConfigOverrideSecretSuffix,
86+
Namespace: "default",
87+
},
88+
Data: map[string][]byte{
89+
constants.MondooCredsSecretServiceAccountKey: []byte(`{"scope_mrn":"old"}`),
90+
},
91+
}
92+
93+
m := &v1alpha2.MondooAuditConfig{
94+
ObjectMeta: metav1.ObjectMeta{Name: "test", Namespace: "default"},
95+
Spec: v1alpha2.MondooAuditConfigSpec{},
96+
}
97+
98+
kubeClient := fake.NewClientBuilder().WithScheme(scheme).WithObjects(leftoverSecret).Build()
99+
err := SyncConfigOverrideSecret(context.Background(), kubeClient, m)
100+
require.NoError(t, err)
101+
102+
// Verify the override secret was deleted
103+
deletedSecret := &corev1.Secret{}
104+
err = kubeClient.Get(context.Background(), client.ObjectKey{
105+
Name: "test" + ConfigOverrideSecretSuffix,
106+
Namespace: "default",
107+
}, deletedSecret)
108+
assert.Error(t, err, "override secret should have been deleted")
109+
})
110+
82111
t.Run("creates derived secret with scope_mrn", func(t *testing.T) {
83112
origSecret := &corev1.Secret{
84113
ObjectMeta: metav1.ObjectMeta{Name: "org-creds", Namespace: "default"},

pkg/utils/mondoo/gc.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ func DeleteStaleAssets(
118118
// SA MRN format: //agents.api.mondoo.app/spaces/<id>/serviceaccounts/<id>
119119
if spaceMrn := k8s.SpaceMrnForAuditConfig(*mondoo); spaceMrn != "" {
120120
req.SpaceMrn = spaceMrn
121+
// Warn if SA appears to be space-scoped (not org-level) and targets a different space
122+
if saSpaceMrn := sa.SpaceMrn; saSpaceMrn != "" && saSpaceMrn != spaceMrn {
123+
logger.Info("WARNING: spaceId targets a different space than the service account; ensure the SA has org-level access",
124+
"saSpaceMrn", saSpaceMrn, "targetSpaceMrn", spaceMrn)
125+
}
121126
} else {
122127
req.SpaceMrn = sa.SpaceMrn
123128
if req.SpaceMrn == "" {

tests/e2e/scripts/apply-mondoo-config-space-splitting.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ if [[ -n "${MONDOO_CONFIG_PATH:-}" ]]; then
3030
--dry-run=client -o yaml | kubectl apply -f -
3131
elif [[ -n "${ORG_CREDS_B64:-}" ]]; then
3232
info "Using credentials from ORG_CREDS_B64"
33+
trap 'rm -f /tmp/mondoo-creds.json' EXIT
3334
echo "${ORG_CREDS_B64}" | base64 -d > /tmp/mondoo-creds.json
3435
kubectl create secret generic mondoo-client \
3536
--from-file=config=/tmp/mondoo-creds.json \

0 commit comments

Comments
 (0)