根据角色名称授予对 S3 资源的访问权限

Granting access to S3 resources based on role name

IAM policy variables 非常酷,可以让您创建通用策略,例如,允许用户根据用户名访问 S3 存储桶中的路径,如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": ["s3:GetObject","s3:PutObject","s3:DeleteObject"],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::fooCorp-user-files/${aws:username}/*"
        },
        {
            "Action": "s3:ListBucket",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::fooCorp-user-files"
        }
    ]
}

我的问题是,如何使用角色(附加到 EC2 实例)而不是用户帐户来完成此操作?

我有许多具有唯一 IAM 用户帐户的应用程序服务器,这些帐户链接到与上述类似的通用策略。这隔离了每个 user/app 可访问的文件,而无需创建多个策略。

我想将这些服务器切换为使用 roles,但似乎没有像 aws:rolename.

这样的等效 IAM 变量

The docs 表示当使用分配给 EC2 实例的角色时,未设置 aws:username 变量并且 aws:userid[role-id]:[ec2-instance-id](这没有帮助要么)。

这看起来确实是您应该能够做的事情.. 还是我的理解方式有误?

(交叉发布到

不要使用 aws:SourceArn,而是使用 aws:userid!

您提到的 Request Information That You Can Use for Policy Variables 文档有一个 table 显示 aws:userid 的各种值,包括:

For Role assigned to an Amazon EC2 instance, it is set to role-id:ec2-instance-id

因此,您可以使用用于启动 Amazon EC2 实例的角色的 角色 ID 来允许访问或 实例 ID.

例如,这个基于角色ID

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SID123",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "AROAIIPEUJOUGITIU5BB6*"
                    ]
                }
            }
        }
    ]
}

当然,如果您要根据角色 ID 分配权限,那么您可以在角色本身内轻松地授予权限。

这个基于 实例 ID

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SID123",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": [
                        "*:i-03c9a5f3fae4b630a"
                    ]
                }
            }
        }
    ]
}

实例 ID 将保留在实例中,但如果启动新实例,即使来自同一 Amazon 系统映像 (AMI),也会分配一个新实例。

我一直在寻找同样的东西,经过大量搜索后我的结论是不可能在 IAM 策略中将角色名称用作变量(不过我很想被证明是错误的)。

相反,我用 name 标记了我的角色,结果是这样的:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": ["s3:GetObject","s3:PutObject","s3:DeleteObject"],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::fooCorp-user-files/${aws:PrincipalTag/name}/*"
        },
        {
            "Action": "s3:ListBucket",
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::fooCorp-user-files"
        }
    ]
}