我有多个AWS EC2实例,它们具有形式为***-manager
的唯一名称标签(三个唯一字符,然后是-manager
)。
我有几个S3存储桶(及其子文件夹),它们的名称中有相似的3个字符的ID,我需要根据要询问的EC2来限制访问权限。
我如何编写单个AWS策略以附加到每个EC2并执行以下操作:
存储桶docker.***.mysite.com
仅应由其名称标签具有值***-manager
的EC2访问。行动就是任何事物,即*
。
只有名称标签值为downloads.mysite.com/***/
的EC2才能访问文件夹***-manager
。操作为ListBucket
和GetObject
,但有前缀限制。
任何EC2都应可以访问文件夹downloads.mysite.com/common/
任何EC2都不应访问根downloads.mysite.com/
或对其有任何了解(即,不能在common
及其***
子文件夹之外执行任何S3操作。
注意:如果不容易/不可能从EC2名称标签中提取3个字母的ID以“传递”到策略的“资源”部分,我可以轻松地向每个仅具有{{ 1}}作为其值-但仍然必须以某种方式将其“传递”给策略定义中的资源。
答案 0 :(得分:2)
似乎无法执行此操作,因为IAM S3策略无法回溯“呼叫者标签”。
但是可以做的是查找分配给EC2实例的IAM角色的标签。不幸的是,GetObject
动作的相关条件是s3:ExistingObjectTag/<key>
,它适用于S3对象而不是S3存储桶本身。
使用上述方法的简化政策如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListBucket",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::<S3_BUCKET_NAME>"
]
},
{
"Sid": "AllowROcheckTag",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<S3_BUCKET_NAME>/*",
"Condition": {
"StringEquals": {
"s3:ExistingObjectTag/<TAG_ON_S3_OBJECT>": "aws:RequestTag/<TAG_ON_IAM_ROLE_ASSIGNED_TO_EC2>}"
}
}
}
]
}
在上述情况下,分配给EC2实例及其标签的IAM角色将驱动对S3存储桶中对象的访问。
关于特定S3动作允许的条件的详细信息为here
答案 1 :(得分:1)
我认为不可能针对多种情况制定一项政策。
最接近的方法是使用IAM Policy Elements: Variables - AWS Identity and Access Management,但这不允许使用任意值,也不能用于从EC2实例中检索标签。
我认为您需要为每个引用特定S3存储桶的EC2实例创建单独的角色。