配置使用接入点的 IAM 策略 - Amazon Simple Storage Service

配置使用接入点的 IAM 策略

Amazon S3 接入点支持 AWS Identity and Access Management(IAM)资源策略,这些策略允许您按资源、用户或其他条件控制接入点的使用。要使应用程序或用户能够通过接入点访问对象,接入点和底层存储桶都必须允许请求。

重要

当通过存储桶的名称或 Amazon 资源名称(ARN)直接访问存储桶时,向存储桶添加 S3 接入点不会改变存储桶的行为。针对存储桶的所有现有操作将继续像以前一样运行。您在接入点策略中包括的限制仅适用于通过该接入点发出的请求。

当您使用 IAM 资源策略时,确保在保存策略之前解决来自 AWS Identity and Access Management Access Analyzer 的安全警告、错误、一般警告和建议。IAM Access Analyzer 将根据 IAM 策略语法最佳实践运行策略检查,以验证您的策略。这些检查项生成调查结果并提供建议,可帮助您编写可操作且符合安全最佳实践的策略。

要了解有关使用 IAM Access Analyzer 验证策略的更多信息,请参阅《IAM 用户指南》中的 IAM Access Analyzer 策略验证。要查看 IAM Access Analyzer 返回的警告、错误和建议的列表,请参阅 IAM Access Analyzer 策略检查引用

接入点策略示例

以下示例演示如何创建 IAM 策略来控制通过接入点发出的请求。

注意

在接入点策略中授予的权限仅在底层存储桶也允许相同的访问时才有效。您可以通过两种方式实现这一点:

  1. (推荐)将存储桶的访问控制委派给接入点,如将访问控制委派到接入点中所述。

  2. 将接入点策略中包含的权限添加到底层存储桶的策略中。示例 1 接入点策略示例说明了如何修改底层存储桶策略以允许必要的访问。

例 1 – 接入点策略授予

