有没有办法在 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)?