我应该公开我的S3存储桶以进行静态网站托管吗?

时间:2019-09-18 17:44:52

标签: amazon-web-services amazon-s3

我有一个s3存储桶,用于托管通过Cloudfront访问的静态站点。 我希望使用s3 <RoutingRules>将任何404重定向到请求主机名的根。为此,我需要将cloudfront来源设置为使用s3“网站端点”。

但是,为了使Cloudfront能够通过“网站终结点”而非“ s3 REST API终结点”访问s3存储桶,我需要显式将存储桶公开,即使用以下策略规则: / p>

{
            "Sid": "AllowPublicGetObject",
            "Effect": "Allow",
            "Principal": {
                        "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dev.ts3.online-test/*"
},
{
            "Sid": "AllowPublicListBucket",
            "Effect": "Allow",
            "Principal": {
                        "AWS": "*"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::dev.ts3.online-test"
}

一切都很好。有用。但是,AWS给了我一个很好的闪亮警告:

  

此存储桶具有公共访问权限。您已提供对此存储桶的公共访问权限。我们强烈建议您不要授予对S3存储桶的任何公开访问权限。

所以我有两个问题:

  1. 当然应该警告此警告,这只是AWS方面的惰性吗?存储桶中的所有内容都是可以自由请求的静态文件。存储桶中没有受保护的内容或秘密内容。我不明白为什么公开阅读绝对是一个安全漏洞...
  2. 为了让您高枕无忧,有什么方法可以在存储桶策略中指定仅将其授予cloudfront的principalId? (我知道如果我使用REST端点,可以将其设置为OAI,但不能使用其余端点)

1 个答案:

答案 0 :(得分:1)

关于警告的第一件事。

列表存储桶视图显示您的存储桶是否可公开访问。 Amazon S3将存储桶的权限标记如下:

公共–

  • 每个人都可以访问以下一项或多项:列出对象,写入对象,读取和写入权限。

对象可以是公共的–:

  • 存储桶不是公共的,但是具有适当权限的任何人都可以授予对对象的公共访问权限。

不公开的桶和物件–: -存储桶和对象没有任何公共访问权限。

此帐户的唯一授权用户–:

  • 由于该策略授予公共访问权限,因此访问隔离到了IAM用户以及此帐户和AWS服务主体中的角色。

因此,由于第一个警告。以下是AWS针对s3静态网站推荐的政策。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/*"
            ]
        }
    ]
}
  

向网站存储桶添加存储桶策略,该策略授予所有人访问权限   到存储桶中的对象。当您将存储桶配置为   网站上,您必须公开制作要公开投放的对象   可读的。为此,您编写了一个桶策略,授予每个人   s3:GetObject权限。以下示例存储桶策略授权   每个人都可以访问示例存储桶中的对象。

BTW的公共访问权限只能是 GET ,而不能是其他任何东西,完全允许 GET 请求在S3上访问您的静态网站。

enter image description here static-website-hosting