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

时间:2016-02-29 23:27:42

标签: amazon-web-services amazon-s3 amazon-iam

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用户帐户的应用服务器,这些用户帐户链接到与上述类似的通用策略。这会隔离每个用户/应用程序可访问的文件,而不会创建多个策略。

我希望切换这些服务器以使用roles,但似乎没有像aws:rolename这样的等效IAM变量。

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

这看起来真的像你应该做的事情......或者我是以错误的方式来到这里的?

2 个答案:

答案 0 :(得分:0)

(交叉发布到AWS S3 IAM policy for role for restricting few instances to connect to S3 bucket based in instance tag or instance id

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

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

  

对于分配给Amazon EC2实例的角色,它设置为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将保留在实例中,但如果启动了新实例,则会分配一个新实例,即使是来自同一个亚马逊机器映像(AMI)。

答案 1 :(得分:0)

我一直在寻找相同的东西,经过大量搜索后得出的结论是,在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"
        }
    ]
}