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


123

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

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

我无法制定出可以做到这一点的政策;每次我尝试限制性的操作时,最终都会阻塞所有存储桶的列表。


我投票结束这个问题是因为题外,因为它应该针对超级用户
Tonny Madsen

可以在以下位置生成政策:awspolicygen.s3.amazonaws.com/policygen.html
Suhail Gupta,


1
为什么不共享存储桶的网址- https://s3.console.aws.amazon.com/s3/buckets/my-bucket-name/。这样,您可以使他们避免查看整个列表,并且不会更改当前策略。
treecoder

Answers:


119

我已经尝试了一段时间,最后想出了一个可行的解决方案。您必须根据执行的操作类型使用不同的“资源”。另外,我在上一个答案中包含了一些遗漏的操作(如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": {}
    }
  ]
}

有关存储桶的操作和有关对象的操作必须具有不同的角度。


9
这是一个很好的答案,谢谢。可能值得注意的是,s3:ListAllMyBuckets权限的含义是此策略的收件人可以看到您所有的(根)存储桶。没有直接的数据公开,但是存储桶名称周围可能存在敏感性/混淆。删除此特定权限是可行的,并且仍然可以正常工作(尽管“ s3cmd ls”等不会返回目标存储桶)。
Mike在2012年

91
这不会阻止用户看到其他存储桶名称!
metdos 2012年

2
@metdos,您可以通过删除最后一个策略来防止用户看到其他存储桶名称。
Hendra Uzia 2014年

20
为了看到水桶名单在控制台(因此使用铲斗访问控制台),您必须授予ListAllMyBucketsGetBucketLocation所有 S3桶("arn:aws:s3:::*"将工作,而不是"*"对资源)。正如该AWS博客文章中所述,“ 顺便一句,您当前无法选择性地筛选出某些存储桶,因此用户必须有权列出所有存储桶以进行控制台访问。”
jwadsa​​ck 2014年

10
这是可怕的建议。这很危险,特别是OP不需要的东西。有关可行的解决方法,请参见Andreas StankewitzBFar的答案。
AndreKR

37

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

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

需要向用户授予ListAllMyBuckets权限,以便AWS S3控制台或S3Fox进行连接而不会出现错误消息。但是ListAllMyBuckets列出了所有存储桶以及分配的资源(实际上,只有arn:... ::: *有效)。如果您问我,那是一个严重的错误。顺便说一句。拒绝所有存储桶的ListBucket不会阻止其列出,因为ListBucket授予列出存储桶内容的权限。

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

(1)使用隐式存储桶名称,例如GUID

优势:易于设置

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

(2)将一个存储桶与客户特定的文件夹一起使用

这就是Amazon通过其S3 / IAM示例建议的方式,即提供仅供某些用户或用户组访问的空间。请参阅: AWS示例IAM策略

优势:设置起来非常容易,并且带有AWS创意

缺点:强制公开所有存储桶的存在,因此客户可以找到他们的“家”存储桶。AWS记帐提供有关存储桶使用情况的统计信息,但不提供文件夹使用情况的统计信息,这使得难以按客户端计算成本。

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

优势:您可以得到想要的:客户看不到其他客户的存储桶

缺点:客户看不到自己的存储桶。S3Browser带有一个很好的“不能执行”消息,并要求输入存储桶名称。连接到根目录时,S3Fox会引发错误消息,但是如果知道存储桶名称,则可以直接导航到客户端的存储桶。Amazon S3控制台根本无法工作。

希望这有助于您按需处理S3 IAM。


1
此外,对于解决方案(1),如果您想将Web托管与存储桶一起使用,则存储桶名称必须与域名匹配。
安迪·富斯尼亚克

31

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

就我而言(可能也是您的未来读者),一种可接受的替代方法是将登录时的用户直接重定向到您希望他们看到的存储桶。

为此,请将以下内容添加到您的IAM登录网址中: /s3/?bucket=bucket-name

完整的登录URL(替换您的别名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 /


1
这很好。如果用户无法在存储区视图之外进行浏览,那将是最佳选择。但是我会接受的。谢谢@BFar。
Jamie Popkin '02

这是一个正确的答案,所有其他答案都将列出每个存储桶-应该按照原始请求将其隐藏。
史蒂夫·霍瓦斯

正是我所需要的。谢谢。
Di Zhang

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

2
效果很好!s3:*为了使它对我有用,我不得不采取行动。我也有"Resource": ["arn:aws:s3:::your_bucket_here", "arn:aws:s3:::your_bucket_here/*"],但是可能不需要。
Michael Yagudaev

3
s3:*授予访问权限以执行任何操作,包括删除存储桶。确定要吗?
戴夫·格雷戈里

10

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

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


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

在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

我仍然可以看到所有存储桶的列表。不工作:(
瑞诗凯诗·钱德拉

5

为何不检查答案感到困惑?

让我们从以上解决方案中分解每个策略声明:

此策略声明from适用于存储桶的内容,而不适用于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/只读的存储区进行只读访问,但仍允许对存储区的内容(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存储的客户端,则上述内容非常有用。如果您的客户直接访问存储区而不是存储桶,那么您需要访问根目录下的存储桶列表。


3

可能是最简单的用例:

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

1
AWS响应:This policy contains the following error: The policy must contain a valid version string
MaximeBernard 2015年

是的-我更正了我的回复-> <br/>这里只有两个可能的值:<br/> * 2012-10-17 *和2008-10-17。<BR/>进一步参考可以在这里找到:<BR/> docs.aws.amazon.com/IAM/latest/UserGuide/...
jjanczyszyn

关于(listing included)含义的任何想法,如何仅列出允许用户进入的存储桶?到目前为止(并根据所有其他答案),AWS似乎不允许您这样做。
MaximeBernard 2015年


3

我找到了以下解决方案:
AWS FLOW:
AWS流

值区政策:

{
  "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角色名--profile = ExampleProfile

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

PS注意存储桶策略,您可以在没有权限的情况下不使用



1

我设法使以下工作。意味着列出其他存储桶会收到“访问被拒绝”消息。但是,如果我使用设置为路径的存储桶名称进行连接,仍然能够看到我想要的存储桶。

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


1

虽然无法将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-1以及my-bucket-2向其提供读写访问权限。

有关:


1

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

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

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/


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

0

我只是添加了一个类似的需求,可以通过以下方式解决:

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

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

0

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

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

0

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

我选择要求客户端显式使用存储桶名称。



-1

这对我来说很完美。用户可以上传,下载并获取文件列表,但无法查看其他存储桶中的文件。

 {    

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

}
]
}      

-2

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

{
    “ Version”:“ 2012-10-17”,
    “声明”:[
        {
            “效果”:“允许”,
            “ Action”:“ s3:*”,
            “资源”:“ *”
        },
        {
            “效果”:“拒绝”,
            “ Action”:“ s3:*”,
            “资源”:[
                “ arn:aws:s3 :::: bucket-name”,
                “ arn:aws:s3 ::: bucket-name / *”
            ]
        }
    ]
}

1
您应该明确授予对资源的访问权限。当您默认授予对所有资源的访问权限时,您可能会意外地忽略要保留为私有的资源。此外,授予所有S3操作访问权限意味着用户可以公开资源或设置静态托管或进行其他有害操作。
OndrejGalbavý”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.