Skip to content

Commit 44856ee

Browse files
committed
add template func encrypteAesWithVault and strengthen security for senstive secrets
1 parent c8642cc commit 44856ee

File tree

5 files changed

+95
-6
lines changed

5 files changed

+95
-6
lines changed

biz/impl/runtime.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
package impl
99

1010
import (
11+
"github.com/mohae/deepcopy"
1112
"github.com/upcmd/up/model/core"
1213
"github.com/upcmd/up/model/stack"
1314
"github.com/upcmd/up/utils"
1415
u "github.com/upcmd/up/utils"
16+
"strings"
1517
)
1618

1719
var (
@@ -114,6 +116,20 @@ func ConfigRuntime() *utils.UpConfig {
114116
return TaskerRuntime().Tasker.Config
115117
}
116118

119+
func debugVault() {
120+
u.Ppmsg("Vault", GetVault())
121+
}
122+
123+
func secureCache(cache *core.Cache) *core.Cache {
124+
tmpCache := deepcopy.Copy(*cache).(core.Cache)
125+
for k, _ := range tmpCache {
126+
if strings.HasPrefix(k, "secure_") {
127+
tmpCache.Delete(k)
128+
}
129+
}
130+
return &tmpCache
131+
}
132+
117133
func debugVars() {
118134
u.PlnBlue("-debug vars-")
119135

biz/impl/step.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (step *Step) getRuntimeExecVars(fromBlock bool) *core.Cache {
112112
}
113113
}
114114
u.Pfvvvv("current exec runtime vars:")
115-
u.Ppmsgvvvv(resultVars)
115+
u.Ppmsgvvvv(secureCache(resultVars))
116116

117117
StepRuntime().ContextVars = resultVars
118118
//so far the execvars includes: scope vars + scope dvars + global runtime vars + task vars
@@ -123,7 +123,7 @@ func (step *Step) getRuntimeExecVars(fromBlock bool) *core.Cache {
123123
mergo.Merge(resultVars, varsWithDvars, mergo.WithOverride)
124124

125125
//so far the resultVars includes: the local vars + dvars rendered using execvars
126-
u.Ppmsgvvvhint(u.Spf("%s: final context exec vars:", ConfigRuntime().ModuleName), resultVars)
126+
u.Ppmsgvvvhint(u.Spf("%s: final context exec vars:", ConfigRuntime().ModuleName), secureCache(resultVars))
127127
//debugVars()
128128
return resultVars
129129
}

biz/impl/tasker.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ func (t *Tasker) loadInstancesContext() {
193193
func() {
194194
u.Pvvvv("---------group vars----------")
195195
for k, v := range t.ExpandedContext {
196-
u.Pfvvvv("%s: %s", k, u.Sppmsg(*v))
196+
u.Pfvvvv("%s: %s", k, u.Sppmsg(secureCache(v)))
197197
}
198198
u.Pfvvvv("groups members:%s\n", t.GroupMembersList)
199199

@@ -212,7 +212,7 @@ func (t *Tasker) MergeRuntimeGlobalDvars() {
212212
}
213213

214214
t.RuntimeVarsAndDvarsMerged = &mergedVars
215-
u.Ppmsgvvvvhint("-------runtime global final merged with dvars-------", mergedVars)
215+
u.Ppmsgvvvvhint("-------runtime global final merged with dvars-------", secureCache(&mergedVars))
216216
}
217217

218218
func (t *Tasker) loadExecProfileEnvVars() {
@@ -377,8 +377,8 @@ func (t *Tasker) MergeUptoRuntimeGlobalVars() {
377377
mergo.Merge(&runtimevars, *t.RuntimeGlobalVars, mergo.WithOverride)
378378

379379
u.Pfvvvv("merged[ %s ] runtime vars:", t.InstanceName)
380-
u.Ppmsgvvvv(runtimevars)
381-
u.Dvvvvv(runtimevars)
380+
u.Ppmsgvvvv(secureCache(&runtimevars))
381+
u.Dvvvvv(secureCache(&runtimevars))
382382

383383
t.RuntimeVarsMerged = &runtimevars
384384
}

biz/impl/template.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,22 @@ func FuncMapInit() {
8080
u.PpmsgvvvvvHigh("ymlToObj", obj)
8181
return obj
8282
},
83+
//use the encryption key stored in vault instead of plain value in general cache
84+
"encrypteAesWithVault": func(enckeyName string, plain string) string {
85+
var encryptionkey string
86+
if enckeyName != "" {
87+
//use vault as first priority
88+
opt := GetVault().Get(enckeyName)
89+
if opt == nil {
90+
opt = (StepRuntime().ContextVars).Get(enckeyName)
91+
}
92+
encryptionkey = opt.(string)
93+
}
94+
95+
encrypted := Render(u.Spf(`{{encryptAES "%s" "%s"}}`, encryptionkey, plain), "")
96+
97+
return encrypted
98+
},
8399
//regObj will keep the golang object intact and register it to cache
84100
//same effect of: '{{ func_return_a_obj arg | objToYml|ymlToObj|reg "instances" }}'
85101
"regObj": func(varname string, obj interface{}) interface{} {

tests/functests/c0202.yml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
doc_meta: |
2+
folder: security
3+
title: encrypteAesWithVault template func to retrieve and encrypt
4+
head: |
5+
Add a template func encrypteAesWithVault to retrieve the encryption key stored in vault and encypt based on the key
6+
7+
sections:
8+
- title: Demo
9+
log: yes
10+
11+
scopes:
12+
13+
- name: nonprod
14+
members:
15+
- dev
16+
dvars:
17+
- name: enc_key
18+
value: my_enc_key
19+
flags:
20+
- secret
21+
22+
tasks:
23+
-
24+
name: task
25+
task:
26+
-
27+
func: cmd
28+
dvars:
29+
30+
- name: value_encrypted
31+
desc: |
32+
encrypteAesWithVault will use the encryption key named enc_key stored in vault to encrypt
33+
it falls back to the normal cached store to get the enc_key if it does not exist
34+
value: '{{ "ENV_AAA" | encrypteAesWithVault "enc_key" }}'
35+
flags:
36+
- vvvv
37+
- taskScope
38+
39+
- name: ENV_AAA
40+
value: '{{.value_encrypted}}'
41+
flags:
42+
- secure
43+
44+
do:
45+
- name: print
46+
cmd: |
47+
var: {{.ENV_AAA}}
48+
decrypted secure var: {{.secure_ENV_AAA}}
49+
-
50+
name: inspect
51+
desc: the vars in caller after invoking module task
52+
cmd:
53+
- exec_vars
54+
- exec_base_vars
55+
- exec_base_env_vars_configured
56+
- exec_env_vars_configured
57+
- debug_vars

0 commit comments

Comments
 (0)