Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose secret_id_accessor as WrappedAccessor when wrapping secret-id creation. #12425

Merged
merged 6 commits into from Sep 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions changelog/12425.txt
@@ -0,0 +1,3 @@
```release-note:improvement
auth/approle: expose secret_id_accessor as WrappedAccessor when creating wrapped secret-id.
```
4 changes: 2 additions & 2 deletions sdk/helper/wrapping/wrapinfo.go
Expand Up @@ -17,8 +17,8 @@ type ResponseWrapInfo struct {
// expected expiration.
CreationTime time.Time `json:"creation_time" structs:"creation_time" mapstructure:"creation_time" sentinel:""`

// If the contained response is the output of a token creation call, the
// created token's accessor will be accessible here
// If the contained response is the output of a token or approle secret-id creation call, the
// created token's/secret-id's accessor will be accessible here
WrappedAccessor string `json:"wrapped_accessor" structs:"wrapped_accessor" mapstructure:"wrapped_accessor" sentinel:""`

// WrappedEntityID is the entity identifier of the caller who initiated the
Expand Down
121 changes: 121 additions & 0 deletions vault/external_tests/approle/wrapped_secretid_test.go
@@ -0,0 +1,121 @@
package approle

import (
"testing"

log "github.com/hashicorp/go-hclog"
"github.com/hashicorp/vault/api"
credAppRole "github.com/hashicorp/vault/builtin/credential/approle"
vaulthttp "github.com/hashicorp/vault/http"
"github.com/hashicorp/vault/sdk/logical"
"github.com/hashicorp/vault/vault"
"github.com/stretchr/testify/require"
)

func TestApproleSecretId_Wrapped(t *testing.T) {

var err error
coreConfig := &vault.CoreConfig{
DisableMlock: true,
DisableCache: true,
Logger: log.NewNullLogger(),
CredentialBackends: map[string]logical.Factory{
"approle": credAppRole.Factory,
},
}

cluster := vault.NewTestCluster(t, coreConfig, &vault.TestClusterOptions{
HandlerFunc: vaulthttp.Handler,
})

cluster.Start()
defer cluster.Cleanup()

cores := cluster.Cores

vault.TestWaitActive(t, cores[0].Core)

client := cores[0].Client
client.SetToken(cluster.RootToken)

err = client.Sys().EnableAuthWithOptions("approle", &api.EnableAuthOptions{
Type: "approle",
})
if err != nil {
t.Fatal(err)
}

_, err = client.Logical().Write("auth/approle/role/test-role-1", map[string]interface{}{
"name": "test-role-1",
})
require.NoError(t, err)

client.SetWrappingLookupFunc(func(operation, path string) string {
return "5m"
})

resp, err := client.Logical().Write("/auth/approle/role/test-role-1/secret-id", map[string]interface{}{})
require.NoError(t, err)

wrappedAccessor := resp.WrapInfo.WrappedAccessor
wrappingToken := resp.WrapInfo.Token

client.SetWrappingLookupFunc(func(operation, path string) string {
return api.DefaultWrappingLookupFunc(operation, path)
})

unwrappedSecretid, err := client.Logical().Unwrap(wrappingToken)
unwrappedAccessor := unwrappedSecretid.Data["secret_id_accessor"].(string)

if wrappedAccessor != unwrappedAccessor {
t.Fatalf("Expected wrappedAccessor (%v) to match wrapped secret_id_accessor (%v)", wrappedAccessor, unwrappedAccessor)
}

}

func TestApproleSecretId_NotWrapped(t *testing.T) {

var err error
coreConfig := &vault.CoreConfig{
DisableMlock: true,
DisableCache: true,
Logger: log.NewNullLogger(),
CredentialBackends: map[string]logical.Factory{
"approle": credAppRole.Factory,
},
}

cluster := vault.NewTestCluster(t, coreConfig, &vault.TestClusterOptions{
HandlerFunc: vaulthttp.Handler,
})

cluster.Start()
defer cluster.Cleanup()

cores := cluster.Cores

vault.TestWaitActive(t, cores[0].Core)

client := cores[0].Client
client.SetToken(cluster.RootToken)

err = client.Sys().EnableAuthWithOptions("approle", &api.EnableAuthOptions{
Type: "approle",
})
if err != nil {
t.Fatal(err)
}

_, err = client.Logical().Write("auth/approle/role/test-role-1", map[string]interface{}{
"name": "test-role-1",
})
require.NoError(t, err)

resp, err := client.Logical().Write("/auth/approle/role/test-role-1/secret-id", map[string]interface{}{})
require.NoError(t, err)

if resp.WrapInfo != nil && resp.WrapInfo.WrappedAccessor != "" {
t.Fatalf("WrappedAccessor unexpectedly set")
pmmukh marked this conversation as resolved.
Show resolved Hide resolved
}

}
5 changes: 5 additions & 0 deletions vault/wrapping.go
Expand Up @@ -184,6 +184,11 @@ DONELISTHANDLING:
resp.WrapInfo.WrappedAccessor = resp.Auth.Accessor
}

// Store the accessor of the approle secret in WrappedAccessor
if secretIdAccessor, ok := resp.Data["secret_id_accessor"]; ok && resp.Auth == nil && req.MountType == "approle" {
resp.WrapInfo.WrappedAccessor = secretIdAccessor.(string)
}

switch resp.WrapInfo.Format {
case "jwt":
// Create the JWT
Expand Down