我想限制对我的 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),请完成以下步骤:
- 打开 CloudFront 控制台。
- 从分配列表中,选择提供您想要限制访问权限的 S3 存储桶内容的分配。
- 选择源选项卡。
- 选择 S3 源,然后选择编辑。
- 对于来源访问,选择来源访问控制设置(推荐)。
- 对于来源访问控制,选择现有的 OAC,或选择创建控制设置。
- 在对话框中,命名您的控制设置。最佳实践是将默认设置保留为签署请求(推荐)。
- 选择创建。
- 对于 S3 存储桶访问权限,选择复制策略,然后选择保存,以在 S3 存储桶上应用存储桶策略。
- 选择前往 S3 存储桶权限,转至 S3 存储桶控制台。
- 选择保存更改。
- 在 Amazon S3 控制台中,从存储桶列表中选择作为 CloudFront 分配源的存储桶。
- 选择权限选项卡。
- 在存储桶策略下,确认您看到的声明与以下内容类似:
{
"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),请完成以下步骤:
- 打开 CloudFront 控制台。
- 从分配列表中,选择提供您想要限制访问权限的 S3 存储桶内容的分配。
- 选择源选项卡。
- 选择 S3 源,然后选择编辑。
- 对于来源访问,选择遗留访问身份。
- 在来源访问身份下拉列表中,选择来源访问身份名称。然后,选择创建新的 OAI。
- 在对话框中,命名新的来源访问身份并选择创建。
- 在存储桶策略处,选择是,更新存储桶策略。
- 选择保存更改。
- 在 Amazon S3 控制台中,从存储桶列表中选择作为 CloudFront 分配源的存储桶。
- 选择权限选项卡。
- 在存储桶策略下,确认您看到的声明与以下内容类似:
{{
"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 的身份和访问管理