我想限制对 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 控制台。
- 从分配列表中,选择用于从要限制访问的 S3 存储桶中提供内容的分配。
- 选择源选项卡。
- 选择 S3 源,然后选择 Edit(编辑)。
- 对于 Origin Access(来源访问),选择 Origin access control settings (recommended)(来源访问控制设置(推荐))。
- 对于 Origin access control(来源访问控制),选择现有 OAC,或选择 Create Control(创建控制)设置。
- 在对话框中,命名您的控制设置。最佳实践是保留默认设置签署请求(推荐)。然后,选择创建。
- 对于 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 从您的存储桶读取对象。
**注意:**使用 CloudFront OAC 限制对存储桶的访问后,可以选择通过集成 AWS WAF 来添加另一层安全性。
选项 2:创建原有 CloudFront 来源访问身份 (OAI)
- 打开 CloudFront 控制台。
- 从分配列表中,选择用于从要限制访问的 S3 存储桶中提供内容的分配。
- 选择源选项卡。
- 选择 S3 origin(S3 源),然后选择 Edit(编辑)。
- 对于来源访问,选择 Legacy access identities(遗留访问身份)。
- 在 Origin access identity(来源访问身份)下拉列表中,选择来源访问身份名称,或选择 Create new OAI(创建新的 OAI)。
- 在对话框中,命名新的来源访问身份,然后选择 Create(创建)。
- 对于存储桶策略,选择是,更新存储桶策略。
- 选择保存更改。
- 在 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 中的 Identity and Access Management