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

时间:2011-07-07 18:11:05

标签: amazon-s3 policy bucket

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

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

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

24 个答案:

答案 0 :(得分:115)

我已经尝试了一段时间,最后提出了一个有效的解决方案。您必须使用不同的“资源”,具体取决于您正在执行的操作类型。此外,我在前一个答案中包含了一些缺失的操作(如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。

答案 1 :(得分:26)

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

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

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

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

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

优点:易于设置

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

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

这是亚马逊通过他们的S3 / IAM示例建议仅提供某些用户或用户组访问的空间的方式。看到: AWS Example IAM Policies

优势:相当容易设置,配合AWS创意

缺点:强制所有桶都存在,所以客户可以找到他们的“家”桶。 AWS会计提供了存储桶使用情况的统计信息,但没有提供文件夹使用情况的统计信息,这使得客户很难计算成本。

(3)不授予ListAllMyBuckets

的访问权限

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

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

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

答案 2 :(得分:20)

如果未授予ListAllMyBuckets权限,则无法提供对S3控制台的访问权限。

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

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

完整登录网址(替换您的别名存储桶名称):

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

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

答案 3 :(得分:19)

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

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

答案 4 :(得分:8)

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

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

答案 5 :(得分:6)

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

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

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

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

这两个声明政策derived from只允许( arn:aws:s3:::your_bucket_here/ readonly 对该存储桶进行只读访问,但仍允许存储桶上的CRUD操作内容( arn:aws:s3:::your_bucket_here/* )。

{
  "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商店的客户端,则上述非常有用。如果您的客户端直接访问存储而不是存储桶,那么您需要访问根目录下的存储桶列表。

答案 6 :(得分:5)

有一种很好的方法可以让用户在不了解其他存储桶的情况下访问特定存储桶。如下所示的组策略将允许用户仅查看“存储桶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/*"
      ]
     }
   ]
}

此方法在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

答案 7 :(得分:3)

可能是最简单的用例:

cv2.findContours

答案 8 :(得分:3)

使用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/

Organization On My account page

答案 9 :(得分:2)

如上所述,在控制台上只列出一个存储桶是不可能的。但是如果S3存储桶的访问权限附加到IAM,则如果存在可用的URL,则IAM可以直接访问存储桶。 S3存储桶网址将如下:

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

其中BucketName是IAM可以访问

的存储桶名称

答案 10 :(得分:2)

我找到了这个解决方案:
AWS流程:
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 --profile = ExampleProfile

aws iam 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/

P.S。 小心存储桶策略,您可以在没有权限的情况下不在家

答案 11 :(得分:1)

我设法让以下工作。意味着列出其他存储桶已收到Access Denied消息。但是如果我将桶名称设置为路径,我仍然可以看到我想要的桶。

{
  "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测试此连接。

答案 12 :(得分:1)

虽然无法将s3:ListAllMyBuckets操作限制为特定存储区,但对于解决方法,您可以向其发送特定存储区的控制台URL,例如

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

来源:Restricting list of S3 buckets from the S3 Console

为此,您需要为给定的用户或群组指定以下政策文件:

{
    "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是您的桶以提供读写访问权限。

相关:

答案 13 :(得分:1)

类似于上述其他内容:

{
   "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访问存储桶,但可以通过直接链接仅访问所需的存储桶。

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

您可以在以下帖子中找到更多信息:

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

答案 14 :(得分:0)

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

<numbers>3 6 5</numbers>

答案 15 :(得分:0)

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

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

可以使用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"
            ]
        }
    ]
}

答案 16 :(得分:0)

下面的解决方案对我有用。我想要一个策略来授予对特定存储桶 my-s3-bucket 上特定用户 my_iam_user 的访问权限。

此政策允许我的用户列出,删除,获取特定s3存储桶上的文件。

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

答案 17 :(得分:0)

答案 18 :(得分:0)

这对我来说非常合适。用户可以上传,下载和获取文件列表,但无法查看其他存储桶中的文件。

 {    

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

}
]
}      

答案 19 :(得分:0)

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

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

答案 20 :(得分:0)

否,当前无法限制用户查看root或其他位置的选择性存储桶。您现在只有这三个选项。

我选择让客户端明确使用存储桶名称。

答案 21 :(得分:0)

尝试此政策。用户无法列出任何存储桶,他们必须使用直接链接到允许的存储桶。

例如: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"
}

答案 22 :(得分:-1)

为您不想访问的存储桶添加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/*"
            ]
        }
    ]
}

答案 23 :(得分:-4)

  • 创建用户。
  • 在IAM管理屏幕下单击创建的用户。
  • 单击添加权限。
  • 点击直接附加现有策略。
  • 单击创建策略。
  • 选择json,然后在json下方粘贴,用您的存储桶名称替换bucket_name。
  • 这使特定用户只能查看,放置和获取该存储桶的对象。

{

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

}