

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

# 設定和監控目錄儲存貯體的預設加密
<a name="s3-express-bucket-encryption"></a>

根據預設，Amazon S3 儲存貯體皆已啟動儲存貯體加密，且使用伺服器端加密與 Amazon S3 受管金鑰 (SSE-S3) 自動加密新物件。此加密免費適用於 Amazon S3 儲存貯體中的所有新物件。

如果您需要對加密金鑰進行更多控制，例如管理金鑰輪換和存取政策授予，您可以選擇使用伺服器端加密搭配 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS)。

**注意**  
建議儲存貯體的預設加密使用所需的加密組態，而且您不會覆寫 `CreateSession` 請求或 `PUT` 物件請求中的儲存貯體預設加密。然後，新的物件會以所需的加密設定自動加密。如需在目錄儲存貯體中覆寫加密行為的詳細資訊，請參閱[使用 指定伺服器端加密 AWS KMS 以進行新物件上傳](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)。
若要使用 SSE-KMS 加密目錄儲存貯體中的新物件，您必須使用 KMS 金鑰 (特別是客戶自管金鑰) 將 SSE-KMS 指定為目錄儲存貯體的預設加密組態。然後，在為區域端點 API 操作建立工作階段時，系統會在工作階段期間使用 SSE-KMS 和 S3 儲存貯體金鑰自動加密和解密新物件。
當您將預設儲存貯體加密設定為 SSE-KMS 時，目錄儲存貯體中的 `GET` 和 `PUT` 操作一律會啟用 S3 儲存貯體金鑰，且無法停用。當您透過 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)、[https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)、[Batch Operations 中的 Copy 操作](directory-buckets-objects-Batch-Ops.md)或 [import 作業](create-import-job.md)，將 SSE-KMS 加密物件從一般用途儲存貯體複製到目錄儲存貯體、從目錄儲存貯體複製到一般用途儲存貯體或在目錄儲存貯體之間複製時，不支援 S3 儲存貯體金鑰。在此情況下，Amazon S3 AWS KMS 會在每次對 KMS 加密物件提出複製請求時呼叫 。如需 S3 儲存貯體金鑰如何降低 AWS KMS 請求成本的詳細資訊，請參閱 [使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本](bucket-key.md)。
當您在目錄儲存貯體中指定用於加密的 [AWS KMS 客戶自管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)時，請僅使用金鑰 ID 或金鑰 ARN。不支援 KMS 金鑰的金鑰別名格式。
目錄儲存貯體中的預設加密不支援使用 AWS KMS 金鑰的雙層伺服器端加密 (DSSE-KMS) 和使用客戶提供金鑰的伺服器端加密 (SSE-C)。

如需設定預設加密的詳細資訊，請參閱[設定預設加密](default-bucket-encryption.md)。

如需預設加密所需許可的詳細資訊，請參閱 Amazon Simple Storage Service API 參考**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)。

您可以使用 Amazon S3 主控台、 AWS SDKs、Amazon S3 REST API 和 AWS Command Line Interface () 來S3Amazon S3 儲存貯體的 Amazon S3 預設加密AWS CLI。

## 使用 S3 主控台
<a name="s3-express-bucket-encryption-how-to-set-up-console"></a>

**設定 Amazon S3 儲存貯體的預設加密**

1. 登入 AWS 管理主控台 ，並在 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)：// 開啟 Amazon S3 主控台。

1. 在左側導覽窗格中，選擇 **Buckets** (儲存貯體)。

1. 在 **Buckets** (儲存貯體) 清單中，選擇您所需的儲存貯體名稱。

1. 選擇**屬性**索引標籤。

1. 在**伺服器端加密設定**下，目錄儲存貯體會使用 **Amazon S3 受管金鑰的伺服器端加密 (SSE-S3)**。

1. 選擇**儲存變更**。

## 使用 AWS CLI
<a name="s3-express-default-bucket-encryption-cli"></a>

這些範例說明如何使用 SSE-S3 或具有 S3 儲存貯體金鑰的 SSE-KMS 來設定預設加密。

