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

Ale*_*lex 115 policy amazon-s3 bucket

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

我想允许特定用户访问images.mysite.com存储桶以上传图像.但是,我不希望他看到任何其他的桶; 甚至不存在它们.

我无法制定这样做的政策; 每当我尝试限制性的东西时,它最终会阻止任何桶的列表.

rog*_*pos 118

我已经尝试了一段时间,最后提出了一个有效的解决方案.您必须使用不同的"资源",具体取决于您正在执行的操作类型.此外,我在前一个答案(如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": {}
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

关于桶和关于对象的操作必须具有不同的arn.

  • 这不会阻止用户查看其他存储桶名称! (85认同)
  • 为了查看控制台中的存储桶列表(因此使用控制台进行存储桶访问),你_must_为_all_ S3存储桶授予`ListAllMyBuckets`和`GetBucketLocation`(`"arn:aws:s3 :::*"`将工作而不是资源的"*".如[此AWS博客文章]中所述(http://blogs.aws.amazon.com/security/post/Tx1P2T3LFXXCNB5/Writing-IAM-policies-Grant-access-to-user-specific-folders-in-an- Amazon-S3-bucke)"另外,您目前无法有选择地过滤掉某些存储桶,因此用户必须拥有列出所有存储桶以进行控制台访问的权限." (19认同)
  • 这是一个很好的答案,谢谢.值得注意的是,s3:ListAllMyBuckets权限的含义是此策略的接收者可以看到所有(root)的存储桶.没有直接的数据公开,但可能存在桶名称的敏感性/混淆.删除此特定权限是可行的,事情应该仍然有效(尽管"s3cmd ls"等不会返回目标存储桶). (9认同)
  • 这是一个可怕的建议.这是危险的,特别是OP不想要的.有关可行的解决方法,请参阅[Andreas Stankewitz](/sf/answers/1266284841/)和[BFar](/sf/answers/2167334431/)的答案. (7认同)
  • @metdos您可以通过删除最后一个策略来阻止用户查看其他存储桶名称. (2认同)
  • @HendraUzia不,不.删除该策略会导致控制台根本不列出任何存储桶. (2认同)

小智 33

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

正如cloudberryman所解释的那样,"你可以列出所有桶,也可以不列出任何桶."所以我们必须提出一个解决方案.背景:

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

我认为有3种可能性可以解决.我选择了最后一个.

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

优点:易于设置

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

(2)使用一个具有客户端特定文件夹的存储桶

这就是亚马逊通过他们的S3/IAM示例建议仅提供某些用户或用户组访问的空间.请参阅: AWS示例IAM策略

优势:相当容易设置,符合AWS的想法

缺点:力量使所有桶都存在,所以客户可以找到他们的"家"桶.AWS会计提供存储桶使用情况的统计信息,但不提供文件夹使用情况的统计信息,这使得难以按客户端计算成本

(3)不授予ListAllMyBuckets访问权限

优势:你得到你想要的东西:客户看不到其他客户的桶

缺点:客户端无法看到自己的桶.S3Browser带有一个很好的"不能做"的消息,并要求输入桶名称.连接到根时,S3Fox会抛出错误消息,但如果已知存储桶名称,则允许直接导航到客户端的存储桶.Amazon S3控制台根本不起作用.

希望这有助于在需要时处理S3 IAM.


BFa*_*Far 24

在未授予ListAllMyBuckets权限的情况下,无法提供对S3控制台的访问权限.

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

要完成此操作,请将以下内容附加到您的IAM登录URL: /s3/?bucket=bucket-name

完整登录URL(替换你的别名存储桶名称):

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

IAM策略(替换bucket-name):

{
    "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/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


小智 20

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

{
    "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": {}
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • s3:*授予访问权限以执行任何操作,包括删除存储桶.当然你想要那个? (3认同)
  • 它很棒!我必须做改变动作才能成为`s3:*`让它为我工作.我也有"资源":["arn:aws:s3 ::: your_bucket_here","arn:aws:s3 ::: your_bucket_here/*"]`,但这可能不需要. (2认同)

小智 9

我将这个问题解释为:"我可以允许访问一个存储桶,其中任何其他存储桶都不可访问,因此不可见." 因为,显示未授予访问权限的存储桶的名称仍然等同于信息泄漏.

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

  • 这很难过,但这是正确的答案. (2认同)

joe*_*uli 6

有一种很好的方法可以让用户访问特定的存储桶,而无需了解其他存储桶.如下所示的组策略将允许用户仅查看"存储桶a".唯一的问题是,如果用户连接到给定的存储桶端点,用户将只能访问存储桶.对于下面的示例,将是bucket-a.s3.amazonaws.com.存储桶也可能必须具有允许发生这种情况的"经过身份验证的用户".

{
    "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/*"
      ]
     }
   ]
}
Run Code Online (Sandbox Code Playgroud)

此方法在Mac OS/X上使用Cyber​​duck进行测试,并使用s3cmd软件包

./s3cmd ls s3://bucket-a --access_key=ACCESS_KEY --secret_key=SECRET_KEY --bucket-locat
ion=ap-southeast-2
Run Code Online (Sandbox Code Playgroud)

  • 我仍然可以看到所有存储桶的列表。不工作:( (2认同)

Don*_*rty 5

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

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

本政策声明适用于桶的内容,而不是降压本身.这可能不是问题所要求的,因为你无法看到桶中的内容.

{
"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": {}
}
Run Code Online (Sandbox Code Playgroud)

这两个语句策略派生自,只读(arn:aws:s3:::your_bucket_here/)只读()只读桶,但仍允许存储桶的内容(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": {}
}
Run Code Online (Sandbox Code Playgroud)

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

{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
Run Code Online (Sandbox Code Playgroud)

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