

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# ACL 的政策範例
<a name="example-bucket-policies-condition-keys"></a>

您可以在儲存貯體政策中使用條件索引鍵來控制對 Amazon S3 的存取。

**Topics**
+ [授予條件為要求儲存貯體擁有者取得完全控制權的 s3:PutObject 許可](#grant-putobject-conditionally-1)
+ [授予條件為 x-amz-acl 標頭的 s3:PutObject 許可](#example-acl-header)

## 授予條件為要求儲存貯體擁有者取得完全控制權的 s3:PutObject 許可
<a name="grant-putobject-conditionally-1"></a>

[PUT 物件](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html)操作允許存取控制清單 (ACL) 特定的標頭，可用來授予以 ACL 為基礎的許可。使用這些金鑰，儲存貯體擁有者可設定條件，在使用者上傳物件時要求特定的存取許可。

假設帳戶 A 擁有一個儲存貯體，而帳戶管理員希望將上傳物件的許可授予帳戶 B 的使用者 Dave。根據預設，Dave 上傳的物件是為帳戶 B 所擁有，而帳戶 A 沒有這些物件的許可。因為付費的是儲存貯體擁有者，它希望有 Dave 上傳之物件的完整許可。帳戶 A 管理員只要將 `s3:PutObject` 許可授予 Dave，附帶要求包含 ACL 專屬標頭的條件，明確授予完整許可或指定使用固定的 ACL，即可完成此操作。如需詳細資訊，請參閱 [PUT 物件](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 的登入資料，使用以下`put-object`命令來測試許可 AWS CLI 。您可以新增 `--profile` 參數，來提供 Dave 的憑證。您可以透過新增 `--grant-full-control` 參數，授予儲存貯體擁有者的完全控制許可。如需設定和使用 的詳細資訊 AWS CLI，請參閱《[Amazon S3 API 參考》中的使用 AWS CLI 與 Amazon S3 一起開發](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)。 *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 標頭
<a name="require-x-amz-acl-header"></a>

您可以要求有固定 ACL 的 `x-amz-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
```

## 授予條件為 x-amz-acl 標頭的 s3:PutObject 許可
<a name="example-acl-header"></a>

 AWS 帳戶 如果請求包含讓物件可公開讀取的 `x-amz-acl` 標頭，則下列儲存貯體政策會授予兩個 的 `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:CreateBucket` Amazon S3 許可的政策中包含 `s3:LocationConstraint` 條件有意義。但在授予 `s3:GetObject` 許可的政策中包含此條件就沒意義。Amazon S3 可以測試這類涉及 Amazon S3 特定條件的語意錯誤。但是，如果您為 IAM 使用者或角色建立政策，但包含語意無效的 Amazon S3 條件，則不會回報任何錯誤，因為 IAM 無法驗證 Amazon S3 條件。