适用于 ACL 的策略示例 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

适用于 ACL 的策略示例

您可在存储桶策略中使用条件键来控制针对 Amazon S3 的访问权限。

授予 s3:PutObject 权限,指定了要求存储桶拥有者获得完全控制的条件

PUT Object 操作允许特定于访问控制列表 (ACL) 的标头,可用于授予基于 ACL 的权限。通过使用这些键,存储桶拥有者可设置条件,要求用户上传对象时需具有特定访问权限。

假设账户 A 拥有一个存储桶,而账户管理员想要授予账户 B 中的用户 Dave 上传对象的权限。默认情况下,Dave 上传的对象由账户 B 拥有,而账户 A 对这些对象没有权限。由于存储桶拥有者要支付账单,需要对 Dave 上传的对象具有全部权限。要实现这一目的,账户 A 管理员可向 Dave 授予 s3:PutObject 权限,指定的条件要求请求包含 ACL 特定标头(用于显式授予全部权限)或使用标准 ACL。有关更多信息,请参阅 PUT Object

需要 x-amz-full-control 标头

您可以要求在请求中具有 x-amz-full-control 标头,授予存储桶拥有者完全控制权限。以下存储桶策略向用户 Dave 授予 s3:PutObject 权限,使用 s3:x-amz-grant-full-control 条件键指定了条件,要求此请求包含 x-amz-full-control 标头。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/Dave" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
注意

此示例是关于跨账户权限的。不过,如果 Dave(正在获得权限)属于拥有存储桶的 Amazon Web Services 账户,则该条件权限不是必需的。这是因为,Dave 所属的父账户拥有用户上传的对象。

添加显式拒绝

上述存储桶策略向账户 B 中的用户 Dave 授予条件权限。当该策略生效时,Dave 可通过其他某个策略获得没有任何条件的相同权限。例如,Dave 可能属于一个组,并且您为该组授予 s3:PutObject 权限而没有指定任何条件。为避免这些权限漏洞,可通过添加显式拒绝编写更严格的访问策略。在该示例中,如果用户 Dave 的请求没有包含必要标头向存储桶拥有者授予全部权限,则您显式拒绝他的上传权限。显式拒绝始终取代授予的其他任何权限。以下是添加了显式拒绝的经修订的访问策略示例。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } }, { "Sid": "statement2", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::awsexamplebucket1/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID" } } } ] }
使用 Amazon CLI 测试策略

如果您有两个 Amazon Web Services 账户,则可使用 Amazon Command Line Interface (Amazon CLI) 测试此策略。您可以附加此策略,并使用 Dave 的凭证通过以下 Amazon CLI put-object 命令测试权限。通过添加 --profile参数提供 Dave 的凭证。通过添加 --grant-full-control 参数可向存储桶拥有者授予完全控制权限。有关设置和使用 Amazon CLI 的更多信息,请参阅 使用 Amazon CLI 进行 Amazon S3 开发

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBUserProfile

需要 x-amz-acl 标头

您可以要求 x-amz-acl 标头,带有向存储桶拥有者授予完全控制权限的标准 ACL。如果要求在请求中使用 x-amz-acl 标头,您可以替换 Condition 块中的键值对并指定 s3:x-amz-acl 条件键,如以下示例中所示。

"Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } }

要使用 Amazon CLI 测试权限,则指定 --acl 参数。然后 Amazon CLI 在其发送此请求时添加 x-amz-acl 标头。

aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body c:\HappyFace.jpg --acl "bucket-owner-full-control" --profile AccountBadmin

授予 s3:PutObject 权限,指定了关于 x-amz-acl 标头的条件

如果请求包含可使对象公开可读的 x-amz-acl 标头,则以下存储桶策略向两个 Amazon Web Services 账户授予 s3:PutObject 权限。Condition 块使用 StringEquals 条件,并且提供键值对 "s3:x-amz-acl":["public-read"],以进行评估。在该键值对中,s3:x-amz-acl 是特定于 Amazon S3 的键,如前缀 s3: 所示。

{ "Version":"2012-10-17", "Statement": [ { "Sid":"AddCannedAcl", "Effect":"Allow", "Principal": { "AWS": [ "arn:aws:iam::Account1-ID:root", "arn:aws:iam::Account2-ID:root" ] }, "Action":"s3:PutObject", "Resource": ["arn:aws:s3:::awsexamplebucket1/*"], "Condition": { "StringEquals": { "s3:x-amz-acl":["public-read"] } } } ] }
重要

并非所有条件对所有操作都有意义。例如,在授予 s3:CreateBucket Amazon S3 权限的策略上包含 s3:LocationConstraint 条件是有意义的。但是,在授予 s3:GetObject 权限的策略中包含此条件没有意义。Amazon S3 可测试是否存在此类涉及 Amazon S3 特定条件的语义错误。但如果要创建针对 IAM 用户或角色的策略,并且包含了语义上无效的 Amazon S3 条件,则不报告错误,因为 IAM 无法验证 Amazon S3 条件。