From b25f943b3af846377f1be3f6c8abf13824243c28 Mon Sep 17 00:00:00 2001 From: Samuel Archambault Date: Fri, 24 Sep 2021 13:51:05 -0400 Subject: [PATCH] Verify secrets and FromEnv in addition to Env --- pkg/onepassword/containers.go | 22 +++++++- pkg/onepassword/containers_test.go | 55 +++++++++++++++++-- pkg/onepassword/deployments_test.go | 2 +- pkg/onepassword/object_generators_for_test.go | 16 +++++- 4 files changed, 86 insertions(+), 9 deletions(-) diff --git a/pkg/onepassword/containers.go b/pkg/onepassword/containers.go index 1f51bd9..c0910a8 100644 --- a/pkg/onepassword/containers.go +++ b/pkg/onepassword/containers.go @@ -1,6 +1,8 @@ package onepassword -import corev1 "k8s.io/api/core/v1" +import ( + corev1 "k8s.io/api/core/v1" +) func AreContainersUsingSecrets(containers []corev1.Container, secrets map[string]*corev1.Secret) bool { for i := 0; i < len(containers); i++ { @@ -13,6 +15,15 @@ func AreContainersUsingSecrets(containers []corev1.Container, secrets map[string } } } + envFromVariables := containers[i].EnvFrom + for j := 0; j < len(envFromVariables); j++ { + if envFromVariables[j].SecretRef != nil { + _, ok := secrets[envFromVariables[j].SecretRef.Name] + if ok { + return true + } + } + } } return false } @@ -28,6 +39,15 @@ func AppendUpdatedContainerSecrets(containers []corev1.Container, secrets map[st } } } + envFromVariables := containers[i].EnvFrom + for j := 0; j < len(envFromVariables); j++ { + if envFromVariables[j].SecretRef != nil { + secret, ok := secrets[envFromVariables[j].SecretRef.LocalObjectReference.Name] + if ok { + updatedDeploymentSecrets[secret.Name] = secret + } + } + } } return updatedDeploymentSecrets } diff --git a/pkg/onepassword/containers_test.go b/pkg/onepassword/containers_test.go index 676c517..98dc427 100644 --- a/pkg/onepassword/containers_test.go +++ b/pkg/onepassword/containers_test.go @@ -4,9 +4,10 @@ import ( "testing" corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) -func TestAreContainersUsingSecrets(t *testing.T) { +func TestAreContainersUsingSecretsFromEnv(t *testing.T) { secretNamesToSearch := map[string]*corev1.Secret{ "onepassword-database-secret": &corev1.Secret{}, "onepassword-api-key": &corev1.Secret{}, @@ -18,7 +19,26 @@ func TestAreContainersUsingSecrets(t *testing.T) { "some_other_key", } - containers := generateContainers(containerSecretNames) + containers := generateContainersWithSecretRefsFromEnv(containerSecretNames) + + if !AreContainersUsingSecrets(containers, secretNamesToSearch) { + t.Errorf("Expected that containers were using secrets but they were not detected.") + } +} + +func TestAreContainersUsingSecretsFromEnvFrom(t *testing.T) { + secretNamesToSearch := map[string]*corev1.Secret{ + "onepassword-database-secret": {}, + "onepassword-api-key": {}, + } + + containerSecretNames := []string{ + "onepassword-database-secret", + "onepassword-api-key", + "some_other_key", + } + + containers := generateContainersWithSecretRefsFromEnvFrom(containerSecretNames) if !AreContainersUsingSecrets(containers, secretNamesToSearch) { t.Errorf("Expected that containers were using secrets but they were not detected.") @@ -27,17 +47,42 @@ func TestAreContainersUsingSecrets(t *testing.T) { func TestAreContainersNotUsingSecrets(t *testing.T) { secretNamesToSearch := map[string]*corev1.Secret{ - "onepassword-database-secret": &corev1.Secret{}, - "onepassword-api-key": &corev1.Secret{}, + "onepassword-database-secret": {}, + "onepassword-api-key": {}, } containerSecretNames := []string{ "some_other_key", } - containers := generateContainers(containerSecretNames) + containers := generateContainersWithSecretRefsFromEnv(containerSecretNames) if AreContainersUsingSecrets(containers, secretNamesToSearch) { t.Errorf("Expected that containers were not using secrets but they were detected.") } } + +func TestAppendUpdatedContainerSecretsParsesEnvFromEnv(t *testing.T) { + secretNamesToSearch := map[string]*corev1.Secret{ + "onepassword-database-secret": {}, + "onepassword-api-key": {ObjectMeta: metav1.ObjectMeta{Name: "onepassword-api-key"}}, + } + + containerSecretNames := []string{ + "onepassword-api-key", + } + + containers := generateContainersWithSecretRefsFromEnvFrom(containerSecretNames) + + //fmt.Println(containers) + updatedDeploymentSecrets := map[string]*corev1.Secret{} + updatedDeploymentSecrets = AppendUpdatedContainerSecrets(containers, secretNamesToSearch, updatedDeploymentSecrets) + + secretKeyName := "onepassword-api-key" + + //fmt.Println(updatedDeploymentSecrets) + //fmt.Println(secretNamesToSearch) + if updatedDeploymentSecrets[secretKeyName] != secretNamesToSearch[secretKeyName] { + t.Errorf("Expected that updated Secret from envfrom is found.") + } +} diff --git a/pkg/onepassword/deployments_test.go b/pkg/onepassword/deployments_test.go index d7445b1..45761fc 100644 --- a/pkg/onepassword/deployments_test.go +++ b/pkg/onepassword/deployments_test.go @@ -39,7 +39,7 @@ func TestIsDeploymentUsingSecretsUsingContainers(t *testing.T) { } deployment := &appsv1.Deployment{} - deployment.Spec.Template.Spec.Containers = generateContainers(containerSecretNames) + deployment.Spec.Template.Spec.Containers = generateContainersWithSecretRefsFromEnv(containerSecretNames) if !IsDeploymentUsingSecrets(deployment, secretNamesToSearch) { t.Errorf("Expected that deployment was using secrets but they were not detected.") } diff --git a/pkg/onepassword/object_generators_for_test.go b/pkg/onepassword/object_generators_for_test.go index 7e2f526..2392070 100644 --- a/pkg/onepassword/object_generators_for_test.go +++ b/pkg/onepassword/object_generators_for_test.go @@ -17,8 +17,7 @@ func generateVolumes(names []string) []corev1.Volume { } return volumes } - -func generateContainers(names []string) []corev1.Container { +func generateContainersWithSecretRefsFromEnv(names []string) []corev1.Container { containers := []corev1.Container{} for i := 0; i < len(names); i++ { container := corev1.Container{ @@ -40,3 +39,16 @@ func generateContainers(names []string) []corev1.Container { } return containers } + +func generateContainersWithSecretRefsFromEnvFrom(names []string) []corev1.Container { + containers := []corev1.Container{} + for i := 0; i < len(names); i++ { + container := corev1.Container{ + EnvFrom: []corev1.EnvFromSource{ + {SecretRef: &corev1.SecretEnvSource{LocalObjectReference: corev1.LocalObjectReference{Name: names[i]}}}, + }, + } + containers = append(containers, container) + } + return containers +}