首页 > 解决方案 > AWS IAM:条件上下文键“aws:RequestTag”如何工作?

问题描述

我有一个附加了角色的 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错误。下面是错误信息

调用 ListFunctions 操作时发生错误 (AccessDeniedException):用户:arn:aws:sts::123456789:assumed-role/iam-role-name/i-01abcd456abcd 无权执行:lambda:ListFunctions on resource: *

如何制作aws:RequestTag作品?我哪里错了?

下面的类似问题:(该解决方案对我不起作用) aws:RequestTag on s3 bucket 不起作用(在担任角色时)

标签: amazon-web-servicesamazon-iamamazon-policy

解决方案


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

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

此外,在您的角色上添加标签并不意味着任何调用者身份(即假定的会话角色)都会将此标签作为请求/会话标签。因此,它不会控制对具有该标签的资源的任何授权/访问。您标记的 IAM 角色是另一个AWS 资源,现在应用了资源标签。

此外,当 EC2 担任您在 EC2 实例中的角色时,您甚至无法控制会话标签,因此您无法控制 EC2 实例的会话/请求标签。

编辑:lambda:ListFunctions但是,在您的特定示例中,这不是特定于资源的操作,您无法通过具有 API 调用者策略允许的特定资源标签的 Lambda 函数来控制/过滤列表。

在使用多个环境/阶段时,拥有多个 AWS 账户(每个环境/阶段一个)实际上是最佳实践。如果您还没有使用多个 AWS 账户,您甚至可以使用AWS Organizations进行合并计费等。


推荐阅读