适用于 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(正在获得权限)属于拥有存储桶的 AWS 账户,则该条件权限不是必需的。这是因为,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
" } } } ] }
使用 AWS CLI 测试策略
如果您有两个 AWS 账户,则可使用 AWS Command Line Interface (AWS CLI) 测试此策略。您可以附加此策略,并使用 Dave 的凭证通过以下 AWS CLI put-object
命令测试权限。通过添加 --profile
参数提供 Dave 的凭证。通过添加 --grant-full-control
参数可向存储桶拥有者授予完全控制权限。有关设置和使用 AWS CLI 的更多信息,请参阅《Amazon S3 API 参考》中的 Developing with Amazon S3 using the AWS CLI。
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" } }
要使用 AWS CLI 测试权限,则指定 --acl
参数。然后 AWS 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
标头,则以下存储桶策略向两个 AWS 账户授予 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 条件。