使用 AWS KMS (SSE-KMS) 指定伺服器端加密 - Amazon Simple Storage Service

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

使用 AWS KMS (SSE-KMS) 指定伺服器端加密

根據預設,所有 Amazon S3 儲存貯體都設定了加密,所有上傳到 S3 儲存貯體的新物件都會在靜態時自動加密。使用 Amazon S3 受管金鑰 (SSE-S3) 的伺服器端加密是 Amazon S3 中每個儲存貯體的預設加密組態。若要使用不同類型的加密,您可以指定 S3 PUT 請求中要使用的伺服器端加密類型,也可以在目的地儲存貯體中設定預設加密組態。

如果您想要在PUT請求中指定不同的加密類型,您可以使用伺服器端加密搭配 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS)、雙層伺服器端加密搭配 AWS KMS 金鑰 (DSSE-KMS),或使用客戶提供金鑰 (SSE-C) 的伺服器端加密。如果您想要在目的地儲存貯體中設定不同的預設加密組態,您可以使用 SSE-KMS 或 DSSE-KMS。

上傳新物件或複製現有物件時,您都可以套用加密。

您可以使用 Amazon S3 SSE主控台 AWS SDKs、RESTAPI操作和 AWS Command Line Interface () 來指定 KMS AWS CLI。如需詳細資訊,請參閱下列主題。

注意

您可以在 Amazon S3 AWS KMS keys 中使用多區域。但是,Amazon S3 目前將多區域金鑰視為單區域金鑰,並且不使用金鑰的多區域功能。如需詳細資訊,請參閱 AWS Key Management Service 開發人員指南 中的使用多區域金鑰

注意

如果您想要使用不同帳戶擁有的KMS金鑰,您必須具有使用金鑰的許可。如需KMS金鑰跨帳戶許可的詳細資訊,請參閱 AWS Key Management Service 開發人員指南 中的建立其他帳戶可以使用的KMS金鑰

本主題說明如何使用 Amazon S3 主控台,設定或變更物件的加密類型,以將伺服器端加密與 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS) 搭配使用。

注意
  • 如果您的物件小於 5 GB,您可以變更物件的加密。如果您的物件大於 5 GB,則必須使用 AWS CLIAWS SDKs 變更物件的加密。

  • 如需變更物件加密所需的其他許可清單,請參閱 Amazon S3 API操作的必要許可。如需授予此許可的政策範例,請參閱 Amazon S3 的身分型政策範例

  • 如果您變更物件的加密,則會建立新物件來取代舊物件。如果啟用 S3 版本控制,則系統會建立物件的新版本,且現有物件會變成較舊的版本。變更屬性的角色也會成為新物件 (或物件版本) 的擁有者。

