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

2 分钟阅读
0

我想限制对我的 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。更多信息,请参阅如何使用 CloudFront 为 Amazon S3 上托管的静态网站提供服务?

选项 1(最佳实践): 创建 CloudFront OAC

要创建一个 CloudFront 来源访问控制(OAC),请完成以下步骤:

  1. 打开 CloudFront 控制台
  2. 从分配列表中,选择提供您想要限制访问权限的 S3 存储桶内容的分配。
  3. 选择选项卡。
  4. 选择 S3 源,然后选择编辑
  5. 对于来源访问,选择来源访问控制设置(推荐)
  6. 对于来源访问控制,选择现有的 OAC,或选择创建控制设置。
  7. 在对话框中,命名您的控制设置。最佳实践是将默认设置保留为签署请求(推荐)
  8. 选择创建
  9. 对于 S3 存储桶访问权限,选择复制策略,然后选择保存,以在 S3 存储桶上应用存储桶策略。
  10. 选择前往 S3 存储桶权限,转至 S3 存储桶控制台。
  11. 选择保存更改
  12. Amazon S3 控制台中,从存储桶列表中选择作为 CloudFront 分配源的存储桶。
  13. 选择权限选项卡。
  14. 存储桶策略下,确认您看到的声明与以下内容类似:
{
    "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 从您的存储桶读取对象,您必须添加前面的语句。

**注意:**在限制对存储桶的访问权限后,您可以集成 AWS WAF 以获得另一层安全保护。

选项 2: 创建遗留 CloudFront OAI

要创建遗留 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 的来源访问存储桶。根据您的用例修改这些语句。

相关信息

创建分配

Amazon S3 的身份和访问管理