创建 S3 策略以允许对一个 S3 子文件夹进行完全访问



我正在尝试创建一个 AWS S3 策略以允许完全访问特定的 S3 子文件夹,但不允许其他任何内容。在下面的示例中,有一个名为 Bob 的开发人员。我创建了一个完全专用于 Bob 的目录,并希望通过登录控制台仅授予他对此 S3 文件夹(bob 文件夹(的完全读/写访问权限。

这就是我尝试过的,尽管在尝试访问 bob 目录时出现拒绝访问错误。我非常感谢有关如何实现这一目标的任何建议。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::/mydir/devs/bob/*"
]
}
]
}

这就是我为完全相同的需求而拥有的。有些组合似乎违反直觉(为什么我同时需要ListAllBucketsListBucket- 但没有它似乎不起作用(:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::mydir"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::mydir/devs/bob/*"
]
}
]
}

另外,我认为ListBucket需要一个存储桶(即在您的示例中mydir(。我认为它不适用于密钥(或文件夹(,例如mydir/devs/bob

请记住,S3 对象是完整的键名称,因此您已授予以下权限:

/mydir/devs/bob/*

它表示所有以/mydir/devs/bob/为前缀的键,但不包括键本身/mydir/devs/bob,即您的"文件夹"。它还缺少存储桶名称 (bucket-name/mydir/devs/bob/*( 这意味着用户不能对"文件夹"或其父文件夹使用列表操作。因此,鲍勃无法导航到他的文件夹。

此处的 AWS 博客上提供了有关创建用户特定子文件夹的精彩演练。我们可以分解该信息以适合您的用例,语句 ID 如下所示:

允许 Bob 在控制台中查看存储桶列表所需的权限:

{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
}

允许 Bob 导航到他的文件夹,方法是允许在每个父目录上列出

{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::bucket-name"],
"Condition":{"StringEquals":{"s3:prefix":["","mydir/","mydir/devs/","mydir/devs/bob"],"s3:delimiter":["/"]}}
}

让 Bob 列出其文件夹中的任何文件和文件夹

{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::bucket-name"],
"Condition":{"StringLike":{"s3:prefix":["mydir/devs/bob/*"]}}
}

最后,让 Bob 对他文件夹中的任何内容执行任何操作

{
"Sid": "AllowAllS3ActionsInUserFolder",
"Action":["s3:*"],
"Effect":"Allow",
"Resource": ["arn:aws:s3:::bucket-name/mydir/devs/bob/*"]
}

这组合起来看起来像这样:

{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::bucket-name"],
"Condition":{"StringEquals":{"s3:prefix":["","mydir/","mydir/devs/","mydir/devs/bob"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::bucket-name"],
"Condition":{"StringLike":{"s3:prefix":["mydir/devs/bob/*"]}}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Action":["s3:*"],
"Effect":"Allow",
"Resource": ["arn:aws:s3:::bucket-name/mydir/devs/bob/*"]
}
]
}

提供的文档还提供了一个很好的示例,说明如何使用策略中的${aws:username}变量执行此操作,以便将其应用于组。

最新更新