新增或變更物件的加密
  1. 登入 AWS Management Console 並在 開啟 Amazon S3 主控台https://console.aws.amazon.com/s3/

  2. 在導覽窗格中,選擇儲存貯體 ,然後選擇一般用途儲存貯體索引標籤。導覽至包含您要變更之物件的 Amazon S3 儲存貯體或資料夾。

  3. 選取您要變更之物件的核取方塊。

  4. 動作功能表中,從出現的選項清單中選擇編輯伺服器端加密

  5. 捲動至伺服器端加密區段。

  6. 加密設定底下,選擇使用預設加密的儲存貯體設定覆寫預設加密的儲存貯體設定

    重要

    如果您使用 SSE-KMS 選項作為預設加密組態,則您每秒會受到 (RPS) 配額的請求 AWS KMS。如需 AWS KMS 配額以及如何請求提高配額的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的配額

  7. 若您選擇覆寫預設加密的儲存貯體設定,請設定下列加密設定。

    1. 加密類型 下,使用 AWS Key Management Service 金鑰 (SSE-KMS) 選擇伺服器端加密

    2. AWS KMS 金鑰 下,執行下列其中一項操作來選擇您的KMS金鑰:

      • 若要從可用KMS金鑰清單中選擇,請選擇從 選擇 AWS KMS keys,然後從可用KMS金鑰清單中選擇您的金鑰。

        AWS 受管金鑰 (aws/s3) 和您的客戶受管金鑰都會顯示在此清單中。如需詳細了解客戶受管金鑰,請參閱《AWS Key Management Service 開發人員指南》中的客戶金鑰和 AWS 金鑰

      • 若要輸入KMS金鑰 ARN,請選擇輸入 AWS KMS key ARN,然後在出現ARN的欄位中輸入您的KMS金鑰。

      • 若要在 AWS KMS 主控台中建立新的客戶受管金鑰,請選擇建立KMS金鑰

        如需建立 的詳細資訊 AWS KMS key,請參閱 AWS Key Management Service 開發人員指南 中的建立金鑰

      重要

      您只能使用 AWS 區域 與儲存貯體相同的可用KMS金鑰。Amazon S3 主控台只會列出與儲存貯體位於相同區域中的前 100 個KMS金鑰。若要使用未列出的KMS金鑰,您必須輸入您的KMS金鑰 ARN。如果您想要使用不同帳戶擁有的KMS金鑰,您必須先擁有使用金鑰的許可,然後才能輸入KMS金鑰 ARN。

      Amazon S3 僅支援對稱加密KMS金鑰,不支援非對稱KMS金鑰。如需詳細資訊,請參閱 AWS Key Management Service 開發人員指南 中的識別對稱和非對稱KMS金鑰

  8. 其他複製設定 下,選擇您是否要複製來源設定 不要指定設定 指定設定 複製來源設定是預設選項。如果您只想要在沒有來源設定屬性的情況下複製物件,請選擇不要指定設定 。選擇指定設定以指定儲存類別、ACLs、物件標籤、中繼資料、伺服器端加密和其他總和檢查碼的設定。

  9. 選擇 Save changes (儲存變更)。

注意

此動作會將加密套用至所有指定的物件。加密資料夾時,請等待儲存作業完成,然後再將新物件新增至資料夾。

當您建立物件時,也就是當您上傳新物件或複製現有物件時,您可以指定使用伺服器端加密搭配 AWS KMS keys (SSE-KMS) 來加密資料。若要執行這項操作,請將 x-amz-server-side-encryption 標頭新增至要求。將標頭的值設為加密演算法 aws:kms。Amazon S3 會傳回回應標頭 SSE,以確認您的物件是使用 KMS儲存x-amz-server-side-encryption

如果您使用 aws:kms 的值指定 x-amz-server-side-encryption 標頭,也可以使用下列要求標頭:

  • x-amz-server-side-encryption-aws-kms-key-id

  • x-amz-server-side-encryption-context

  • x-amz-server-side-encryption-bucket-key-enabled

支援 SSE- 的 Amazon S3 RESTAPI操作KMS

下列RESTAPI操作接受 x-amz-server-side-encryptionx-amz-server-side-encryption-aws-kms-key-idx-amz-server-side-encryption-context請求標頭。

  • PutObject – 當您使用 PUTAPI操作上傳資料時,您可以指定這些請求標頭。

  • CopyObject – 複製物件時,您會同時有來源物件與目標物件。當您透過 CopyObject操作傳遞 SSE-KMS 標頭時,它們只會套用至目標物件。當您複製現有物件時,無論來源物件是否已加密,除非您明確請求伺服器端加密,否則目的地物件都不會加密。

  • POST Object – 當您使用 POST操作上傳物件時,而不是請求標頭,您會在表單欄位中提供相同的資訊。

  • CreateMultipartUpload – 當您使用分段上傳API操作來上傳大型物件時,您可以指定這些標頭。您可以在CreateMultipartUpload請求中指定這些標頭。

使用伺服器端加密存放物件時,下列RESTAPI操作的回應標頭會傳回x-amz-server-side-encryption標頭。

重要
  • 如果您未使用 Secure Sockets Layer (SSL)、Transport Layer Security (TLS) 或 Signature Version 4 提出這些請求,則受 保護的物件的所有 GETPUT 請求都會 AWS KMS 失敗。

  • 如果您的物件使用 SSE-KMS,請勿傳送GET請求和請求的加密HEAD請求標頭,否則您會收到 HTTP 400 BadRequest 錯誤。

加密內容 (x-amz-server-side-encryption-context)

