【发布时间】:2012-02-22 16:12:44
【问题描述】:
在 Amazon S3 控制台中,我只看到“上传/删除”的权限选项。有没有办法允许上传但不能删除?
【问题讨论】:
标签: permissions amazon-s3
在 Amazon S3 控制台中,我只看到“上传/删除”的权限选项。有没有办法允许上传但不能删除?
【问题讨论】:
标签: permissions amazon-s3
您在AWS Management Console 中直接看到的权限是基于可用于 S3 的初始且相对简单的Access Control Lists (ACL),它本质上区分了 READ 和 WRITE 权限,见Specifying a Permission:
- READ - 允许被授权者列出存储桶中的对象
- WRITE - 允许被授权者创建、覆盖和删除任何对象 桶
这些限制已通过添加Bucket Policies(应用在存储桶级别的权限)和IAM Policies(应用在用户级别的权限)来解决,并且所有三个也可以一起使用(这可能会变得相当复杂,如下所述),请参阅Access Control 了解整张图片。
您的用例可能要求提供相应的存储桶策略,您也可以直接从 S3 控制台添加该策略。单击添加存储桶策略会打开存储桶策略编辑器,其中包含几个示例的链接以及强烈推荐的AWS Policy Generator,它允许您组合策略解决您的用例。
对于原本被锁定的存储桶,最简单的形式可能如下所示(请确保根据您的需要调整 Principal 和 Resource):
{
"Statement": [
{
"Action": [
"s3:PutObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::<bucket_name>/<key_name>",
"Principal": {
"AWS": [
"*"
]
}
}
]
}
根据您的用例,您可以通过组合各种 Allow 和 Deny 操作等轻松组合非常复杂的策略 - 这显然也会产生无意的权限,因此像往常一样,适当的测试是关键;因此,请注意使用Using ACLs and Bucket Policies Together 或IAM and Bucket Policies Together 时的影响。
最后,您可能还想看看我对Problems specifying a single bucket in a simple AWS user policy 的回答,它解决了另一个常见的政策陷阱。
【讨论】:
您可以将不删除策略附加到您的 s3 存储桶。例如,如果您不希望该 IAM 用户对任何存储桶或任何对象执行任何删除操作,您可以设置如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1480692207000",
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:DeleteBucketPolicy",
"s3:DeleteBucketWebsite",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
此外,您可以使用策略模拟器 https://policysim.aws.amazon.com 检查您的策略,以检查您的设置是否符合您的预期。
希望这会有所帮助!
【讨论】:
这很完美。感谢 Pung Worathiti Manosroi。结合他提到的政策如下:
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::mybucketname/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
},
{
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:DeleteBucketPolicy",
"s3:DeleteBucketWebsite",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": "arn:aws:s3:::mybucketname/*",
"Condition": {}
}
]
}
【讨论】:
是的,s3:DeleteObject 是一个选项:
http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html
但是,更改现有对象(这将允许有效地删除它)和创建新对象之间没有区别。
【讨论】: