AWS账户内所有Lambda访问Secrets Manager密钥遇权限问题求解
我希望AWS账户中拥有不同角色的所有Lambda函数都能访问某一Secrets Manager密钥。由于Lambda数量众多,不想给每个Lambda附加身份策略,转而尝试给该密钥添加资源策略,具体策略如下:
{ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "Service" : "lambda.amazonaws.com" }, "Action" : "secretsmanager:GetSecretValue", "Resource" : "arn:aws:secretsmanager:us-east-1:{AWS_ACCOUNT_ID}:secret:dummy-secret-46DfjO", "Condition" : { "StringEquals" : { "aws:sourceAccount" : "{AWS_ACCOUNT_ID}" } } } ] }
预期该策略允许账户内所有Lambda读取密钥,但仍收到如下错误:
ERROR | Error while trying to read an API Key from Secrets Manager: Secrets Manager read error: AccessDeniedException: User: arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/dummy-role-name is not authorized to perform: secretsmanager:GetSecretValue on resource: arn:aws:secretsmanager:us-east-1:AWS_ACCOUNT_ID:secret:dummy-secret-46DfjO because no identity-based policy allows the secretsmanager:GetSecretValue action
你的资源策略存在两个核心问题:
- 主体(Principal)设置错误:Lambda执行请求时,实际使用的是Lambda角色的STS临时身份(即
arn:aws:sts::...:assumed-role/...),而非lambda.amazonaws.com服务主体。将Service作为Principal无法匹配到实际发起请求的身份。 - 条件键限制不足:仅用
aws:sourceAccount无法精准锁定本账户的Lambda请求,需要补充条件键来验证请求来源的身份属性。
修改后的资源策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-east-1:{AWS_ACCOUNT_ID}:secret:dummy-secret-46DfjO", "Condition": { "StringEquals": { "aws:PrincipalAccount": "{AWS_ACCOUNT_ID}", "aws:SourceArn": "arn:aws:lambda:us-east-1:{AWS_ACCOUNT_ID}:function:*" } } } ] }
关键说明:
- 使用
Principal: "*"配合条件限制,避免因主体不匹配导致的权限失效 aws:PrincipalAccount确保请求发起者属于目标AWS账户aws:SourceArn限定请求仅来自本账户内的任意Lambda函数(*匹配所有Lambda资源)
额外注意:需确保Lambda的执行角色没有明确拒绝secretsmanager:GetSecretValue权限,同时账户级别的服务控制策略(SCP)未阻止该操作。
内容的提问来源于stack exchange,提问作者q_kim

