Lambda 函数所承担的角色的 ARN 是多少?

roo*_*ous 4 security amazon-s3 amazon-web-services amazon-iam

我试图在我的存储桶策略中使用 NotPrincipal 元素来明确拒绝对我的 s3 存储桶的访问,同时将访问该存储桶的特定 lambda 列入白名单。我在 NotPrincipal 元素中为 lambda 的角色指定了角色 ARN 并承担了角色 ARN:

"arn:aws:iam::{Account ID}:role/service-role/{Lambda 角色名称}",

“arn:aws:sts::{Account ID}:assumed-role/{Lambda 角色名称}/{角色会话名称}”

本文档解释了假定角色 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 不匹配的所有请求。Lambda 角色仍然被拒绝使用 IAM 策略模拟器写入 S3。这是政策:

{
"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}"
            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

}

Sim*_*nti 7

特尔;博士:

Lambda 函数的假定角色 ARN 构造如下:

arn:aws:sts::{AccountID}:assumed-role/{RoleName}/{FunctionName}
Run Code Online (Sandbox Code Playgroud)

细节:

因此,在您的情况下,“角色会话名称”是 lambda 函数名称。您可以通过尝试从您没有权限的 Lambda(例如 DynamoDB ListTables)调用 API 来轻松验证这一点。回调中的错误消息还将包含假定的角色 ARN(请注意,某些服务,例如 S3,在操作被拒绝时不会提供详细的错误消息。DynamoDB、Lambda 和大多数最近启动的服务将提供。)

我不确定您为什么需要 NotPrincipal,因为可能有更好的方法来处理您描述的场景:) 更多信息将有助于提供更精确的答案。
来自AWS IAM 文档

重要提示:很少有场景需要使用 NotPrincipal,我们建议您在决定使用 NotPrincipal 之前探索其他授权选项。