创建一个S3存储桶策略,允许Cloudfront访问但限制其他人的访问。

32

我有以下政策:

{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "Stmt1395852960432",
                "Action": "s3:*",
                "Effect": "Deny",
                "Resource": "arn:aws:s3:::my-bucket/*",
                "Principal": {
                    "AWS": [
                        "*"
                    ]
                }
            },
            {
                "Sid": "1",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1IYJC432545JN"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::my-bucket/*"
            }
        ]
    }

然而,这将拒绝所有请求者的请求,包括Cloudfront。正确的做法是什么?

问题是客户端创建对象时具有公共读取权限。我目前无法立即控制客户端以更改此设置。因此,我想要一个覆盖个别对象 ACL 的策略。所以在这里,“默认拒绝”是不起作用的。

3个回答

39

S3策略将类似于以下内容:

{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
    {
        "Sid": "1",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXX"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::YYYYYYYYYYYYY.com/*"
    }
 ]
}

但是,我并没有手动生成这个。当您在CloudFront中添加一个源(S3)时,您有一个选项可以选择“限制Bucket访问” - 在此处选择“Yes”并继续。 CloudFront配置会自动为您完成其余部分。

详情请参阅:使用起源访问标识来限制访问您的Amazon S3内容 - Amazon CloudFront


7
我遇到了同样的问题。AWS手册阅读起来很困难。对我而言,我错过了“Origins”选项卡和添加身份后的“Yes, Update Bucket Policy”选项。 - Dan Tappin

15

这就是你要寻找的内容。用你自己的原始访问ID替换XXXXXXXXXXXXXX。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AddPerm",
        "Effect": "Deny",
        "NotPrincipal": {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXX"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::your.bucket.com/*"
    },
    {
        "Sid": "2",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXX"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::your.bucket.com/*"
    }
]
}

7
如果您仍然收到基于XML的AccessDenied错误,请确保在CloudFront分发的“常规”选项卡下指定默认根对象。 - Andreas
3
将策略添加到 S3 Bucket 后,我仍然通过 CloudFront 域名访问 S3 Bucket 时遭遇了访问被拒绝的问题。 - Tommy Leong
1
我在哪里找到我的CloudFront分发的OAI? - DarkTrick

5

对于那些找不到自己的OAI的人,这可能是一个简单的解决方法(来源:亚马逊

  • 像这样配置您的Bucket:
    • 阻止公共访问:关闭
    • Bucket策略:↓
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<YOUR_BUCKET_NAME>/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::<YOUR_AMAZON_ACCOUNT_ID>:distribution/<CLOUDFRONT_DISTRIBUTION_ID>"
                }
            }
        }
    ]
}
  • Amazon账户ID应该很容易找到,因为它是您的凭据之一。
  • Cloutfront分发ID可以在所有云前分发列表中找到: enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接