0

我有一个 S3 存储桶,它为每个用户提供一个目录(前缀),我想让每个用户(其他 AWS 账户)只访问他们的对象,我还想使用请求者支付所有传输费用。一些想法:

1.使用桶策略

我还没有对此进行测试,但我认为可以通过为每个帐户附加与此类似的策略来做到这一点:

{
  "Sid": "id1",
  "Action": "s3:ListBucket",
  "Effect": "Allow",
  "Resource": "arn:aws:s3:::my-bucket",
  "Principal": "arn:aws:iam::123:role/external-role-1",
  "Condition": {"StringEquals":{"s3:prefix":["user-1/"],"s3:delimiter":["/"]}}
},
{
  "Sid": "id2",
  "Action": "s3:GetObject",
  "Effect": "Allow",
  "Resource": "arn:aws:s3:::my-bucket/user-1/*",
  "Principal": "arn:aws:iam::123:role/external-role-1"
}

在这里,可以通过在他们的帐户中定义的 ,user-1访问他们的对象并列出他们的目录。external-role-1这种方法的唯一问题是这 2 个块大约 500 字节,存储桶策略限制为 20 KB,因此每个存储桶最多可以容纳约 40 个用户。

2.为我的账户中的每个用户创建一个角色,并允许外部用户承担它

这通过将 JSON 分布在许多 IAM 角色中来避免上述问题。这种方法的问题在于,这会破坏请求者的付费。

当请求者在提出请求之前担任 AWS Identity and Access Management (IAM) 角色时,该角色所属的账户将针对该请求收费。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html

3. 使用Object ACL或标记来控制对Object的访问

通过避免GetObject策略,这可以使容量从 #1 翻倍,但ListBucket仍然需要每个用户的策略。

这些都不完全满足我想要实现的目标,有更好的方法吗?有没有办法为每个用户创建一个 IAM 策略,然后将其附加到他们的外部 IAM 角色?

4

0 回答 0