使用 Cloudfront 限制对 S3 存储桶的访问

Posted

技术标签:

【中文标题】使用 Cloudfront 限制对 S3 存储桶的访问【英文标题】:Using Cloudfront to restrict access to S3 bucket 【发布时间】:2019-04-23 09:06:45 【问题描述】:

我正在尝试使用 CloudFront 从 S3 存储桶交付静态资产。正如我最初发现的那样,存储桶是公共的,并且具有以下公共访问设置:

这是我最初遇到的存储桶策略:


   "Version": "2012-10-17",
   "Statement": [
       
           "Sid": "AddPerm",
           "Effect": "Allow",
           "Principal": "*",
           "Action": "s3:GetObject",
           "Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
       ,
       
           "Sid": "2",
           "Effect": "Allow",
           "Principal": 
               "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3KB5KQ622F9F3"
        ,
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
    ]

现在这就是我所做的:

    通过创建新的源访问身份创建了具有适当源域名和限制存储桶访问的新 CloudFront 分配。 根据doc examples 更新了 S3 存储桶策略,以限制对规范用户 ID 的访问。更新后的政策如下所示:

    将 S3 存储桶的所有公共访问设置设置为 true 以使其成为私有。

每当我尝试通过创建的 CDN 访问静态资源时,都会遭到拒绝访问。在提到 AWS documentation 限制通过 CloudFront 访问 S3 存储桶时,我特别困惑他们希望开发人员按照以下说明做什么:

"To specify an origin access identity, use the value of Amazon S3 Canonical User ID 
on the Origin Access Identity page in the CloudFront console." 

【问题讨论】:

错误信息是否可能被 Cloudfront 缓存了? 【参考方案1】:

在回答为原始访问身份查找 Amazon S3 规范用户 ID 的问题时,您可以使用控制台浏览到 CloudFront -> 安全 -> 原始访问身份。或者,您可以使用 CLI 列出

$ aws cloudfront list-cloud-front-origin-access-identities

    "CloudFrontOriginAccessIdentityList": 
        "Items": [
            
                "Comment": "access-identity-..... ", 
                "S3CanonicalUserId": "e9eeea57c92144d.....", 
                "Id": "XXXXXXXXXXXXX"
            
        ]
    

然后,您可以在策略中使用问题中的 S3CanonicalUserId 值。

有趣的是,如果您允许 CloudFront 为您更新策略,您最终会得到一些稍微不同的东西,如果您更新源访问身份 ID,您也可以使用它。


    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        
            "Sid": "2",
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXX"
            ,
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/*"
        
    ]

问题中的所有其他内容看起来都正确,这样就完成了设置。如果您收到 AccessDenied 错误,我建议的下一步是创建一个无效 (enter link description here) 以从 CloudFront 缓存中删除对象。

【讨论】:

以上是关于使用 Cloudfront 限制对 S3 存储桶的访问的主要内容,如果未能解决你的问题,请参考以下文章

没有 S3 存储桶的 AWS Cloudfront CORS 标头

cloudfront 和 s3 301 重定向显示存储桶的裸域

s3 原始存储桶的子目录中的 Cloudfront 默认根对象

如何将 S3 网站的访问限制为 Cloudfront?

Amazon CloudFront 不遵守我的 S3 网站存储桶的 index.html 规则

在 CloudFront 的账户之间共享 S3 存储桶