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

我在S3和其他包含备份的存储桶上有一个类似images.mysite.com的简单存储桶。

我想允许特定用户能够访问images.mysite.com桶以上传图片。 但是,我不想让他看到其他的桶。 甚至不存在它们。

我无法制定这样的政策。 每次我尝试一些限制性的东西,最终都会阻止任何桶的上市。

我一直在尝试这一段时间,终于想出了一个工作的解决scheme。 根据您正在执行的操作types,您必须使用不同的“资源”。 另外,我还在前面的答案中包含了一些缺失的操作(比如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": {} } ] } 

关于一个桶和那些关于对象的动作必须有不同的arn。

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

正如Cloudberryman所解释的:“你可以列出所有的桶,也可以不列出桶”,所以我们必须提出一个解决scheme。 背景:

授予用户的ListAllMyBuckets权限,以便AWS S3控制台或S3Fox无错误消息地连接。 但ListAllMyBuckets列出所有分配的资源桶(实际上,只有arn:… ::: *有效)。 如果你问我,这是一个严重的错误。 顺便说一句。 否认所有桶的ListBucket不会阻止它们被列出,因为ListBucket授予权限列出桶的内容。

有三种可能性我认为是解决问题的方法。 我select了最后一个。

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

优点:易于设置

缺点:难以pipe理,特别是对于客户。 (设想在其他数千人中find一个特定的GUID)同时显示了桶的数量=使用备份服务的客户端的数量。

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

这就是亚马逊通过其S3 / IAM示例所提供的仅为某些用户或用户组提供访问空间的方式。 请参阅: AWS示例IAM策略

优势:相当容易build立,符合AWS的想法

缺点:迫使所有桶的存在公开,所以客户可以find他们的“家”桶。 AWS会计提供了桶使用情况的统计信息,但不提供文件夹使用情况的统计信息,这使得客户机难以计算成本。

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

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

缺点:客户看不到他或她自己的桶。 S3Browser附带一个很好的“不能做”的消息,并要求input桶名称。 当连接到根目录时,S3Fox会抛出一个错误消息,但是如果桶名已知,则允许直接导航到客户端的存储桶。 Amazon S3控制台根本不起作用。

希望这有助于在您需要的时候处理S3 IAM。

试试这个政策。 还要考虑到,没有办法让用户列表只select存储桶。 您可以列出所有的桶或没有。

 { "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": {} } ] } 

在不授予ListAllMyBuckets权限的情况下,无法提供对S3控制台的ListAllMyBuckets权限。

在我的情况下(也许你也是未来的读者),一个可以接受的select是将用户login时直接redirect到您希望他们看到的存储桶。

要完成此操作,请将以下内容添加到您的IAMloginURL中: /s3/?bucket=bucket-name

完整loginurl(replace您的别名存储桶名称 ):

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

IAM策略(replace桶名称 ):

 { "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/*" ] } ] } 

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

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

 { "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上使用Cyber​​duck并使用s3cmd软件包对此方法进行了testing

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

困惑为什么没有答复被检查?

让我们从上面的解决scheme分解每个政策声明:

这个政策声明适用于桶的内容,而不是降压本身。 这可能不是问题的要求,因为你看不到什么。

 { "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/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存储。 如果您的客户端直接访问商店而不是直接访问存储桶,则需要访问根目录中的存储桶列表。

我正在解释这个问题:“我可以允许访问一个桶,其他桶不可访问,因此不可见。” 因为显示未被授予访问权限的存储桶的名称仍等于信息泄露。

而正确的答案是否定的。 所需的权限是ListAllMyBuckets,这将允许用户看到所有的桶。 离开这个权限将使控制台无法使用。

可能是最简单的用例:

 { "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/*"] } ] } 

我设法得到以下工作。 意思是列出其他桶接收到拒绝访问消息。 但是,如果我连接的存储桶名称设置为path,仍然能够看到我想要的存储桶。

 { "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/*"] } ] } 

我使用Cyber​​duck来testing这个连接。

我只是增加了一个类似的需求,由此解决:

 { "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/*" ] } ] } 

有一种简单的方法或解决方法可以使用AWS Organizations进行此操作。 AWS组织允许您拥有多个用户帐户。 您的主账户可以拥有多个AWS账户(Sub)以及任何AWS账户中添加的服务(s3 / EC2 / *),只有这些资源可见。

请参阅https://aws.amazon.com/blogs/aws/aws-organizations-policy-based-management-for-multiple-aws-accounts/ https://aws.amazon.com/organizations/

组织在我的帐户页面

下面的解决scheme为我工作。 我想要一个策略来授予特定用户my_iam_user在特定存储桶my-s3-bucket上的访问权限。

这个政策允许我的用户列出,删除,获取特定s3桶的e放置文件。

 { "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),而且还要隐藏同一个存储桶中的文件夹,但是当您创build一个存储桶时,却希望在其中为其分配合适的权限给IAM用户/子文件夹。

以下政策适用于IAM集团,所有用户均在本集团。 您需要使用aws:userid并在存储桶中创build一个具有相同名称的子文件夹。

可以采用UserID: 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" ] } ] } 

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

 {
     “版本”:“2012-10-17”,
     “声明”:[
         {
             “效果”:“允许”,
             “行动”:“s3:*”,
             “资源”:“*”
         },
         {
             “效应”:“拒绝”,
             “行动”:“s3:*”,
             “资源”:[
                 “阿尔恩:AWS:S3 :::斗名”,
                 “阿尔恩:AWS:S3 :::桶名称/ *”
             ]
         }
     ]
 }

这对我来说非常合适。 用户可以上传,下载并获取文件列表,但不能看到来自其他存储桶的文件。

  { "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操作限制为特定存储区,但对于解决方法,您可以将它们发送给特定存储区的控制台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是你的存储区,可以读取和写入数据。

有关:

  • 编写IAM策略:如何授予对Amazon S3存储桶的访问权限
  • 限制特定用户的桶的列表
  • 如何提供用户只访问AWS S3中的特定存储桶?
  • 在与桶操作相关 的策略和权限中 指定资源

我们提出的一个很好的简单的解决scheme是阻止用户login到根目录。 所以他们必须以远程pathlogin到所需的文件夹。

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