@@ -70,6 +70,8 @@ type templateData struct {
70
70
MonitoredAppName string
71
71
PrometheusServerName string
72
72
VaultPkiCommonName string
73
+ VaultRole string
74
+ VaultServiceAccountName string
73
75
}
74
76
75
77
const (
@@ -128,9 +130,12 @@ metadata:
128
130
spec:
129
131
hashiCorpVault:
130
132
address: http://vault.{{.VaultNamespace}}:8200
131
- authentication: token
133
+ authentication: {{.HashiCorpAuthentication}}
134
+ role: {{.VaultRole}}
135
+ mount: kubernetes
132
136
credential:
133
137
token: {{.HashiCorpToken}}
138
+ serviceAccountName: {{.VaultServiceAccountName}}
134
139
secrets:
135
140
- parameter: connection
136
141
key: connectionString
@@ -413,6 +418,13 @@ spec:
413
418
pkiPolicyTemplate = `path "pki*" {
414
419
capabilities = [ "create", "read", "update", "delete", "list", "sudo" ]
415
420
}`
421
+
422
+ secretReadPolicyTemplate = `path "secret/data/keda" {
423
+ capabilities = ["read"]
424
+ }
425
+ path "secret/metadata/keda" {
426
+ capabilities = ["read", "list"]
427
+ }`
416
428
)
417
429
418
430
func TestPkiSecretsEngine (t * testing.T ) {
@@ -432,7 +444,7 @@ func TestPkiSecretsEngine(t *testing.T) {
432
444
// Create kubernetes resources
433
445
kc := GetKubernetesClient (t )
434
446
useKubernetesAuth := test .authentication == "kubernetes"
435
- hashiCorpToken , promPkiData := setupHashiCorpVault (t , kc , 2 , useKubernetesAuth , true )
447
+ hashiCorpToken , promPkiData := setupHashiCorpVault (t , kc , 2 , useKubernetesAuth , true , false )
436
448
prometheus .Install (t , kc , prometheusServerName , testNamespace , promPkiData )
437
449
438
450
// Create kubernetes resources for testing
@@ -460,16 +472,29 @@ func TestSecretsEngine(t *testing.T) {
460
472
name string
461
473
vaultEngineVersion uint
462
474
vaultSecretPath string
475
+ useKubernetesAuth bool
476
+ useDelegatesSAAuth bool
463
477
}{
464
478
{
465
479
name : "vault kv engine v1" ,
466
480
vaultEngineVersion : 1 ,
467
481
vaultSecretPath : "secret/keda" ,
482
+ useKubernetesAuth : false ,
483
+ useDelegatesSAAuth : false ,
484
+ },
485
+ {
486
+ name : "vault kv engine v2" ,
487
+ vaultEngineVersion : 2 ,
488
+ vaultSecretPath : "secret/data/keda" ,
489
+ useKubernetesAuth : false ,
490
+ useDelegatesSAAuth : false ,
468
491
},
469
492
{
470
493
name : "vault kv engine v2" ,
471
494
vaultEngineVersion : 2 ,
472
495
vaultSecretPath : "secret/data/keda" ,
496
+ useKubernetesAuth : true ,
497
+ useDelegatesSAAuth : true ,
473
498
},
474
499
}
475
500
@@ -480,7 +505,7 @@ func TestSecretsEngine(t *testing.T) {
480
505
data , postgreSQLtemplates := getPostgreSQLTemplateData ()
481
506
482
507
CreateKubernetesResources (t , kc , testNamespace , data , postgreSQLtemplates )
483
- hashiCorpToken , _ := setupHashiCorpVault (t , kc , test .vaultEngineVersion , false , false )
508
+ hashiCorpToken , _ := setupHashiCorpVault (t , kc , test .vaultEngineVersion , test . useKubernetesAuth , false , test . useDelegatesSAAuth )
484
509
485
510
assert .True (t , WaitForStatefulsetReplicaReadyCount (t , kc , postgreSQLStatefulSetName , testNamespace , 1 , 60 , 3 ),
486
511
"replica count should be %d after 3 minutes" , 1 )
@@ -493,8 +518,19 @@ func TestSecretsEngine(t *testing.T) {
493
518
494
519
// Create kubernetes resources for testing
495
520
data , templates := getTemplateData ()
496
- data .HashiCorpToken = RemoveANSI (hashiCorpToken )
497
521
data .VaultSecretPath = test .vaultSecretPath
522
+ data .VaultRole = "keda"
523
+ if test .useKubernetesAuth {
524
+ data .HashiCorpAuthentication = "kubernetes"
525
+ } else {
526
+ data .HashiCorpAuthentication = "token"
527
+ data .HashiCorpToken = RemoveANSI (hashiCorpToken )
528
+ }
529
+
530
+ if test .useDelegatesSAAuth {
531
+ data .VaultRole = "vault-delegated-sa"
532
+ data .VaultServiceAccountName = "default"
533
+ }
498
534
499
535
KubectlApplyMultipleWithTemplate (t , data , templates )
500
536
assert .True (t , WaitForDeploymentReplicaReadyCount (t , kc , deploymentName , testNamespace , minReplicaCount , 60 , 3 ),
@@ -548,7 +584,7 @@ func setupHashiCorpVaultPki(t *testing.T, podName string, nameSpace string) *pro
548
584
return & pkiData
549
585
}
550
586
551
- func setupHashiCorpVault (t * testing.T , kc * kubernetes.Clientset , kvVersion uint , useKubernetesAuth , pki bool ) (string , * prometheus.VaultPkiData ) {
587
+ func setupHashiCorpVault (t * testing.T , kc * kubernetes.Clientset , kvVersion uint , useKubernetesAuth , pki , delegatedAuth bool ) (string , * prometheus.VaultPkiData ) {
552
588
CreateNamespace (t , kc , vaultNamespace )
553
589
554
590
_ , err := ExecuteCommand ("helm repo add hashicorp https://helm.releases.hashicorp.com" )
@@ -572,7 +608,7 @@ func setupHashiCorpVault(t *testing.T, kc *kubernetes.Clientset, kvVersion uint,
572
608
// Enable Kubernetes auth
573
609
if useKubernetesAuth {
574
610
if pki {
575
- remoteFile := "/tmp/policy .hcl"
611
+ remoteFile := "/tmp/pki_policy .hcl"
576
612
KubectlCopyToPod (t , pkiPolicyTemplate , remoteFile , podName , vaultNamespace )
577
613
assert .NoErrorf (t , err , "cannot create policy file in hashicorp vault - %s" , err )
578
614
_ , _ , err = ExecCommandOnSpecificPod (t , podName , vaultNamespace , fmt .Sprintf ("vault policy write pkiPolicy %s" , remoteFile ))
@@ -584,9 +620,21 @@ func setupHashiCorpVault(t *testing.T, kc *kubernetes.Clientset, kvVersion uint,
584
620
assert .NoErrorf (t , err , "cannot set kubernetes host in hashicorp vault - %s" , err )
585
621
_ , _ , err = ExecCommandOnSpecificPod (t , podName , vaultNamespace , "vault write auth/kubernetes/role/keda bound_service_account_names=keda-operator bound_service_account_namespaces=keda policies=pkiPolicy ttl=1h" )
586
622
assert .NoErrorf (t , err , "cannot cerate keda role in hashicorp vault - %s" , err )
623
+ if delegatedAuth {
624
+ remoteFile := "/tmp/secret_read_policy.hcl"
625
+ KubectlCopyToPod (t , secretReadPolicyTemplate , remoteFile , podName , vaultNamespace )
626
+ assert .NoErrorf (t , err , "cannot create policy file in hashicorp vault - %s" , err )
627
+ _ , _ , err = ExecCommandOnSpecificPod (t , podName , vaultNamespace , fmt .Sprintf ("vault policy write secretReadPolicy %s" , remoteFile ))
628
+ assert .NoErrorf (t , err , "cannot create policy in hashicorp vault - %s" , err )
629
+
630
+ _ , _ , err = ExecCommandOnSpecificPod (t , podName , vaultNamespace , fmt .Sprintf ("vault write auth/kubernetes/role/vault-delegated-sa bound_service_account_names=default bound_service_account_namespaces=%s policies=secretReadPolicy ttl=1h" , testNamespace ))
631
+ assert .NoErrorf (t , err , "cannot cerate keda role in hashicorp vault - %s" , err )
632
+ }
587
633
}
634
+
588
635
// Create kv secret
589
636
if ! pki {
637
+ t .Logf ("added secret" )
590
638
_ , _ , err = ExecCommandOnSpecificPod (t , podName , vaultNamespace , fmt .Sprintf ("vault kv put secret/keda connectionString=%s" , postgreSQLConnectionString ))
591
639
assert .NoErrorf (t , err , "cannot put connection string in hashicorp vault - %s" , err )
592
640
}
0 commit comments