如需預設加密的詳細資訊，請參閱[對 Amazon S3 儲存貯體設定預設伺服器端加密行為](bucket-encryption.md)。如需使用 AWS CLI 設定預設加密的詳細資訊，請參閱 [put-bucket-encryption](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-encryption.html)。

**Example – 使用 SSE-S3 預設加密**  
此範例會使用 Amazon S3 受管金鑰設定預設儲存貯體加密。若要使用此命令，請以您自己的資訊取代*使用者輸入預留位置*。  

```
aws s3api put-bucket-encryption --bucket bucket-base-name--zone-id--x-s3 --server-side-encryption-configuration '{
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
            }
        }
    ]
}'
```

**Example – 使用 S3 儲存貯體金鑰以 SSE-KMS 預設加密**  
此範例會使用 S3 儲存貯體金鑰，以 SSE-KMS 設定預設儲存貯體加密。若要使用此命令，請以您自己的資訊取代*使用者輸入預留位置*。  

```
aws s3api put-bucket-encryption --bucket bucket-base-name--zone-id--x-s3 --server-side-encryption-configuration '{
    "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms",
                    "KMSMasterKeyID": "KMS-Key-ARN"
                },
                "BucketKeyEnabled": true
            }
        ]
    }'
```

## 使用 REST API
<a name="s3-express-bucket-encryption-how-to-set-up-api"></a>

使用 REST API `PutBucketEncryption` 操作，將預設加密設定為要使用的伺服器端加密類型 (SSE-S3 或 SSE-KMS)。

如需詳細資訊，請參閱 Amazon Simple Storage Service API 參考**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html)。

## 使用 AWS SDKs
<a name="s3-express-kms-put-bucket-encryption-using-sdks"></a>

