如何使用特定 VPC 端点或 IP 地址限制对我的 Amazon S3 存储桶的访问?

2 分钟阅读
0

我想阻止任何并非来自特定 Amazon 虚拟私有云(VPC)端点或特定 IP 地址的流量。或者,我正在使用 Amazon Simple Storage Service (Amazon S3) 桶来托管静态网站。必须可从特定的 VPC 端点或 IP 地址访问该网站。

解决方法

**警告:**本文中的示例桶策略显式拒绝除了许可 VPC 端点或 IP 地址之外的任何访问请求。在保存桶策略之前,请务必对其进行仔细审核。

使用桶策略指定哪些 VPC 端点VPC 源 IP 地址外部 IP 地址可以访问 Amazon S3 桶。

**注意:**VPC 源 IP 地址是 VPC 内的私有 IP 地址。私有地址无法通过 Internet 访问,可用于 VPC 中实例之间的通信。例如,私有 IP 地址可以是 Amazon Elastic Compute Cloud (Amazon EC2) 实例的私有 IP 地址。

外部 IP 地址是公有 IP 地址,可以来自 VPC 内部,也可以来自 VPC 外部。例如,外部 IP 地址可以是 Amazon Elastic Compute Cloud (Amazon EC2) 实例的弹性或公有 IP 地址。或者,外部 IP 地址可以是 VPC 的 NAT 网关或代理服务器的 IP 地址。

以下示例桶策略会阻止流向桶的流量,除非请求来自指定的 VPC 端点 (aws:sourceVpce):

{
  "Id": "VPCe",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VPCe",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": [
            "vpce-1111111",
            "vpce-2222222"
          ]
        }
      },
      "Principal": "*"
    }
  ]
}

注意:

除非请求来自指定的私有 IP 地址 (aws:VpcSourceIp),否则以下示桶策略会阻止流向存储桶的流量:

{
  "Id": "VpcSourceIp",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VpcSourceIp",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "NotIpAddress": {
          "aws:VpcSourceIp": [
            "10.1.1.1/32",
            "172.1.1.1/32"
          ]
        }
      },
      "Principal": "*"
    }
  ]
}

**注意:**要将此策略与 aws:VpcSourceIP 条件一起使用,您必须附加一个 Amazon S3 VPC 端点。VPC 端点必须附加到 EC2 实例子网的路由表,并且与桶位于同一 AWS 区域。

除非请求来自指定的外部 IP 地址 (aws:SourceIp),否则以下示例桶策略会阻止流向存储桶的流量:

{
  "Id": "SourceIP",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SourceIP",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "11.11.11.11/32",
            "22.22.22.22/32"
          ]
        }
      },
      "Principal": "*"
    }
  ]
}

**警告:**这些示例桶策略显式拒绝除了许可 VPC 端点或 IP 地址之外的任何访问请求。如果用户不满足条件,即使是输入桶策略的用户也可能会被拒绝访问桶。因此,在保存桶策略之前,请务必对其进行仔细审核。如果您被意外锁定,请参阅我意外拒绝了所有人对我的 Amazon S3 桶的访问。如何重新获得访问权限?

如果您必须允许特定用户(在同一 AWS 账户内)访问桶,则在 Condition 块中添加以下语句:

  • AROAEXAMPLEID 是您想要允许的 IAM 角色的角色 ID
  • AIDAEXAMPLEID 是您想要允许的 IAM 用户的用户 ID
  • 111111111111 是桶的 AWS 账户 ID,代表该 AWS 账户根用户的凭证

例如:

"Condition": {
            "StringNotLike": {
                "aws:userId": [
                    "AROAEXAMPLEID:*",
                    "AIDAEXAMPLEID",
                    "111111111111"
                ]
            }
        }

有关向特定 IAM 角色授予访问权限的更多信息,请参阅如何将 Amazon S3 桶的访问权限限制到特定 IAM 角色

相关信息

VPC 端点

AWS 官方
AWS 官方已更新 2 年前