Skip to content

Commit 9ed263c

Browse files
authored
fix(secretsmanager): SecretRotation for secret imported by name has incorrect permissions (#18567)
The SecretRotation class currently always grants permissions to `secret.secretArn`; the correct value actually should either by the `secretFullArn` or `secretPartialArn` plus a suffix. This logic is currently covered by `SecretBase.arnForPolicies`. I opted to copy the logic rather than expose the member on both `SecretBase` and `ISecret`, but if more of these cases rise up, that may be the right solution. fixes #18424 ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent db0660e commit 9ed263c

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

packages/@aws-cdk/aws-secretsmanager/lib/rotation-schedule.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export class RotationSchedule extends Resource {
9292
'secretsmanager:PutSecretValue',
9393
'secretsmanager:UpdateSecretVersionStage',
9494
],
95-
resources: [props.secret.secretArn],
95+
resources: [props.secret.secretFullArn ? props.secret.secretFullArn : `${props.secret.secretArn}-??????`],
9696
}),
9797
);
9898
props.rotationLambda.addToRolePolicy(

packages/@aws-cdk/aws-secretsmanager/test/rotation-schedule.test.ts

+51
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,57 @@ test('assign permissions for rotation schedule with a rotation Lambda', () => {
101101
});
102102
});
103103

104+
test('grants correct permissions for secret imported by name', () => {
105+
// GIVEN
106+
const secret = secretsmanager.Secret.fromSecretNameV2(stack, 'Secret', 'mySecretName');
107+
const rotationLambda = new lambda.Function(stack, 'Lambda', {
108+
runtime: lambda.Runtime.NODEJS_10_X,
109+
code: lambda.Code.fromInline('export.handler = event => event;'),
110+
handler: 'index.handler',
111+
});
112+
113+
// WHEN
114+
new secretsmanager.RotationSchedule(stack, 'RotationSchedule', {
115+
secret,
116+
rotationLambda,
117+
});
118+
119+
// THEN
120+
Template.fromStack(stack).hasResourceProperties('AWS::IAM::Policy', {
121+
PolicyDocument: {
122+
Statement: Match.arrayWith([
123+
{
124+
Action: [
125+
'secretsmanager:DescribeSecret',
126+
'secretsmanager:GetSecretValue',
127+
'secretsmanager:PutSecretValue',
128+
'secretsmanager:UpdateSecretVersionStage',
129+
],
130+
Effect: 'Allow',
131+
Resource: {
132+
'Fn::Join': ['', [
133+
'arn:',
134+
{ Ref: 'AWS::Partition' },
135+
':secretsmanager:',
136+
{ Ref: 'AWS::Region' },
137+
':',
138+
{ Ref: 'AWS::AccountId' },
139+
':secret:mySecretName-??????',
140+
]],
141+
},
142+
},
143+
]),
144+
Version: '2012-10-17',
145+
},
146+
PolicyName: 'LambdaServiceRoleDefaultPolicyDAE46E21',
147+
Roles: [
148+
{
149+
Ref: 'LambdaServiceRoleA8ED4D3B',
150+
},
151+
],
152+
});
153+
});
154+
104155
test('assign kms permissions for rotation schedule with a rotation Lambda', () => {
105156
// GIVEN
106157
const encryptionKey = new kms.Key(stack, 'Key');

0 commit comments

Comments
 (0)