为什么即使我将访问权限限制为特定 Amazon VPC,我在 Amazon S3 上的静态网站仍然可以从公有 IP 地址访问?

2 分钟阅读
0

我使用 Amazon Simple Storage Service (Amazon S3) 托管我的静态网站。我附加了一个桶策略,其将访问权限限制为仅特定 Amazon Virtual Private Cloud (Amazon VPC)。但是,我仍然能从公有 IP 地址访问该网站。

解决方法

在排查问题之前,请务必完成以下步骤:

  • 清除 Web 浏览器或代理缓存,以便查看最新配置。
  • 确认您从中访问桶的 Amazon Elastic Compute Cloud (Amazon EC2) 实例与桶位于同一 AWS 区域。
  • VPC 端点关联到您使用的 EC2 实例的路由表。这样,流量就会与桶策略中引用的 VPC ID 相关联。

查看桶策略

确认桶策略允许从 VPC 访问桶。要验证这一点,请查看您的桶策略中的语句。例如,以下桶策略语句允许 s3:GetObject,条件是请求来自 vpc-id123456

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": \[{
    "Sid": "Access-to-Trusted-VPC-only",
    "Effect": "Allow",
    "Principal": "\*",
    "Action": "s3:GetObject\*",
    "Resource": "arn:aws:s3:::awsexamplebucket/\*",
    "Condition": {
      "StringEquals": {
        "aws:sourceVpc": "vpc-id123456"
      }
    }
  }\]
}

**注意:**静态网站托管允许未经身份验证的(匿名)请求。然而,如果用户进行了身份验证,则您可以根据其凭证向他们授予访问权限。例如,假设用户使用具有 Amazon S3 完全访问权限的 AWS Identity and Access Management (IAM) 角色进行身份验证。尽管有以下桶策略,但此用户仍然可以在 VPC 之外下载对象。有关限制性更强的桶策略,请参阅将访问权限限制为特定 VPC。将访问权限限制为特定 VPC 甚至会拒绝管理员或 AWS 账户根用户访问不是来自 VPC 的请求。

检查对象访问控制列表 (ACL)

确认桶策略正确后,请检查是否有任何对象 ACL 允许公有访问。如果某些对象 ACL 允许公有访问,并且您想要覆盖 ACL,请采取以下操作之一:

  • 为单个桶或您的 AWS 账户配置公有访问设置。
  • 向桶策略添加明确的拒绝语句。

如需覆盖对象 ACL,请使用 Amazon S2 控制台配置单个桶的公有访问设置或您的账户的公有访问设置。选择以下选项:

  • 阻止通过_新的_访问控制列表 (ACL) 对桶和对象授予的公有访问权限
  • 阻止通过_任何_访问控制列表 (ACL) 对桶和对象授予的公有访问权限

**注意:**您还可以使用 AWS 命令行界面 (AWS CLI)、AWS SDK 或 Amazon S3 REST API 来配置桶的公有访问设置。有关详细信息,请参阅阻止对您的 Amazon S3 存储的公有访问

如需使用桶策略覆盖对象 ACL,请添加一个语句来在请求不是来自 VPC 时明确拒绝操作。例如,以下桶策略包含一个语句,该语句会在请求不是来自 vpc-id123456 时明确拒绝 s3:GetObject

**警告:**由于此示例桶策略包含显式拒绝语句,因此在保存策略之前,请查看显式访问拒绝的参数。如果您不小心被锁定,请参阅我意外拒绝了所有人对我的 Amazon S3 桶的访问。如何重新获得访问权限?

{
  "Version": "2012-10-17",
  "Id": "Policy1",
  "Statement": \[{
      "Sid": "Access-to-Trusted-VPC-only",
      "Effect": "Allow",
      "Principal": "\*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/\*",
      "Condition": {
        "StringEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    },
    {
      "Sid": "Deny-Access-Except-For-Trusted-VPC",
      "Effect": "Deny",
      "Principal": "\*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::awsexamplebucket/\*",
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpc": "vpc-id123456"
        }
      }
    }
  \]
}

相关信息

AWS Policy Generator

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