Skip to content

Commit

Permalink
backport of commit 8fa5605 (hashicorp#20178)
Browse files Browse the repository at this point in the history
Co-authored-by: Kyle Schochenmaier <kschoche@gmail.com>
  • Loading branch information
hc-github-team-secure-vault-core and kschoche committed Apr 14, 2023
1 parent 5846865 commit 36559a7
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 19 deletions.
64 changes: 45 additions & 19 deletions builtin/logical/aws/secret_access_keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,15 +155,28 @@ func (b *backend) getFederationToken(ctx context.Context, s logical.Storage,
return logical.ErrorResponse("Error generating STS keys: %s", err), awsutil.CheckAWSError(err)
}

// STS credentials cannot be revoked so do not create a lease
return &logical.Response{
Data: map[string]interface{}{
"access_key": *tokenResp.Credentials.AccessKeyId,
"secret_key": *tokenResp.Credentials.SecretAccessKey,
"security_token": *tokenResp.Credentials.SessionToken,
"ttl": uint64(tokenResp.Credentials.Expiration.Sub(time.Now()).Seconds()),
},
}, nil
// While STS credentials cannot be revoked/renewed, we will still create a lease since users are
// relying on a non-zero `lease_duration` in order to manage their lease lifecycles manually.
//
ttl := tokenResp.Credentials.Expiration.Sub(time.Now())
resp := b.Secret(secretAccessKeyType).Response(map[string]interface{}{
"access_key": *tokenResp.Credentials.AccessKeyId,
"secret_key": *tokenResp.Credentials.SecretAccessKey,
"security_token": *tokenResp.Credentials.SessionToken,
"ttl": uint64(ttl.Seconds()),
}, map[string]interface{}{
"username": username,
"policy": policy,
"is_sts": true,
})

// Set the secret TTL to appropriately match the expiration of the token
resp.Secret.TTL = ttl

// STS are purposefully short-lived and aren't renewable
resp.Secret.Renewable = false

return resp, nil
}

func (b *backend) assumeRole(ctx context.Context, s logical.Storage,
Expand Down Expand Up @@ -230,16 +243,29 @@ func (b *backend) assumeRole(ctx context.Context, s logical.Storage,
return logical.ErrorResponse("Error assuming role: %s", err), awsutil.CheckAWSError(err)
}

// STS credentials cannot be revoked so do not create a lease
return &logical.Response{
Data: map[string]interface{}{
"access_key": *tokenResp.Credentials.AccessKeyId,
"secret_key": *tokenResp.Credentials.SecretAccessKey,
"security_token": *tokenResp.Credentials.SessionToken,
"arn": *tokenResp.AssumedRoleUser.Arn,
"ttl": uint64(tokenResp.Credentials.Expiration.Sub(time.Now()).Seconds()),
},
}, nil
// While STS credentials cannot be revoked/renewed, we will still create a lease since users are
// relying on a non-zero `lease_duration` in order to manage their lease lifecycles manually.
//
ttl := tokenResp.Credentials.Expiration.Sub(time.Now())
resp := b.Secret(secretAccessKeyType).Response(map[string]interface{}{
"access_key": *tokenResp.Credentials.AccessKeyId,
"secret_key": *tokenResp.Credentials.SecretAccessKey,
"security_token": *tokenResp.Credentials.SessionToken,
"arn": *tokenResp.AssumedRoleUser.Arn,
"ttl": uint64(ttl.Seconds()),
}, map[string]interface{}{
"username": roleSessionName,
"policy": roleArn,
"is_sts": true,
})

// Set the secret TTL to appropriately match the expiration of the token
resp.Secret.TTL = ttl

// STS are purposefully short-lived and aren't renewable
resp.Secret.Renewable = false

return resp, nil
}

func readConfig(ctx context.Context, storage logical.Storage) (rootConfig, error) {
Expand Down
3 changes: 3 additions & 0 deletions changelog/20034.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note: bug
secrets/aws: Revert changes that removed the lease on STS credentials, while leaving the new ttl field in place.
```

0 comments on commit 36559a7

Please sign in to comment.