有没有办法在 AWS S3 上托管一个静态网站而不提供公共访问权限?

Posted

技术标签:

【中文标题】有没有办法在 AWS S3 上托管一个静态网站而不提供公共访问权限?【英文标题】:Is there any way to host a static wesbite on AWS S3 without giving public access? 【发布时间】:2021-11-06 03:29:30 【问题描述】:

我希望在 Amazon S3 上托管一个静态网站,但实际上不向公众提供对存储桶的访问权限。我正在使用一个客户端 AWS 帐户,其中所有存储桶都已公开访问被阻止,当我尝试将我的存储桶配置为公共时,它会将我重定向到我必须授予对所有存储桶的公开访问权限的页面。

【问题讨论】:

您希望您的“静态网站”可以公开访问吗?如果是这样,唯一的方法就是将其公开。如果您不希望它公开,您希望如何确定用户是否可以访问它? @JohnRotenstein 我希望静态内容可以公开访问,但对 s3 存储桶的公开访问不能公开,这就是 CloudFront 的用武之地 【参考方案1】:

仅谈到托管静态站点的 1 个 S3 存储桶,您可以在“权限”选项卡下添加存储桶策略,允许或禁止 IP 地址。这里有一些很好的示例,我添加了一个允许某些 IP 的简化示例。在这种情况下,授予对其他账户的 VPC NAT 网关 IP 地址的访问权限应该可以工作。 https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html


  "Id":"PolicyId54",
  "Version":"2012-10-17",
  "Statement":[
    
      "Sid":"AllowIPmix",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:*",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": 
        "IpAddress": 
          "aws:SourceIp": [
            "54.240.143.0/24",
            "2001:DB8:1234:5678::/64"
          ]
        
      
    
  ]

请注意,您仍然关闭了“阻止公共访问”以及上述政策。

【讨论】:

s3:* 授予匿名用户是危险的。如前所述,此策略将允许来自指定 IP 的匿名用户从存储桶中删除对象。我确定这不是 OP 想要的。 @jscott 同意了。我应该澄清一下。您可以授予对其他账户的 VPC NAT 网关 IP 地址的访问权限。我已经相应地更新了我的答案。 OP 在 cmets 中澄清了该网站需要公开访问的问题。这仍然不是一个好的答案。 @jscott 在原始问题中不清楚。之后才在 cmets 中澄清。因此,根据未澄清的原始问题,这是一个合理的答案。我在澄清之前回答了。【参考方案2】:

您可以使用Amazon CloudFront 分发来前置您的静态网站。除了提供集成 CDN 的优势外,您还可以配置 Origin Access Identity,以确保存储桶只能通过 CloudFront 访问,而不能通过公共 S3 访问。

【讨论】:

【参考方案3】:

与@PaulG 所说的类似,您还可以包含一个包含sourceVpc 条件的存储桶策略,它允许您为存储桶设置一个 vpc 端点,并且只能从该 VPC 访问存储桶。我记得几个月前测试过这个设置,它只能从 vpc 访问网站。

【讨论】:

以上是关于有没有办法在 AWS S3 上托管一个静态网站而不提供公共访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudFront 和目录重定向的 AWS S3 静态网站托管

有啥方法可以将 AWS Cloudfront 设置为指向静态 IP 地址(在 GoDaddy 上托管的 WP)?

通过 ElasticBeansStalk 上托管的 API Gateway 在 AWS S3 上上传图像

如何从 AWS S3 上的拒绝访问错误中恢复?

为啥 Cloudflare 不缓存我在 S3 上托管的图像

在 ec2 上托管的 apache spark 中使用 AWS EMRFS