Skip to content

Commit 4467968

Browse files
committed
Implement replacing secrets in agent.download section
1 parent 172483b commit 4467968

File tree

5 files changed

+79
-24
lines changed

5 files changed

+79
-24
lines changed

internal/pkg/model/schema.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/pkg/policy/parsed_policy.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ func NewParsedPolicy(ctx context.Context, bulker bulk.Bulk, p model.Policy) (*Pa
8686
}
8787
secretKeys = append(secretKeys, keys...)
8888

89+
// Replace secrets in 'agent.download' section of policy
90+
if agentDownload, exists := p.Data.Agent["download"]; exists {
91+
if section, ok := agentDownload.(map[string]interface{}); ok {
92+
agentDownloadSecretKeys, err := secret.ProcessAgentDownloadSecrets(ctx, section, bulker)
93+
if err != nil {
94+
return nil, fmt.Errorf("error processing agent secrets: %w", err)
95+
}
96+
for _, key := range agentDownloadSecretKeys {
97+
secretKeys = append(secretKeys, "agent.download."+key)
98+
}
99+
}
100+
}
101+
89102
// We are cool and the gang
90103
pp := &ParsedPolicy{
91104
Policy: p,

internal/pkg/secret/secret.go

Lines changed: 61 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
)
1818

1919
const (
20-
FieldOutputSecrets = "secrets"
20+
FieldSecrets = "secrets"
2121
)
2222

