AWS IAM:条件上下文键 "aws:RequestTag" 如何工作?

AWS IAM: How does the condition context key "aws:RequestTag" work?

我有一个附加了角色的 EC2 实例。我的目标是提供对 AWS 服务(例如 Lambda)的完全访问,但仅限于某些资源(基于标签)。我发现 aws:RequestTag 是这样做的方法。

以下是附加到该角色的 IAM 策略。

    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1614664562621",
            "Action": "lambda:*",
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "aws:ResourceTag/app": "prod"
                }
            }
        }
    ]
}

我在所需的 lambda 函数上添加了标签 app:prod,但是当我尝试列出 lambda 时,出现 AccessDeniedException 错误。下面是错误信息

An error occurred (AccessDeniedException) when calling the ListFunctions operation: User: arn:aws:sts::123456789:assumed-role/iam-role-name/i-01abcd456abcd is not authorized to perform: lambda:ListFunctions on resource: *

如何使 aws:RequestTag 工作?我哪里错了?

以下类似问题:(该解决方案对我不起作用)

您可能希望在您的条件下使用 aws:ResourceTag 并标记此策略应允许访问的资源(即 Lambda 函数)。

aws:RequestTag 用于控制哪些标签 可以 在 AWS API 调用中携带,例如 adding/editing/removing 上的资源标签资源或在会话上添加会话标签(通过 sts:TagSession 调用)。它们并不是为了保护对具有具有特定标签的资源的访问。

此外,在您的角色上添加标签并不意味着任何调用者身份(即假设的会话角色)都会将此标签作为 request/session 标签。因此,它不会控制任何 authorization/access 到带有该标签的资源。您简单标记的 IAM 角色是 另一个 AWS 资源,现在应用了资源标签。

此外,当 EC2 接管您在 EC2 实例中的角色时,您甚至无法控制会话标签,因此您无法控制 EC2 实例的 session/request 标签。

编辑:在您使用 lambda:ListFunctions 的特定示例中, 不是 资源特定操作,您不能 control/filter Lambda 的列表API 调用者的策略允许具有特定资源标记的函数。

使用多个 environments/stages 时,拥有多个 AWS 帐户(每个 environment/stage 一个)实际上是最佳实践。如果您还没有使用多个 AWS 账户,您甚至可以使用 AWS Organizations 进行整合账单等。