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

Reu*_*ine 2 amazon-s3 amazon-web-services

我想允许公共读取访问我的 S3 存储桶(2 个文件夹除外)。

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

有没有办法定义这个?

Joh*_*ein 6

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

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

您的用例适合存储桶策略

您可以使用如下策略授予对整个 Amazon S3 存储桶的访问权限:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

您可以根据 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"} 
      } 
    } 
  ]
}
Run Code Online (Sandbox Code Playgroud)

您希望“允许公共读取访问我的 S3 存储桶(2 个文件夹除外)”的情况稍微困难一些,因为它是“除 之外的所有内容”用例。

选项 1:特定文件夹

  • 授予对特定文件夹的公共访问权限,并且
  • 授予对特定文件夹的受限访问权限

例如:

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

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

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

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

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