如果您指定 x-amz-server-side-encryption:aws:kms,Amazon S3 API支援具有 x-amz-server-side-encryption-context 標頭的加密內容。加密內容是一組金鑰值對,其中包含資料的其他相關內容資訊。

Amazon S3 會自動使用物件或儲存貯體 Amazon Resource Name (ARN) 作為加密內容對。如果您使用 SSE-KMS 而不啟用 S3 儲存貯體金鑰,則會使用物件ARN作為加密內容;例如 arn:aws:s3:::object_ARN。不過,如果您使用 SSE-KMS 並啟用 S3 儲存貯體金鑰,則請使用儲存貯體ARN做為加密內容;例如 arn:aws:s3:::bucket_ARN

您可以使用 x-amz-server-side-encryption-context 標頭來提供其他加密內容對。但是,由於加密內容未加密,請確保其中不包含敏感資訊。Amazon S3 會一起存放此附加金鑰對與預設加密內容。

如需 Amazon S3 中加密內容的相關資訊,請參閱 加密內容。如需有關加密內容的更多資訊,請參閱《AWS Key Management Service 開發人員指南》中的 AWS Key Management Service 概念:加密內容

AWS KMS 金鑰 ID (x-amz-server-side-encryption-aws-kms-key-id

您可以使用 x-amz-server-side-encryption-aws-kms-key-id 標頭來指定用來保護資料之客戶受管金鑰的 ID。如果您指定 x-amz-server-side-encryption:aws:kms 標頭,但未提供 x-amz-server-side-encryption-aws-kms-key-id 標頭,則 Amazon S3 會使用 AWS 受管金鑰 (aws/s3) 來保護資料。如果您想要使用客戶受管的金鑰,則必須提供客戶受管金鑰的 x-amz-server-side-encryption-aws-kms-key-id 標頭。

重要

當您在 Amazon S3 中使用 AWS KMS key 進行伺服器端加密時,您必須選擇對稱加密KMS金鑰。Amazon S3 僅支援對稱加密KMS金鑰。如需這些金鑰的詳細資訊,請參閱 AWS Key Management Service 開發人員指南 中的對稱加密KMS金鑰

S3 儲存貯體金鑰 (x-amz-server-side-encryption-aws-bucket-key-enabled)

您可以使用x-amz-server-side-encryption-aws-bucket-key-enabled請求標頭來啟用或停用物件層級的 S3 儲存貯體金鑰。S3 儲存貯體金鑰透過將 AWS KMS 請求流量從 Amazon S3 減少到 來降低請求成本 AWS KMS。如需詳細資訊,請參閱SSE使用 Amazon S3 儲存貯體金鑰降低 KMS的成本

如果您指定 x-amz-server-side-encryption:aws:kms 標頭但未提供 x-amz-server-side-encryption-aws-bucket-key-enabled 標頭,則您的物件使用目的地儲存貯體存儲桶的 S3 儲存貯體金鑰設定來加密您的物件。如需詳細資訊,請參閱在物件層級設定 S3 儲存貯體金鑰

若要使用下列範例 AWS CLI 命令,請將 取代user input placeholders為您自己的資訊。

當您上傳新物件或複製現有物件時,您可以指定使用伺服器端加密搭配 AWS KMS 金鑰來加密資料。若要執行這項操作,請將 --server-side-encryption aws:kms 標頭新增至要求。使用 --ssekms-key-id example-key-id 新增您建立的客戶受管 AWS KMS 金鑰。如果您指定 --server-side-encryption aws:kms,但未提供 AWS KMS 金鑰 ID,Amazon S3 將使用 AWS 受管金鑰。

aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --ssekms-key-id example-key-id --body filepath

您可以新增 或 ,在 PUT或 COPY操作上額外啟用或停用 Amazon S3 --bucket-key-enabled 儲存貯體金鑰--no-bucket-key-enabled。Amazon S3 儲存貯體金鑰可以透過將 AWS KMS 請求流量從 Amazon S3 減少到 來降低請求成本 AWS KMS。如需詳細資訊,請參閱使用 Amazon S3 儲存貯體金鑰 降低 SSE的成本KMS。

aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms --bucket-key-enabled --body filepath

您可以加密要使用的未加密物件SSE,KMS方法是將物件複製回原位。

aws s3api copy-object --bucket amzn-s3-demo-bucket --key example-object-key --body filepath --bucket amzn-s3-demo-bucket --key example-object-key --sse aws:kms --sse-kms-key-id example-key-id --body filepath

使用 時 AWS SDKs,您可以請求 Amazon S3 使用 AWS KMS keys 進行伺服器端加密。下列範例示範如何使用 SSE-KMS 搭配適用於 Java 的 AWS SDKs和 NET。如需其他 的相關資訊SDKs,請參閱 AWS Developer Center 上的範例程式碼和程式庫

重要

當您在 Amazon S3 中使用 AWS KMS key 進行伺服器端加密時,您必須選擇對稱加密KMS金鑰。Amazon S3 僅支援對稱加密KMS金鑰。如需這些金鑰的詳細資訊,請參閱 AWS Key Management Service 開發人員指南 中的對稱加密KMS金鑰

CopyObject 操作

複製物件時,請新增相同的請求屬性 (ServerSideEncryptionMethodServerSideEncryptionKeyManagementServiceKeyId),以請求 Amazon S3 使用 AWS KMS key。如需複製物件的詳細資訊,請參閱「複製、移動和重新命名物件」。

PUT 操作

Java

使用 上傳物件時 AWS SDK for Java,您可以透過 AWS KMS key 新增 SSEAwsKeyManagementParams 屬性來請求 Amazon S3 使用 ,如下列請求所示:

PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams());