以下接入点策略通过账户 123456789012 中的接入点 my-access-point 向账户 123456789012 中的 IAM 用户 Jane 授予对具有前缀 Jane/GETPUT 对象的权限。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Jane" }, "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/Jane/*" }] }
注意

要使接入点策略有效地向 Jane 授予访问权限,底层存储桶也必须对 Jane 允许相同的访问权限。可以将存储桶的访问控制委派到接入点,如将访问控制委派到接入点中所述。或者,您也可以将以下策略添加到底层存储桶中,以便向 Jane 授予必要的权限。请注意,接入点策略和存储桶策略的 Resource 条目不同。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Jane" }, "Action": ["s3:GetObject", "s3:PutObject"], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/Jane/*" }] }
例 2 – 带标签条件的接入点策略

以下接入点策略通过账户 123456789012 中的接入点 my-access-point 向账户 123456789012 中的 IAM 用户 Mateo 授予对 GET 对象的权限,这些权限具有值设为 finance 的标签键 data

{ "Version":"2012-10-17", "Statement": [ { "Effect":"Allow", "Principal" : { "AWS": "arn:aws:iam::123456789012:user/Mateo" }, "Action":"s3:GetObject", "Resource" : "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/*", "Condition" : { "StringEquals": { "s3:ExistingObjectTag/data": "finance" } } }] }
例 3 – 允许查看存储桶列示内容的接入点策略

以下接入点策略通过账户 123456789012 中的接入点 my-access-point 授予账户 123456789012 中的 IAM 用户 Arnav 查看底层存储桶中包含的对象的权限。

{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/Arnav" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point" }] }
例 4 – 服务控制策略

以下服务控制策略要求使用虚拟私有云(VPC)网络起源创建所有新的接入点。实施此策略时,组织中的用户无法创建可从 Internet 访问的新接入点。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "s3:CreateAccessPoint", "Resource": "*", "Condition": { "StringNotEquals": { "s3:AccessPointNetworkOrigin": "VPC" } } }] }
例 5 – 将 S3 操作限制为 VPC 网络起源的存储桶策略

以下存储桶策略限制为只能通过具有 VPC 网络起源的接入点来访问存储桶 amzn-s3-demo-bucket 的所有 S3 对象操作。

重要

在使用类似于此示例所示语句的语句之前,请确保您不需要使用接入点不支持的特征,例如跨区域复制。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": [ "s3:AbortMultipartUpload", "s3:BypassGovernanceRetention", "s3:DeleteObject", "s3:DeleteObjectTagging", "s3:DeleteObjectVersion", "s3:DeleteObjectVersionTagging", "s3:GetObject", "s3:GetObjectAcl", "s3:GetObjectLegalHold", "s3:GetObjectRetention", "s3:GetObjectTagging", "s3:GetObjectVersion", "s3:GetObjectVersionAcl", "s3:GetObjectVersionTagging", "s3:ListMultipartUploadParts", "s3:PutObject", "s3:PutObjectAcl", "s3:PutObjectLegalHold", "s3:PutObjectRetention", "s3:PutObjectTagging", "s3:PutObjectVersionAcl", "s3:PutObjectVersionTagging", "s3:RestoreObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringNotEquals": { "s3:AccessPointNetworkOrigin": "VPC" } } } ] }

条件键

S3 接入点具有条件键,这些键可在 IAM 策略中用来控制对资源的访问。以下条件键仅代表 IAM 策略的一部分。有关完整策略示例,请参阅接入点策略示例将访问控制委派到接入点授予跨账户接入点的权限

s3:DataAccessPointArn

此示例显示一个您可以用来匹配接入点 ARN 的字符串。以下示例匹配区域 us-west-2 中 AWS 账户 123456789012 的所有接入点:

"Condition" : { "StringLike": { "s3:DataAccessPointArn": "arn:aws:s3:us-west-2:123456789012:accesspoint/*" } }
s3:DataAccessPointAccount

此示例显示一个字符串运算符,您可以使用它匹配接入点拥有者的账户 ID。以下示例匹配 AWS 账户 123456789012 拥有的所有接入点。

"Condition" : { "StringEquals": { "s3:DataAccessPointAccount": "123456789012" } }
s3:AccessPointNetworkOrigin

此示例显示一个字符串运算符,您可以使用它来匹配网络起源(InternetVPC)。以下示例仅匹配起源为 VPC 的接入点。

"Condition" : { "StringEquals": { "s3:AccessPointNetworkOrigin": "VPC" } }

有关在 Amazon S3 中使用条件键的更多信息,请参阅《Service Authorization Reference》中的 Actions, resources, and condition keys for Amazon S3

有关按 S3 资源类型对 S3 API 操作的权限的更多信息,请参阅 Amazon S3 API 操作所需的权限

将访问控制委派到接入点

您可以将存储桶的访问控制委托给存储桶的接入点。以下示例存储桶策略允许对存储桶拥有者账户所拥有的所有接入点进行完全访问。因此,对此存储桶的所有访问都由附加到其接入点的策略控制。我们建议您以这种方式为所有不需要直接访问存储桶的使用案例配置存储桶。

例 6 – 将访问控制委派给接入点的存储桶策略
{ "Version": "2012-10-17", "Statement" : [ { "Effect": "Allow", "Principal" : { "AWS": "*" }, "Action" : "*", "Resource" : [ "Bucket ARN", "Bucket ARN/*"], "Condition": { "StringEquals" : { "s3:DataAccessPointAccount" : "Bucket owner's account ID" } } }] }

授予跨账户接入点的权限

要为另一个账户拥有的存储桶创建接入点,您必须首先通过指定存储桶名称和账户拥有者 ID 来创建接入点。然后,存储桶拥有者必须更新存储桶策略以授权来自接入点的请求。创建接入点与创建 DNS CNAME 类似,因为接入点不提供对存储桶内容的访问权限。所有存储桶访问权限均由存储桶策略控制。以下示例存储桶策略允许从受信任 AWS 账户拥有的接入点对存储桶进行 GETLIST 请求。

Bucket ARN 替换为桶的 ARN。

例 7 – 将权限委托给其他 AWS 账户的存储桶策略
{ "Version": "2012-10-17", "Statement" : [ { "Effect": "Allow", "Principal" : { "AWS": "*" }, "Action" : ["s3:GetObject","s3:ListBucket"], "Resource" : [ "Bucket ARN", "Bucket ARN/*"], "Condition": { "StringEquals" : { "s3:DataAccessPointAccount" : "Access point owner's account ID" } } }] }