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]
(这也没有帮助)
这看起来真的像你应该做的事情......或者我是以错误的方式来到这里的?
答案 0 :(得分:0)
不使用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"
}
]
}