如何使用我的 CloudFront 分配限制对 Amazon S3 存储桶的访问?

上次更新日期:2023 年 1 月 20 日

我想限制对 Amazon Simple Storage Service (Amazon S3) 存储桶的访问,以便用户只能通过我的 Amazon CloudFront 分配访问对象。

解决方法

重要提示:在开始之前,请确保将 CloudFront 分配的 Amazon S3 源配置为 REST API 端点。例如, AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com。此解决方法不适用于 配置为网站端点的 S3 源。例如, AWSDOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com

选项 1(最佳实践):创建 CloudFront 来源访问控制 (OAC)

  1. 打开 CloudFront 控制台
  2. 从分配列表中,选择用于从要限制访问的 S3 存储桶中提供内容的分配。
  3. 选择选项卡。
  4. 选择 S3 源,然后选择编辑
  5. 对于来源访问,选择来源访问控制设置(推荐)。
  6. 对于来源访问控制,选择现有 OAC,或选择创建控制设置。
  7. 在对话框中,命名您的控制设置。最佳实践是保留默认设置签署请求(推荐)。然后,选择创建
  8. 对于 S3 存储桶访问,在 S3 存储桶上应用存储桶策略。选择复制策略,然后选择保存
  9. 选择转至 S3 存储桶权限,将您带到 S3 存储桶控制台。
  10. 选择保存更改
  11. Amazon S3 控制台中,从您的存储桶列表中,选择作为 CloudFront 分配源的存储桶。
  12. 选择权限选项卡。
  13. 在存储桶策略下,确认您看到类似于以下内容的语句:
{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "AllowCloudFrontServicePrincipalReadOnly",
        "Effect": "Allow",
        "Principal": {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
        "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"
            }
        }
    }
}

您必须添加上述语句才能允许 CloudFront OAC 从您的存储桶读取对象。

注意:使用 CloudFront OAC 限制对存储桶的访问后,可以选择通过集成 AWS WAF 来添加另一层安全性。

选项 2:创建原有 CloudFront 来源访问身份 (OAI)

  1. 打开 CloudFront 控制台
  2. 从分配列表中,选择用于从要限制访问的 S3 存储桶中提供内容的分配。
  3. 选择选项卡。
  4. 选择 S3 源,然后选择编辑
  5. 对于来源访问,选择原有访问身份
  6. 在来源访问身份下拉列表中,选择来源访问身份名称,或选择创建新 OAI
  7. 在对话框中,命名新的来源访问身份,然后选择创建
  8. 对于存储桶策略,选择是,更新存储桶策略
  9. 选择保存更改
  10. Amazon S3 控制台中,从您的存储桶列表中,选择作为 CloudFront 分配源的存储桶。
  11. 选择权限选项卡。
  12. 存储桶策略下,确认您看到类似于以下内容的语句:
{{

"Sid": "1",

"Effect": "Allow",

"Principal": {

"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX"

},

"Action": "s3:GetObject",

"Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/*"

}

注意:在您的存储桶策略中查看是否存在任何包含 "Effect": "Deny" 的语句,这些语句会阻止从 CloudFront OAI 访问存储桶。修改这些语句,以便 CloudFront OAI 能够访问存储桶中的对象。

另外,在您的存储桶策略中查看是否存在任何包含 "Effect": "Allow" 的语句,这些语句允许从除 CloudFront OAI 以外的其他来源访问存储桶。根据使用案例的要求修改这些语句。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?