在此情況下,Amazon S3 會使用 AWS 受管金鑰 (aws/s3)。如需詳細資訊,請參閱使用伺服器端加密與 AWS KMS 金鑰 (SSE-KMS)。您可以選擇性地建立對稱加密KMS金鑰,並在請求中指定 ,如下列範例所示:

PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(keyID));

如需建立客戶受管金鑰的詳細資訊,請參閱 開發人員指南 中的程式設計 AWS KMS APIAWS Key Management Service

如需上傳物件的可行程式碼範例,請參閱下列主題。若要使用這些範例,您必須更新這些程式碼範例並提供加密資訊,如上述程式碼片段所示。

.NET

使用 上傳物件時 AWS SDK for .NET,您可以透過 AWS KMS key 新增 ServerSideEncryptionMethod 屬性來請求 Amazon S3 使用 ,如下列請求所示:

PutObjectRequest putRequest = new PutObjectRequest { BucketName = amzn-s3-demo-bucket, Key = keyName, // other properties ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS };

在此情況下,Amazon S3 會使用 AWS 受管金鑰。如需詳細資訊,請參閱使用伺服器端加密與 AWS KMS 金鑰 (SSE-KMS)。您可以選擇性地建立自己的對稱加密客戶受管金鑰,並在請求中指定 ,如下列範例所示:

PutObjectRequest putRequest1 = new PutObjectRequest { BucketName = amzn-s3-demo-bucket, Key = keyName, // other properties ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS, ServerSideEncryptionKeyManagementServiceKeyId = keyId };

如需建立客戶受管金鑰的詳細資訊,請參閱 開發人員指南 中的程式設計 AWS KMS APIAWS Key Management Service

如需上傳物件的可行程式碼範例,請參閱下列主題。若要使用這些範例,您必須更新這些程式碼範例並提供加密資訊,如上述程式碼片段所示。

預先簽章 URLs

Java

URL 為使用 加密的物件建立預先簽章時 AWS KMS key,您必須明確指定簽章第 4 版,如下列範例所示:

ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSignerOverride("AWSS3V4SignerType"); AmazonS3Client s3client = new AmazonS3Client( new ProfileCredentialsProvider(), clientConfiguration); ...

如需程式碼範例,請參閱「使用預先簽章共用物件 URLs」。

.NET

URL 為使用 加密的物件建立預先簽章時 AWS KMS key,您必須明確指定簽章第 4 版,如下列範例所示:

AWSConfigs.S3Config.UseSignatureVersion4 = true;

如需程式碼範例,請參閱「使用預先簽章共用物件 URLs」。