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

时间:2018-11-20 20:41:15

标签: amazon-web-services amazon-s3 amazon-cloudfront

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

enter image description here

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

{
   "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>/*"
    }]
}

现在这是我所做的:

  1. 通过创建新的Origin Access Identity创建具有适当的原始域名和受限制的存储桶访问权限的新CloudFront分配。
  2. 根据他们的doc examples更新了S3存储桶策略,以限制对规范用户ID的访问。更新后的政策如下所示:

enter image description here

  1. 将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." 

1 个答案:

答案 0 :(得分:0)

为回答为原始访问身份找到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错误,我建议的下一步是创建一个Invalidation(enter link description here),以从CloudFront缓存中删除对象。