使用 AWS SDKs時，您可以請求 Amazon S3 使用 AWS KMS keys 進行伺服器端加密。下列適用於 Java 和 .NET AWS SDKs 範例使用 SSE-KMS 和 S3 儲存貯體金鑰設定目錄儲存貯體的預設加密組態。如需其他 SDKs的資訊，請參閱 AWS 開發人員中心上的[範例程式碼和程式庫](https://aws.amazon.com/code)。

**重要**  
當您在 Amazon S3 中使用 AWS KMS key 進行伺服器端加密時，您必須選擇對稱加密 KMS 金鑰。Amazon S3 只支援對稱加密 KMS 金鑰。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的[對稱加密 KMS 金鑰](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)。

------
#### [ Java ]

透過 AWS SDK for Java 2.x，您可以使用 `applyServerSideEncryptionByDefault`方法來指定目錄儲存貯體的預設加密組態，以使用 SSE-KMS 進行資料加密， AWS KMS key 以請求 Amazon S3 使用 。您可以建立對稱加密 KMS 金鑰，並在請求中指定該金鑰。

```
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutBucketEncryptionRequest;
import software.amazon.awssdk.services.s3.model.ServerSideEncryption;
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionByDefault;
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionConfiguration;
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionRule;

public class Main {
    public static void main(String[] args) {
        S3Client s3 = S3Client.create();
        String bucketName = "bucket-base-name--zoneid--x-s3";
        String kmsKeyId = "your-kms-customer-managed-key-id";

        // AWS managed KMS keys aren't supported. Only customer-managed keys are supported.
        ServerSideEncryptionByDefault serverSideEncryptionByDefault = ServerSideEncryptionByDefault.builder()
                .sseAlgorithm(ServerSideEncryption.AWS_KMS)
                .kmsMasterKeyID(kmsKeyId)
                .build();

        // The bucketKeyEnabled field is enforced to be true.
        ServerSideEncryptionRule rule = ServerSideEncryptionRule.builder()
                .bucketKeyEnabled(true)
                .applyServerSideEncryptionByDefault(serverSideEncryptionByDefault)
                .build();
  
        ServerSideEncryptionConfiguration serverSideEncryptionConfiguration = ServerSideEncryptionConfiguration.builder()
                .rules(rule)
                .build();

        PutBucketEncryptionRequest putRequest = PutBucketEncryptionRequest.builder()
                .bucket(bucketName)
                .serverSideEncryptionConfiguration(serverSideEncryptionConfiguration)
                .build();

        s3.putBucketEncryption(putRequest);
        
    }
}
```

如需建立客戶受管金鑰的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[程式設計 AWS KMS API](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)。

如需上傳物件的可行程式碼範例，請參閱下列主題。若要使用這些範例，您必須更新這些程式碼範例並提供加密資訊，如上述程式碼片段所示。
+ 如需以單一操作上傳物件，請參閱 [將物件上傳至目錄儲存貯體](directory-buckets-objects-upload.md)。
+ 如需分段上傳 API 操作，請參閱[搭配目錄儲存貯體使用分段上傳](s3-express-using-multipart-upload.md)。

------
#### [ .NET ]

透過 適用於 .NET 的 AWS SDK，您可以使用 `ServerSideEncryptionByDefault` 屬性來指定目錄儲存貯體的預設加密組態，以使用 SSE-KMS 進行資料加密， AWS KMS key 以請求 Amazon S3 使用 。您可以建立對稱加密客戶自管金鑰，並在請求中指定該金鑰。

```
    // Set the bucket server side encryption to use AWSKMS with a customer-managed key id.
    // bucketName: Name of the directory bucket. "bucket-base-name--zonsid--x-s3"
    // kmsKeyId: The Id of the customer managed KMS Key. "your-kms-customer-managed-key-id"
    // Returns True if successful.
    public static async Task<bool> SetBucketServerSideEncryption(string bucketName, string kmsKeyId)
    {
        var serverSideEncryptionByDefault = new ServerSideEncryptionConfiguration
        {
            ServerSideEncryptionRules = new List<ServerSideEncryptionRule>
            {
                new ServerSideEncryptionRule
                {
                    ServerSideEncryptionByDefault = new ServerSideEncryptionByDefault
                    {
                        ServerSideEncryptionAlgorithm = ServerSideEncryptionMethod.AWSKMS,
                        ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId
                    }
                }
            }
        };
        try
        {
            var encryptionResponse =await _s3Client.PutBucketEncryptionAsync(new PutBucketEncryptionRequest
            {
                BucketName = bucketName,
                ServerSideEncryptionConfiguration = serverSideEncryptionByDefault,
            });
            
            return encryptionResponse.HttpStatusCode == HttpStatusCode.OK;
        }
        catch (AmazonS3Exception ex)
        {
            Console.WriteLine(ex.ErrorCode == "AccessDenied"
                ? $"This account does not have permission to set encryption on {bucketName}, please try again."
                : $"Unable to set bucket encryption for bucket {bucketName}, {ex.Message}");
        }
        return false;
    }
```

如需建立客戶受管金鑰的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[程式設計 AWS KMS API](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)。

如需上傳物件的可行程式碼範例，請參閱下列主題。若要使用這些範例，您必須更新這些程式碼範例並提供加密資訊，如上述程式碼片段所示。
+ 如需以單一操作上傳物件，請參閱 [將物件上傳至目錄儲存貯體](directory-buckets-objects-upload.md)。
+ 如需分段上傳 API 操作，請參閱[搭配目錄儲存貯體使用分段上傳](s3-express-using-multipart-upload.md)。

------

## 使用 監控目錄儲存貯體的預設加密 AWS CloudTrail
<a name="s3-express-bucket-encryption-tracking"></a>

您可以使用 AWS CloudTrail 事件追蹤 Amazon S3 目錄儲存貯體的預設加密組態請求。CloudTrail 日誌使用下列 API 事件名稱：
+ `PutBucketEncryption`
+ `GetBucketEncryption`
+ `DeleteBucketEncryption`

**注意**  
目錄儲存貯體不支援 EventBridge。
目錄儲存貯體不支援使用 AWS Key Management Service (AWS KMS) 金鑰的雙層伺服器端加密 (DSSE-KMS) 或使用客戶提供加密金鑰 (SSE-C) 的伺服器端加密。

如需使用 AWS CloudTrail監控預設加密的詳細資訊，請參閱[使用 AWS CloudTrail 和 Amazon EventBridge 監控預設加密](bucket-encryption-tracking.md)。