为特定AWS帐户中的所有lambda函数在秘密管理器中允许一个秘密



我想有一个秘密,可以由AWS帐户中具有不同角色的所有lambda访问。一种选择是附加一个允许访问所有lambdas的秘密的策略,但是考虑到我们有大量的lambdas,我想知道我是否可以用秘密管理器中的资源权限做相反的事情。

我已将以下策略附加到secret。

{
"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}"
}
}
} ]
}

我希望下面的策略允许读取AWS_ACCOUT_ID中的所有lambdas,但我仍然得到以下错误:

ERROR |尝试从秘密管理器读取API Key时出错:秘密管理器读取错误:AccessDeniedException: User: arn:aws:sts::AWS_ACCOUNT_ID:假设-role/dummy-role-name未被授权执行:secretsmanager: GetSecretValue on resource: arn:aws:secretsmanager:us-east-1:AWS_ACCOUNT_ID:secret:dummy-secret-46DfjO因为没有基于身份的策略允许secretsmanager:GetSecretValue操作

我在这里错过了什么?

Lambda函数利用IAM执行角色(dummy-role-name)。这意味着当根据基于资源的秘密策略评估权限时,不存在服务主体(lambda.amazonaws.com),而是存在假定角色会话主体。

如文档中所述,该主体的语法为:

Principal": {" aws ": "arn:aws:sts:: aws -account- id: assumption -role/role-name/role-session-name"}

其中role-session-name对应lambda函数的名称。

所以你的基于资源的策略应该是:

{
"Version" : "2012-10-17",
"Statement" : [ {
"Effect" : "Allow",
"Principal": { 
"AWS": "arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/dummy-role-name/role-session-name" 
},
"Action" : "secretsmanager:GetSecretValue",
"Resource" : "arn:aws:secretsmanager:us-east-1:{AWS_ACCOUNT_ID}:secret:dummy-secret-46DfjO"
} ]
}

既然您提到您希望多个lambda能够从这个secret中读取,那么您必须更改策略以允许从其他lambda函数中检索secret。


或者,您可以完全抛弃基于资源的策略,并利用基于身份的策略。这将要求您修改dummy-role-name角色,以包含允许secretsmanager:GetSecretValue操作的策略。

如果您有许多lambda函数,这可能是一个更好的解决方案,因为您可以让每个lambda函数具有自己的角色和自己的细粒度权限。这比为所有lambda管理一个基于资源的策略要容易得多。

你可以在这里阅读更多关于基于身份和基于资源的策略的区别:https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html