如何通过网络限制S3存储桶访问

时间:2017-07-18 19:58:03

标签: amazon-web-services amazon-s3

我想允许对我的S3存储桶进行公共读取访问,但2个文件夹除外。

在2个文件夹中,我想仅允许访问来自特定网络的访问者。

有没有办法定义这个?

1 个答案:

答案 0 :(得分:3)

有几种不同的方式可以授予对存储在Amazon S3中的数据的访问权限:

  • 单个对象本身的权限(不鼓励)
  • 授予访问整个存储桶或目录的
  • 存储桶策略
  • IAM用户政策,授予特定IAM用户/组的权限
  • 预签名网址,授予对象临时的,有时间限制的访问权限(适合以编程方式授予通过应用程序的访问权限)

您的用例适合Bucket Policies

您可以使用以下政策授予对整个Amazon S3广告资源的访问权限

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}

您可以根据一系列IP地址授予访问权限,如下所示:

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::examplebucket/*",
      "Condition": {
         "IpAddress": {"aws:SourceIp": "54.240.143.0/24"},
         "NotIpAddress": {"aws:SourceIp": "54.240.143.188/32"} 
      } 
    } 
  ]
}

您的情况,您希望"允许对我的S3存储桶进行公共读取访问,除了2个文件夹"稍微困难一点,因为它是"除了"用例。

选项1:特定文件夹

  • 授予对特定文件夹的公共访问权限,AND
  • 授予对特定文件夹的限制访问权限

例如:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource":["arn:aws:s3:::examplebucket/folder1/*",
                  "arn:aws:s3:::examplebucket/folder2/*"]
    },
    {
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": ["arn:aws:s3:::examplebucket/folder3/*",
                   "arn:aws:s3:::examplebucket/folder4/*"],
      "Condition": {
         "IpAddress": {"aws:SourceIp": "54.240.143.0/24"} 
      } 
  ]
}

但是,这需要您专门列出每个文件夹。

选项2:除......以外的所有内容

在此规则中,您授予公共访问权限,但如果它们不是来自正确的IP范围,则拒绝某些文件夹:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource":["arn:aws:s3:::examplebucket/*"]
    },
    {
      "Sid": "IPAllow",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": ["arn:aws:s3:::examplebucket/folder3/*",
                   "arn:aws:s3:::examplebucket/folder4/*"],
      "Condition": {
         "NotIpAddress": {"aws:SourceIp": "54.240.143.0/24"} 
      } 
  ]
}

请注意DenyNotIpAddress的使用,如果请求不是来自定义的IP地址范围,则表示拒绝访问。

但是,DENY会覆盖ALLOW,因此这也意味着除非您来自该IP地址范围,否则您将无法访问受限制的存储桶 - 即使您的IAM用户已经过明确授予ALLOW权限。例如,如果您是具有S3中所有权限的管理员,则如果您来自给定的IP范围,仍将拒绝访问受限文件夹。因此,它可能对您来说限制太多,因为它会影响所有使用,即使通过控制台/ API访问也是如此。

相关问题