我在创建 AWS S3 策略以允许客户仅列出和访问特定文件夹和子文件夹中具有扩展名的某些对象,同时无法列出或访问其他文件夹、子文件夹或对象时遇到困难。
假设我们有这样的结构:
S3
.
├── BucketManagement
| └── Accounting
|
├── BucketHR
| ├── Insurance
| └── Resume
|
└── BucketCustomers
├── custAcmeAnvils
├── custBoboBakery
| ├── projCakewalk
| | ├── batter.txt
| | ├── cupcake.txt
| | ├── PROFIT.XLS
| | └── cooktime.txt
| ├── projPieFace
| └── projFlourPower
| ├── dough.txt
| └── LAWSUITS.DOC
└── custCocoCabana
我为我的客户创建了一个 IAM 用户"Bobo's Bakery"。我希望允许我的客户 Bobo 先生仅查看和访问某些文件夹、子文件夹和对象(文件(。我不希望 Bobo 先生看到或访问任何其他存储桶、文件夹、子文件夹或对象。
在此示例中,我只希望 Bobo 先生能够列出和下载某些子文件夹中扩展名为".txt"的对象,而不能查看、列出或访问任何其他文件夹、子文件夹或具有其他扩展名的对象。
理想情况下,当 Bobo 先生登录到 S3 控制台时,他只看到这个存储桶(我知道这可能是不可能的,因为所有存储桶都必须可见(:
BucketCustomers
然后,当Bobo先生点击该存储桶时,他只看到这个文件夹"custBoboBakery":
BucketCustomers
└── custBoboBakery
然后,当Bobo先生点击该文件夹时,他只看到以下2个子文件夹"projCakeWalk"和"projFlourPower":
custoBoboBakery
├── projCakeWalk
└── projFlourPower
注意:我不希望波波先生看到子文件夹projPieFace。 然后,当 Bobo 先生点击子文件夹 projCakewalk 或 projFlourPower 时,他只看到扩展名为".txt"的对象。
projCakewalk
├── batter.txt
├── cupcake.txt
└── cooktime.txt
projFlourPower
└── dough.txt
Bobo 先生应该无法看到带有".XLS"或".DOC"扩展名的对象。然后,他可以下载这些.txt文件。波波先生不应具有删除或上传权限。
你能建议如何写这个政策吗?
S3 是一个平面文件系统对象存储。这意味着您访问的所有文件和文件夹最终都是平面名称。
例如,您的文件夹路径projCakewalk->batter.txt
具有文件的名称projCakewalk/batter.txt
。这意味着如果要访问此特定文件,则需要使用完整的名称(路径(。
为了限制对特定文件夹和路径的访问,S3 提供了创建存储桶策略和 IAM 策略的功能 - 它们在结构上是相似的。为了满足您的目的,您可以参考此链接
下面放下了页面中的示例策略
{
"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:::my-company"],
"Condition":{"StringEquals":{"s3:prefix":["","home/", "home/David"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::my-company"],
"Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::my-company/home/David/*"]
}
]
}
在上述政策中, 对于第一部分,您允许访问列出所有存储桶(您不需要这个( 在第二部分中,它允许访问列出我公司存储桶的特定子文件夹 对于第三部分,它只允许访问特定的文件名模式(您可以使用类似的条件来限制对特定文件的访问 - 只需删除星号(