是否有 S3策略限制访问只能看到/访问一个桶?

我有一个简单的木桶,看起来像 images.mysite.com在我的 S3和其他木桶包含备份等。

我想允许一个特定的用户能够访问的 images.mysite.com桶,以便上传图像。然而,我不想让他看到任何其他的桶,即使他们存在。

我不能制定这样的策略; 每次我尝试限制性的东西时,它都会阻塞任何存储桶的列表。

113750 次浏览

试试这个政策。还要考虑到没有办法让用户列表只选择桶。您可以列出所有的桶,也可以不列出。

{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}

我已经尝试了一段时间,终于想出了一个可行的解决方案。您必须根据所执行的操作类型使用不同的“资源”。此外,我包括一些缺失的行动在前一个答案(如 DeleteObject)和限制一些更多(如 PutBucketAcl)。

以下 IAM 政策现在对我有效:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::itnighq",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": "arn:aws:s3:::itnighq/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}

关于桶的操作和关于对象的操作必须有不同的参数。

有一种很好的方法允许用户访问一个特定的存储桶,而不需要了解其他存储桶的知识。类似于下面的组策略允许用户只看到“ bucket a”。唯一的问题是,用户只有在连接到给定的 bucket 端点时才能访问 bucket。对于下面的例子来说,这将是一个 bucket-a.s3.amazonaws.com。这个 bucket 可能还必须具有允许这种情况发生的“身份验证用户”。

