我正在尝试使用我的存储桶策略中的NotPrincipal元素明确拒绝访问我的s3存储桶,同时将访问存储桶的特定lambda列入白名单。我在NotPrincipal元素中为lambda角色指定了角色ARN并假设角色ARN:
“arn:aws:iam :: {Account ID}:role / service-role / {Lambda role name}”,
“arn:aws:sts :: {Account ID}:assume-role / {Lambda role name} / {role session name}”
本文档解释了假定角色ARN的结构: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids
我似乎无法让ARN的假定角色正确。存储桶策略有效,但似乎我可以为角色会话名称(假定角色ARN的最后一部分)提供任何内容,并且ARN被认为是有效的。当Lambda或其他服务承担服务角色时,AWS将此角色会话名称设置为什么?是否可以列出角色的活动会话或列出假定角色ARN?我目前正在使用角色会话名称的Lambda函数名称,但这不起作用(Lambda仍然无法访问存储桶)。
由于我无法在NotPrincipal元素中使用通配符,因此一旦它担任角色,我需要Lambda的完整假定角色ARN。
更新
我尝试使用两个条件来拒绝所有ARN与Lambda角色或假定角色的ARN不匹配的请求。使用IAM策略模拟器写入S3时,仍然拒绝Lambda角色。这是政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "WhitelistRegistryAPILambdaRole",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObjectVersion",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{bucket name}",
"arn:aws:s3:::{bucket name}/*"
],
"Condition": {
"ArnNotLike": {
"AWS:SourceARN": "arn:aws:iam::{account ID}:role/{lambda role name}"
}
}
},
{
"Sid": "WhitelistRegistryAPILambdaAssumedRole",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObjectVersion",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{bucket name}",
"arn:aws:s3:::{bucket name}/*"
],
"Condition": {
"ArnNotLike": {
"AWS:SourceARN": "arn:aws:sts::{account ID}:assumed-role/{lambda role name}/{lambda function name}"
}
}
}
]
}
答案 0 :(得分:2)
Lambda函数的假定角色ARN构造如下:
arn:aws:sts::{AccountID}:assumed-role/{RoleName}/{FunctionName}
因此,在您的情况下,“角色会话名称”是lambda函数名称。 您可以通过尝试从您没有权限的Lambda(例如DynamoDB ListTables)调用API来轻松验证这一点。回调中的错误消息还将包含假定的角色ARN(请注意,某些服务(如S3)在操作被拒绝时不提供详细的错误消息.DynamoDB,Lambda和大多数最近启动的服务都会。)
我不确定你为什么需要一个NotPrincipal,因为可能有一种更好的方法来处理你所描述的场景:)更多信息可以提供更精确的答案。
来自AWS IAM Documentation:
重要提示:极少数情况需要使用NotPrincipal,而我们 建议您先探索其他授权选项 决定使用NotPrincipal。