IAM 策略变量非常酷,允许您创建通用策略,例如,允许用户根据用户名访问 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 用户帐户的应用程序服务器,这些帐户链接到类似于上述策略的通用策略。这将隔离每个用户/应用可访问的文件,而无需创建多个策略。
我想将这些服务器切换为使用角色,但似乎没有像 aws:rolename
这样的等效 IAM 变量。
文档表明,使用分配给 EC2 实例的角色时,未设置aws:username
变量,[role-id]:[ec2-instance-id]
aws:userid
变量(这也无济于事)。
这似乎真的是你应该能够做的事情......还是我来错了?
在寻找相同的内容,经过大量搜索,我的结论是不可能在 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"
}
]
}
(交叉发布到 AWS S3 IAM 角色策略,用于根据实例标签或实例 ID 限制少数实例连接到 S3 存储桶)
不要使用aws:SourceArn
,而是使用aws:userid
!
您提到的可用于策略变量的请求信息文档有一个表,其中显示了各种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 将保留在实例中,但如果启动新实例,即使从同一 Amazon 系统映像 (AMI) 启动,也会分配一个新实例 ID。