{
"Statement": [
{
"Sid": "<EXAMPLE_SID>",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-a"
]
},
{
"Sid": "<EXAMPLE_SID>",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucket-a/*"
]
}
]
}

该方法在 Mac OS/X 上用 CyberDuck 进行了测试,并使用了 s3cmd 软件包

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2

为什么没有检查答案感到困惑?

让我们分析一下上述解决方案中的每个政策声明:

此策略语句 来自适用于 bucket 的内容,但不适用于 Buck 本身。这可能就是问题所要求的 没有,因为你看不到桶里有什么。

{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

这两个语句策略 来源于允许只读访问(arn:aws:s3:::your_bucket_here/) 只读的 bucket,但仍然允许对 bucket 的内容(arn:aws:s3:::your_bucket_here/*)进行 CRUD 操作。

{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::your_bucket_here",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectAclVersion"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}

但是,该策略包括下面的语句,该语句允许用户查看端点上的所有存储桶。这就是问题所要求的 可能不会

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}

但是,如果您使用的是浏览 S3存储的客户端,那么上面的内容非常有用。如果您的客户端直接访问存储而不是存储桶,那么您需要访问根目录下的存储桶列表。

我们的用例: 为云应用程序的客户端提供备份空间,客户端可以直接使用通用的 S3工具访问这些备份空间。当然,没有客户应该看到其他客户有什么。

正如 Cloudberryman 解释的那样,“你可以列出所有的桶,也可以不列出。”所以我们得想个办法。背景:

需要向用户授予 ListAllMyBuckets 权限,以便 AWS S3控制台或 S3Fox 连接时不会出现错误消息。但是 ListAllMyBuckets 列出了所有的存储桶,不管分配的资源是什么(实际上,只有 arn: ... : : * 有效)。要我说,这可是个严重的漏洞。顺便说一句。对所有桶拒绝 ListBucket 并不能阻止它们被列出,因为 ListBucket 授予列出桶内容的权限。

我认为有三种可能性,我选择了最后一种。

(1)使用神秘的桶名,例如 GUID

优点: 易于安装

缺点: 难以管理,尤其是对客户来说。(想象一下在成千上万的人中找到一个特定的 GUID。)还显示了使用备份服务的 bucket 的数量 = 客户端的数量。

(2)对客户特定的文件夹使用一个桶

这就是 Amazon 在 S3/IAM 示例中建议的方式,即为特定用户或用户组提供访问空间。参见: IAM 策略示例

优点: 相当容易设置,符合 AWS 的思想

缺点: 强制公开所有存储桶的存在,以便客户端可以找到他们的“主”存储桶。AWS 会计提供桶使用情况的统计数据,但不提供文件夹使用情况的统计数据,这使得客户机很难计算成本。

(3)不授予 ListAllMyBuckets 的访问权限

优点: 你得到了你想要的: 客户不能看到其他客户的桶

缺点: 客户不能看到他或她自己的桶。S3Browser 附带了一个漂亮的“ can not do”消息,并要求输入桶名。当连接到 root 时,S3Fox 会抛出一个错误消息,但是如果 bucket 名称已知,则允许直接导航到客户机的 bucket。Amazon S3控制台根本无法工作。

希望这有助于处理 S3 IAM,因为你需要它。

可能是最简单的用例:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}

下面的解决方案对我很有效。我需要一个策略来授予对特定 bucket 我的 S3桶上的特定用户 My _ iam _ user的访问权。

这个策略允许我的用户在特定的 s3 bucket 上列出、删除、获取 e put 文件。

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my_iam_user"
},
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::my-s3-bucket"
},
{
"Sid": "AddDeleteFiles",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my_iam_user"
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-s3-bucket/*"
}
]
}

如果不授予 ListAllMyBuckets权限,则不可能提供对 S3控制台的访问。

在我的情况下(也许你的,未来的读者) ,一个可以接受的替代方法是在用户登录时直接将他们重定向到你希望他们看到的存储桶。

要做到这一点,请将以下内容附加到您的 IAM 标志 URL 中: /s3/?bucket=bucket-name

完全登入 URL (取代 你的化名水桶名) :

https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name

IAM 策略(取代 水桶名) :

{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}

有关如何为用户创建桶特定权限的更多信息,请阅读以下博客: http://mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam/

我只是添加了一个类似的需求,通过这个解决:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:Put*",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}

我设法让以下的工作。意味着列出其他接收到的桶的访问拒绝消息。但是仍然可以看到我想要的桶,如果我连接桶名设置为路径。

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

我在用赛博鸭测试这种联系。

我使用以下内容对其他用户隐藏 bucket 的内容。这不仅有助于隐藏其他存储桶(不要使用 ListAllMyBuckets) ,还可以隐藏同一存储桶中的文件夹(当您创建一个存储桶时) ,而且还希望在其中有子文件夹,为 IAM User/subfile 分配适当的权限。

以下策略适用于 IAM 组,并且所有用户都在此组中。您需要使用 aws:userid并在 bucket 中创建一个具有相同名称的子文件夹。

可以采用用户 ID: aws iam get-user --user-name "user_name_for_folder_access":

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucket_name/${aws:userid}/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket_name"
]
}
]
}

我将这个问题解释为: “我是否可以允许访问一个桶,而其他桶是无法访问的,因此是不可见的。”因为,显示未授予访问权限的 bucket 的名称仍然等同于信息泄露。

正确答案是否定的。所需的权限是 ListAllMyBuckets,它允许用户查看 ALL 桶。省略此权限将使控制台无法使用。

为不想访问的 bucket 添加 Deny子句。请记住,它们可能仍然被列出,但是您将无法访问其中的内容。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}

有一种简单的方法或变通方法可以使用 AWS 组织来实现这一点。AWS 组织允许您拥有多个用户帐户。您的主帐户可以有多个 AWS 帐户(Sub) ,并且只有那些资源可见的 AWS 帐户中添加了任何服务(s3/EC2/*)。

请参阅 href = “ https://aws.amazon.com/blogs/aws/aws-groups-policy-based-management-for-multi-aws-account/”rel = “ nofollow norefrer”> https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ Https://aws.amazon.com/organizations/

组织在我的帐户页面

这招对我很管用。用户可以上传,下载和获取文件列表,但不能看到其他桶文件。

 {


"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:ListAllMyBuckets操作限制在特定的 bucket 上,但是对于解决方案,您可以向它们发送特定 bucket 的 Console URL,例如。

  • https://s3.console.aws.amazon.com/s3/buckets/BUCKET_NAME/

资料来源: 从 S3控制台限制 S3存储桶的列表

为此,您需要为给定的用户或组指定以下策略文档:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::my-bucket-1",
"arn:aws:s3:::my-bucket-2"
]
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket-1/*",
"arn:aws:s3:::my-bucket-2/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
}
]
}

其中 my-bucket-1my-bucket-2是提供读写访问的存储桶。

相关阅读:

我们想出的一个很好的简单解决方案是阻止用户登录到根目录。因此,他们必须使用设置为所需文件夹的远程路径登录。

 {
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::folder-name*",
"Condition": {}
}
]
}

正如上面已经讨论过的,在控制台上仅列出一个 bucket 是不可能的。但是如果 S3 bucket 的访问附加到一个 IAM,那么如果可以使用 URL 到 bucket,IAM 就可以直接访问 bucket。 S3水桶网址会像:

Https://s3.console.aws.amazon.com/s3/buckets/bucketname

BucetName 是 BuctIAM 可以访问的名称的位置

不,目前不可能限制用户在 root 或其他任何地方查看选择性存储桶。你现在只有这三个选择。

我选择要求客户端显式地使用 bucket 名称。

尝试此策略。用户不能列出任何桶,他们必须使用直接链接到允许的桶。

例如: s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview

{
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname*"
]
},


],
"Version": "2012-10-17"
}

我找到了解决办法:
AWS FLOW:
AWS FLOW

水桶政策:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AROAEXAMPLEID:*", #Role ID
"111111111111" #AccountID
]
}
}
}
]
}

IAM 政策:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AROAEXAMPLEID:*",  #Role ID
"AIDAEXAMPLEID",  #UserID
"111111111111"  #AccountID
]
}
}
}
]
}

Aws iam get-user-USER-NAME USER-NAME —— profile = ExampleProfile

Awsiam get-role —— ROLE-NAME ROLE-NAME —— profile = ExampleProfile

资料来源: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/

附言。 小心桶策略,您可以在没有权限的情况下呆在外面

与上述其他人描述的情况类似:

{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:ListBucket"
],
"Resource":"arn:aws:s3:::awsexamplebucket"
},
{
"Effect":"Allow",
"Action":[
"s3:PutObject",
"s3:GetObject"
],
"Resource":"arn:aws:s3:::awsexamplebucket/*"
}
]
}

然而,这里是缺失的一块。虽然不可能通过 S3-> Home 访问 bucket,但是可以通过直接链接访问所需的 bucket。

https://s3.console.aws.amazon.com/s3/buckets/yourawsbucket/

你可在以下文章找到更多资料:

Https://aws.amazon.com/premiumsupport/knowledge-center/s3-console-access-certain-bucket/