是否可以仅允许用户对没有读取权限的存储区执行写操作? 目标是让我的所有EC2实例将每个实例写入不同的存储桶,而不是让它们读取任何其他存储桶。我的所有实例都使用相同的IAM角色运行。
答案 0 :(得分:3)
当然可以。例如,当sync命令与--delete
开关一起使用时,我通常使用此只写策略将EC2实例备份到S3:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}
答案 1 :(得分:2)
是。您当然可以为角色分配一个允许PutObject
而不进行任何其他操作的策略(例如ListBuckets
,GetObject
)。
选项1:存储桶的只写权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "statement1",
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::examplebucket/*"
]
}
]
}
您可以使用相同的存储桶,但使用其实例ID作为目录名称(例如s3://my-bucket/i-abcd1234/foo.txt
)来避免文件名冲突,而不是为每个实例提供自己的存储桶。
选项2:子目录中的完整权限
您甚至可以更进一步,让他们完全访问Amazon S3存储桶,但只能在他们自己的子目录中。
将为角色分配此政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSubdirectory",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::my-bucket/${aws:userid}/*"
]
}
]
}
在这种情况下,aws:userid
policy variable将等于role-id:ec2-instance-id
。因此,EC2实例将能够在与其角色和实例ID匹配的子目录(也称为密钥前缀)中执行任何操作。
例如:
aws s3 cp foo s3://my-bucket/AROAJCLCJNQ3333ZQLZTW:i-055f66ea41fb4438e/foo
role-id
可以通过aws iam get-role --role-name rolename
获得。
此方法保证每个实例只能在存储桶中使用自己的子目录。但是,它无法列出存储桶的内容,因为这是存储桶级权限。
答案 2 :(得分:1)
请注意,上述解决方案是正确的,但是使用PutObject Action,您还可以覆盖现有对象(source)。我不知道为什么需要这种类型的访问的确切情况,但是如果您想使用它来创建备份,我会添加一些额外的步骤来最大程度地减少覆盖对象的风险。我将创建一个单独的过程(例如Lambda),将所有对象从该存储桶复制到另一个安全的存储桶,客户端完全没有访问权限。