【发布时间】:2020-01-05 05:57:20
【问题描述】:
是否可以只允许用户对存储桶进行写入操作而没有读取权限? 目标是让我的所有 EC2 实例将每个实例写入不同的存储桶,而不是让它们读取任何其他存储桶。我的所有实例都使用相同的 IAM 角色运行。
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-ec2 amazon-iam
是否可以只允许用户对存储桶进行写入操作而没有读取权限? 目标是让我的所有 EC2 实例将每个实例写入不同的存储桶,而不是让它们读取任何其他存储桶。我的所有实例都使用相同的 IAM 角色运行。
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-ec2 amazon-iam
这当然是可能的。例如,当使用带有--delete 开关的sync 命令时,我通常使用此只写 策略将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/*"
]
}
]
}
【讨论】:
是的。您当然可以为角色分配允许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获取。
该方法保证每个实例只能使用桶内自己的子目录。但是,它无法列出存储桶的内容,因为这是存储桶级别的权限。
【讨论】:
请注意,上述解决方案是正确的,但使用 PutObject Action 您还可以覆盖现有对象 (source)。我不知道为什么您需要这种类型的访问的确切情况,但是如果您想使用它来创建备份,我会添加一些额外的步骤以最大程度地减少覆盖对象的风险。我会创建一个单独的进程(例如 Lambda)来将所有对象从该存储桶复制到另一个安全的存储桶,客户端根本无权访问。
【讨论】: