

# 适用于 ACL 的策略示例
<a name="example-bucket-policies-condition-keys"></a>

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

**Topics**
+ [授予 s3:PutObject 权限，指定了要求存储桶拥有者获得完全控制的条件](#grant-putobject-conditionally-1)
+ [授予 s3:PutObject 权限，指定了关于 x-amz-acl 标头的条件](#example-acl-header)

## 授予 s3:PutObject 权限，指定了要求存储桶拥有者获得完全控制的条件
<a name="grant-putobject-conditionally-1"></a>

[PUT Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html) 操作允许特定于访问控制列表 (ACL) 的标头，可用于授予基于 ACL 的权限。通过使用这些键，存储桶拥有者可设置条件，要求用户上传对象时需具有特定访问权限。

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

### 需要 x-amz-full-control 标头
<a name="require-x-amz-full-control"></a>

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

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333: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 的请求没有包含必要标头向存储桶拥有者授予全部权限，则您显式拒绝他的上传权限。显式拒绝始终取代授予的其他任何权限。以下是添加了显式拒绝的经修订的访问策略示例。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333: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::111122223333: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](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)。

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

### 需要 x-amz-acl 标头
<a name="require-x-amz-acl-header"></a>

您可以要求 `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 标头的条件
<a name="example-acl-header"></a>

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

------
#### [ JSON ]

****  

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

------

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