根据角色名称授予对 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"
}
]
}
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
.
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"
}
]
}