2323
var (
@@ -165,63 +165,63 @@ func replaceSliceRef(arr []any, secrets map[string]string) ([]any, []string) {
165165
return result, keys
166166
}
167167

168-
type OutputSecret struct {
168+
type Secret struct {
169169
Path []string
170170
ID string
171171
}
172172

173-
func getSecretIDAndPath(secret smap.Map) ([]OutputSecret, error) {
174-
outputSecrets := make([]OutputSecret, 0)
173+
func getSecretIDAndPath(secret smap.Map) ([]Secret, error) {
174+
secrets := make([]Secret, 0)
175175

176176
secretID := secret.GetString("id")
177177
if secretID != "" {
178-
outputSecrets = append(outputSecrets, OutputSecret{
178+
secrets = append(secrets, Secret{
179179
Path: make([]string, 0),
180180
ID: secretID,
181181
})
182182

183-
return outputSecrets, nil
183+
return secrets, nil
184184
}
185185

186186
for secretKey := range secret {
187-
newOutputSecrets, err := getSecretIDAndPath(secret.GetMap(secretKey))
187+
newSecrets, err := getSecretIDAndPath(secret.GetMap(secretKey))
188188
if err != nil {
189189
return nil, err
190190
}
191191

192-
for _, secret := range newOutputSecrets {
193-
path := append([]string{secretKey}, secret.Path...)
194-
outputSecrets = append(outputSecrets, OutputSecret{
192+
for _, newSecret := range newSecrets {
193+
path := append([]string{secretKey}, newSecret.Path...)
194+
secrets = append(secrets, Secret{
195195
Path: path,
196-
ID: secret.ID,
196+
ID: newSecret.ID,
197197
})
198198
}
199199
}
200200

201-
return outputSecrets, nil
201+
return secrets, nil
202202
}
203203

204-
func setSecretPath(output smap.Map, secretValue string, secretPaths []string) error {
204+
func setSecretPath(section smap.Map, secretValue string, secretPaths []string) error {
205205
// Break the recursion
206206
if len(secretPaths) == 1 {
207-
output[secretPaths[0]] = secretValue
207+
section[secretPaths[0]] = secretValue
208208

209209
return nil
210210
}
211211
path, secretPaths := secretPaths[0], secretPaths[1:]
212212

213-
if output.GetMap(path) == nil {
214-
output[path] = make(map[string]interface{})
213+
if section.GetMap(path) == nil {
214+
section[path] = make(map[string]interface{})
215215
}
216216

217-
return setSecretPath(output.GetMap(path), secretValue, secretPaths)
217+
return setSecretPath(section.GetMap(path), secretValue, secretPaths)
218218
}
219219

220220
// Read secret from output and mutate output with secret value
221221
func ProcessOutputSecret(ctx context.Context, output smap.Map, bulker bulk.Bulk) ([]string, error) {
222-
secrets := output.GetMap(FieldOutputSecrets)
222+
secrets := output.GetMap(FieldSecrets)
223223

224-
delete(output, FieldOutputSecrets)
224+
delete(output, FieldSecrets)
225225
secretReferences := make([]model.SecretReferencesItems, 0)
226226
outputSecrets, err := getSecretIDAndPath(secrets)
227227
keys := make([]string, 0, len(outputSecrets))
@@ -259,6 +259,48 @@ func ProcessOutputSecret(ctx context.Context, output smap.Map, bulker bulk.Bulk)
259259
return keys, nil
260260
}
261261

262+
// ProcessAgentDownloadSecrets reads and replaces secrets in the agent.download section of the policy
263+
func ProcessAgentDownloadSecrets(ctx context.Context, agentDownload smap.Map, bulker bulk.Bulk) ([]string, error) {
264+
secrets := agentDownload.GetMap(FieldSecrets)
265+
delete(agentDownload, FieldSecrets)
266+
267+
secretReferences := make([]model.SecretReferencesItems, 0)
268+
agentDownloadSecrets, err := getSecretIDAndPath(secrets)
269+
keys := make([]string, 0, len(agentDownloadSecrets))
270+
if err != nil {
271+
return nil, err
272+
}
273+
274+
for _, secret := range agentDownloadSecrets {
275+
secretReferences = append(secretReferences, model.SecretReferencesItems{
276+
ID: secret.ID,
277+
})
278+
}
279+
if len(secretReferences) == 0 {
280+
return nil, nil
281+
}
282+
secretValues, err := GetSecretValues(ctx, secretReferences, bulker)
283+
if err != nil {
284+
return nil, err
285+
}
286+
for _, secret := range agentDownloadSecrets {
287+
var key string
288+
for _, p := range secret.Path {
289+
if key == "" {
290+
key = p
291+
continue
292+
}
293+
key = key + "." + p
294+
}
295+
keys = append(keys, key)
296+
err = setSecretPath(agentDownload, secretValues[secret.ID], secret.Path)
297+
if err != nil {
298+
return nil, err
299+
}
300+
}
301+
return keys, nil
302+
}
303+
262304
// replaceStringRef replaces values matching a secret ref regex, e.g. $co.elastic.secret{<secret ref>} -> <secret value>
263305
// and does this for multiple matches
264306
// returns the resulting string value, and if any replacements were made

internal/pkg/server/namespaces_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func Test_Agent_Namespace_test1(t *testing.T) {
171171
},
172172
OutputPermissions: json.RawMessage(`{"default": {} }`),
173173
Inputs: []map[string]interface{}{},
174-
Agent: json.RawMessage(`{"monitoring": {"use_output":"default"}}`),
174+
Agent: map[string]interface{}{"monitoring": {"use_output": "default"}},
175175
}
176176

177177
_, err = dl.CreatePolicy(ctx, srv.bulker, model.Policy{

internal/pkg/server/remote_es_output_integration_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func Test_Agent_Remote_ES_Output(t *testing.T) {
165165
},
166166
OutputPermissions: json.RawMessage(`{"default": {}, "remoteES": {}}`),
167167
Inputs: []map[string]interface{}{},
168-
Agent: json.RawMessage(`{"monitoring": {"use_output":"remoteES"}}`),
168+
Agent: map[string]interface{}{"monitoring": {"use_output": "remoteES"}},
169169
}
170170

171171
_, err = dl.CreatePolicy(ctx, srv.bulker, model.Policy{
@@ -319,7 +319,7 @@ func Test_Agent_Remote_ES_Output_ForceUnenroll(t *testing.T) {
319319
},
320320
OutputPermissions: json.RawMessage(`{"default": {}, "remoteES": {}}`),
321321
Inputs: []map[string]interface{}{},
322-
Agent: json.RawMessage(`{"monitoring": {"use_output":"remoteES"}}`),
322+
Agent: map[string]interface{}{"monitoring": {"use_output": "remoteES"}},
323323
}
324324

325325
_, err = dl.CreatePolicy(ctx, srv.bulker, model.Policy{
@@ -440,7 +440,7 @@ func Test_Agent_Remote_ES_Output_Unenroll(t *testing.T) {
440440
},
441441
OutputPermissions: json.RawMessage(`{"default": {}, "remoteES": {}}`),
442442
Inputs: []map[string]interface{}{},
443-
Agent: json.RawMessage(`{"monitoring": {"use_output":"remoteES"}}`),
443+
Agent: map[string]interface{}{"monitoring": {"use_output": "remoteES"}},
444444
}
445445

446446
_, err = dl.CreatePolicy(ctx, srv.bulker, model.Policy{

0 commit comments

Comments
 (0)