【发布时间】:2021-02-25 14:53:03
【问题描述】:
场景:我有一个简单的 S3 存储桶,多个用户将向其上传文件。每个用户都应该上传到一个特定的文件夹,并且只有那个文件夹 - 除此之外没有子文件夹。在该文件夹中,他们可以上传任何他们想要的东西。我有一个 IAM 策略,目前仅限于该用户文件夹,但允许他们指定我不想要的子文件夹。
当前 IAM 政策 JSON,仅限于顶级文件夹:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectTagging"
],
"Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*"
}]
}
提议的 IAM 策略 JSON,我希望将 PutObject 进一步限制在指定的文件夹上,但这似乎不允许上传任何对象?:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObjectTagging"
],
"Resource": "arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/*",
"Condition": {
"StringEquals": {
"s3:prefix": [
"",
"[MY_FOLDER]/"
],
"s3:delimiter": [
"/"
]
}
}
}]
}
预期结果
- 允许 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].csv
- 允许 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].parquet
- 允许 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FILE].txt
- 拒绝 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FOLDER1]/[MY FOLDER2]/[MY_FILE].txt
- 拒绝 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[MY_FOLDER1]/[MY_FILE].txt
- 拒绝 arn:aws:s3:::[MY_BUCKET]/[MY_FOLDER]/[...N 文件夹]/[MY_FILE].txt
【问题讨论】:
-
如果您允许上传到特定前缀,例如
users/gbeaven/*那么你不能阻止上传到下面的“文件夹”,例如users/gbeaven/dogs/snoopy.png,至少不使用 IAM 或存储桶策略。 -
@jarmod 你将如何完成我想要做的事情?我觉得不应该这么复杂。我的代码取决于密钥的第一个“文件夹”。如果用户不小心使用多个密钥上传,它将抛出代码。话虽如此,使用 IAM 策略而不是代码来处理验证似乎是谨慎的。
-
您不能在 IAM 或 S3 存储桶策略 afaik 中执行此操作,因此如果您授予 IAM 用户 fred 上传到
users/fred/*的权限,那么 fred 可以在此创建任何内容。您所能做的就是对其做出反应,例如通过触发移动文件或删除文件或其他方式的 Lambda 函数。除了让这些用户不受限制地访问 S3 前缀之外,您还有另一个选择是向他们提供预签名 URL。然后您指定他们可以上传到的密钥(但这可能不切实际,除非您的用户通过您控制的应用程序与 S3 进行交互)。 -
也许值得理解为什么您不想让您的用户创建他们自己的“子文件夹”并在他们分配的前缀下管理他们自己的文件层次结构?为什么这对您的用例来说是个问题?
-
因为在我们的用例中用户不需要子文件夹。用户应将文件加载到数据载入存储桶中的“他们的”文件夹中,此时 Lambda 脚本会触发并将数据分类/放置在我们的数据湖中。如果用户总是放置在正确的位置,我不需要处理代码中的任何用户错误。如果用户确实不小心加载了多个文件夹,而无法限制为 1 个子文件夹并向用户抛出“拒绝访问”错误,则文件将静默加载,但将由代码处理。看起来很直观,这可以通过 IAM 策略来处理。
标签: amazon-web-services amazon-s3 permissions amazon-iam