限制对 Amazon S3 多区域接入点源的访问
您可以使用源访问控制(OAC)来限制对 Amazon S3 多区域接入点源的访问。S3 多区域接入点提供了一个全局端点,可根据网络延迟将请求路由至最近的 S3 存储桶。
注意
对于由选择加入区域中的存储桶支持的 MRAP 端点,不支持将 OAC 与 S3 多区域接入点结合使用。路由到选择加入区域中的存储桶的请求将失败。与该多区域接入点关联的所有存储桶必须位于默认启用的区域中。
有关将 OAC 与标准 Amazon S3 存储桶源结合使用的信息,请参阅限制对 Amazon S3 源的访问。
先决条件
在创建和设置 OAC 之前,您必须拥有带有 Amazon S3 多区域接入点源的 CloudFront 分配。源域名必须使用 S3 多区域接入点主机名格式:
multi-region-access-point-alias.accesspoint.s3-global.amazonaws.com
有关创建 S3 多区域接入点的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的创建多区域接入点。
向 CloudFront 授予访问 S3 多区域接入点的权限
更新多区域接入点策略,以支持 CloudFront 服务主体 (cloudfront.amazonaws.com) 访问多区域接入点。在策略中使用 Condition 元素,仅在请求代表包含源的 CloudFront 分配时,才支持 CloudFront 访问多区域接入点。
有关添加或修改多区域接入点策略的信息,请参阅《Amazon Simple Storage Service 用户指南》中的多区域接入点策略示例。
例适用于 CloudFront OAC 的多区域接入点策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontOACAccess", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3::111122223333:accesspoint/Multi-Region-Access-Point-Alias.mrap/object/*", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront distribution ID" } } } ] }
向 CloudFront 授予访问底层 S3 存储桶的权限
除了多区域接入点策略外,还必须向 CloudFront 授予访问与多区域接入点关联的每个底层 S3 存储桶的权限。您可以通过两种方式之一来执行此操作:
重要
您必须将此存储桶策略添加到与多区域接入点关联的每个 S3 存储桶中。如果任何存储桶缺少策略,则路由到该存储桶的 CloudFront 请求将遭拒绝。
选项 1:仅向 CloudFront 授予访问权限
向每个 S3 存储桶添加一个存储桶策略,以支持 CloudFront 服务主体访问该存储桶。如果您还需要支持从其它来源直接访问存储桶,请使用此选项。
例底层存储桶的 S3 存储桶策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontOACAccessViaMRAP", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-us-east-1/*", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront distribution ID" } } } ] }
选项 2:将完全存储桶访问权限委托给多区域接入点
向多区域接入点授予对每个底层存储桶的完全访问权限。通过这种方法,对存储桶的所有访问权限都由多区域接入点策略控制,这可简化访问权限管理。对于不需要直接访问存储桶的使用案例,我们建议使用此选项。
例将访问权限委托给多区域接入点的 S3 存储桶策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateAccessToMRAP", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket-us-east-1", "arn:aws:s3:::amzn-s3-demo-bucket-us-east-1/*" ], "Condition": { "StringEquals": { "s3:DataAccessPointArn": "arn:aws:s3::111122223333:accesspoint/Multi-Region-Access-Point-Alias.mrap" } } } ] }
有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的多区域接入点策略示例。
SSE-KMS
如果底层 S3 存储桶中的对象是通过具有 AWS KMS 的服务器端加密(SSE-KMS)进行加密的,您必须确保 CloudFront 分配具有使用 AWS KMS 密钥的权限。由于 S3 多区域接入点可以将请求路由到多个区域中的存储桶,因此您必须在底层存储桶使用 SSE-KMS 的每个区域的 KMS 密钥策略中添加一条声明。有关如何修改密钥策略的信息,请参阅 AWS Key Management Service 开发人员指南 中的更改密钥策略。
例 KMS 密钥政策语句:
以下示例显示了一条 KMS 密钥策略声明,该声明支持具有 OAC 的 CloudFront 分配访问 KMS 密钥来实施 SSE-KMS。
{ "Sid": "AllowCloudFrontServicePrincipalSSE-KMS", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront distribution ID" } } }
重要
在底层 S3 存储桶使用 SSE-KMS 加密的每个区域中,您都必须将此密钥策略声明添加到 KMS 密钥中。
创建源访问控制
要创建源访问控制(OAC),可以使用 AWS 管理控制台、CloudFormation、AWS CLI 或 CloudFront API。
注意
Lambda@Edge 源请求触发器与使用 SigV4a OAC 的源不兼容,无论该源是直接访问还是通过源组访问。
签名行为
S3 多区域接入点源的签名行为选项与常规 Amazon S3 存储桶源的签名行为选项相同。有关更多信息,请参阅限制对 Amazon S3 源的访问中的源访问控制的高级设置。