搭配 AWS KMS 金鑰 (SSE-KMS) 使用伺服器端加密
重要
Amazon S3 現在將伺服器端加密與 Amazon S3 受管金鑰 (SSE-S3) 套用為 Amazon S3 中每個儲存貯體的基本加密層級。從 2023 年 1 月 5 日起,所有上傳到 Amazon S3 的新物件都會自動加密,無需額外費用,也不會影響效能。S3 儲存貯體預設加密組態和新物件上傳的自動加密狀態會顯示於 AWS CloudTrail 日誌、S3 清查、S3 Storage Lens、Amazon S3 主控台,並做為 AWS Command Line Interface 和 AWS SDK 的其他 Amazon S3 API 回應標頭。如需詳細資訊,請參閱預設加密常見問答集。
伺服器端加密是指接收資料的應用程式或服務在目的地將資料加密。
Amazon S3 會自動為新上傳的物件,以 Amazon S3 受管金鑰 (SSE-S3) 啟用伺服器端加密。
除非您另行指定,否則根據預設,儲存貯體會使用 SSE-S3 來加密物件。但是,您可以選擇將儲存貯體設定為改而使用伺服器端加密與 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS)。如需更多詳細資訊,請參閱 使用 AWS KMS (SSE-KMS) 指定伺服器端加密。
AWS KMS 是一款服務,結合了安全且高可用軟硬體的服務,可提供針對雲端調整的金鑰管理系統。Amazon S3 使用伺服器端加密搭配 AWS KMS (SSE-KMS),加密您的 S3 物件資料。此外,當物件請求 SSE-KMS 時,S3 檢查總和 (作為物件中繼資料的一部分) 會以加密形式儲存。如需總和檢查的詳細資訊,請參閱 在 Amazon S3 中檢查物件完整性。
如果使用 KMS 金鑰,您可以透過 AWS 管理主控台
-
集中建立、檢視、編輯、監控、啟用或停用、輪換和排程 KMS 金鑰的刪除。
-
定義可控制 KMS 金鑰使用方式和使用者的政策。
-
稽核 KMS 金鑰用量以正確使用。AWS KMS API 支援稽核,但 AWS KMS Console;
不支援。
AWS KMS 中的安全控制可以協助您符合加密相關合規要求。您可以使用這些 KMS 金鑰來保護 Amazon S3 儲存貯體中的資料。當您搭配 S3 儲存貯體使用 SSE-KMS 加密時,AWS KMS keys 必須位於和儲存貯體相同的區域。
使用 AWS KMS keys 需另外付費。如需詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的 AWS KMS key 概念和 AWS KMS 定價
如需有關允許 IAM 使用者存取 KMS 加密儲存貯體的指示,請參閱我的 Amazon S3 儲存貯體使用自訂AWS KMS 金鑰預設加密。AWS re:Post 知識中心的如何允許使用者從儲存貯體下載及上傳至儲存貯體?
許可
若要成功向 Amazon S3 提出使用 AWS KMS 金鑰加密物件的 PutObject 請求,您需要金鑰的 kms:GenerateDataKey 許可。若要下載使用 AWS KMS key 加密的物件,您需要金鑰的 kms:Decrypt 許可。若要執行分段上傳以使用 AWS KMS key 加密物件,您必須擁有金鑰的 kms:GenerateDataKey 和 kms:Decrypt 許可。
重要
請仔細檢閱 KMS 金鑰政策中授予的許可。一律將客戶自管 KMS 金鑰政策許可僅限給必須存取相關 AWS KMS 金鑰動作的 IAM 主體和 AWS 服務。如需詳細資訊,請參閱 AWS KMS 中的金鑰政策。
主題
AWS KMS keys
當搭配 AWS KMS (SSE-KMS) 使用伺服器端加密時,您可以使用預設 AWS 受管金鑰,也可以指定您已建立的客戶受管金鑰。AWS KMS 支援封套加密。S3 使用 AWS KMS 功能進行封套加密,進一步保護您的資料。封套加密是使用資料金鑰來加密純文字資料,然後再透過另一個 KMS 金鑰來加密資料金鑰的實務做法。如需封套加密的詳細資訊,請參閱 AWS Key Management Service 開發人員指南中的封套加密。
如果您沒有指定客戶受管金鑰,則當您第一次將使用 SSE-KMS 加密的物件新增到儲存貯體時,Amazon S3 會自動在 AWS 帳戶 中建立 AWS 受管金鑰。根據預設,Amazon S3 會將此 KMS 金鑰用於 SSE-KMS。
如果您想要針對 SSE-KMS 使用客戶受管金鑰,請在設定 SSE-KMS 之前建立對稱加密客戶受管金鑰。然後,當您為儲存貯體設定 SSE-KMS 時,請指定現有客戶受管金鑰。如需對稱加密的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的對稱加密 KMS 金鑰。
建立客戶受管金鑰可為您提供更多的靈活性與控制。例如,您可以建立、輪換和停用客戶受管金鑰。您也可以定義存取控制,並稽核用來保護資料的客戶受管金鑰。如需客戶受管金鑰和 AWS 受管金鑰的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的客戶金鑰和 AWS 金鑰。
注意
當您搭配存放在外部金鑰存放區中的客戶受管金鑰使用伺服器端加密時,與標準 KMS 金鑰不同,您有責任確保金鑰材料的可用性和耐久性。如需外部金鑰存放區及其如何轉移共用責任模型的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的外部金鑰存放區。
針對跨帳戶操作使用 SSE-KMS 加密
對跨帳戶操作使用加密時,請注意下列事項:
-
若 AWS KMS key Amazon Resource Name (ARN) 或別名未在請求時提供,也不透過儲存貯體的預設加密組態提供時,會使用來自上傳帳戶的 AWS 受管金鑰 (
aws/s3) 進行加密和解密。 -
當上傳和存取 AWS Identity and Access Management (IAM) 主體都來自相同的 AWS 帳戶 時,AWS 受管金鑰 (
aws/s3) 可以用作跨帳戶操作的 KMS 金鑰。 -
如果您想要授予 S3 物件跨帳戶存取權,請使用客戶受管金鑰。您可以設定客戶受管金鑰的政策,以允許從另一個帳戶存取的權限。
-
指定客戶自管 KMS 金鑰時,建議您使用完整的 KMS 金鑰 ARN。如果您改用 KMS 金鑰別名,AWS KMS 會解析要求者帳戶內的金鑰。此行為可能會導致資料使用屬於申請者 (而不是儲存貯體擁有者) 的 KMS 金鑰來加密。
-
您必須指定已授予您 (要求者) 已獲授予
Encrypt許可的金鑰。如需詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的允許金鑰使用者在密碼編譯操作中使用 KMS 金鑰。
如需何時使用客戶受管金鑰和 AWS 受管 KMS 金鑰的詳細資訊,請參閱是否要使用 AWS 受管金鑰 或客戶受管金鑰來在 Amazon S3 上加密物件?
SSE-KMS 加密工作流程
如果您選擇使用 AWS 受管金鑰或客戶受管金鑰加密資料,則 AWS KMS 和 Amazon S3 會執行下列封套加密動作:
-
Amazon S3 請求純文字資料金鑰和在指定的 KMS 金鑰下加密的金鑰複本。
-
AWS KMS 會產生資料金鑰、使用 KMS 金鑰為其加密,然後同時傳送純文字資料金鑰和加密的資料金鑰給 Amazon S3。
-
Amazon S3 使用資料金鑰來加密資料,並在使用後盡快從記憶體中移除純文字金鑰。
-
Amazon S3 將加密的資料金鑰以中繼資料形式跟加密資料一起存放。
當您請求解密資料時,Amazon S3 和 AWS KMS 會執行以下動作:
-
Amazon S3 會將加密的資料金鑰傳送至
Decrypt請求中的 AWS KMS。 -
AWS KMS 使用相同的 KMS 金鑰解密加密的資料金鑰,然後將純文字資料金鑰傳送回 Amazon S3。
-
Amazon S3 使用純文字資料金鑰來解密加密的資料,然後盡快從記憶體移除純文字資料金鑰。
重要
當您使用 AWS KMS key 在 Amazon S3 中進行伺服器端加密時,必須選擇對稱加密 KMS 金鑰。Amazon S3 只支援對稱加密 KMS 金鑰。如需詳細資訊,請參閱《AWS Key Management Service開發人員指南》中的對稱加密 KMS 金鑰。
稽核 SSE-KMS 加密
若要識別指定 SSE-KMS 的請求,您可以在 Amazon S3 Storage Lens 指標中使用所有 SSE-KMS 請求和 % 所有 SSE-KMS 請求指標。S3 Storage Lens 是一種雲端儲存體分析功能,您可以用來了解整個組織使用物件儲存體的情況及其活動情形。您也可以使用啟用 SSE-KMS 的儲存貯體計數和啟用 SSE-KMS 的儲存貯體百分比,來了解預設儲存貯體加密 (SSE-KMS) 的儲存貯體計數。如需詳細資訊,請參閱使用 S3 Storage Lens 評估儲存活動和用量。如需完整的指標清單,請參閱 S3 Storage Lens 指標詞彙表。
若要稽核對 SSE-KMS 加密資料使用 AWS KMS 金鑰的情況,您可以使用 AWS CloudTrail 日誌。您可以深入了解密碼編譯操作,例如 GenerateDataKey 和 Decrypt。CloudTrail 支援多種屬性值來篩選搜尋,包括事件名稱、使用者名稱和事件來源。
Amazon S3 儲存貯體金鑰
當您使用 AWS KMS (SSE-KMS) 設定伺服器端加密時,您可以將儲存貯體設定為使用 SSE-KMS 的 S3 儲存貯體金鑰。使用 SSE-KMS 的儲存貯體層級金鑰可透過減少從 Amazon S3 到 AWS KMS 的請求流量,降低高達 99% 的 AWS KMS 請求成本。
當您將儲存貯體設定為在新物件上使用 SSE-KMS 的 S3 儲存貯體金鑰時,AWS KMS 會產生一個儲存貯體層級金鑰,用於為儲存貯體中的物件建立唯一的資料金鑰。在 Amazon S3 中有時間限制的期間使用此 S3 儲存貯體金鑰,可進一步降低 Amazon S3 向 AWS KMS 提出請求以完成加密操作的需求。如需使用 S3 儲存貯體金鑰的詳細資訊,請參閱 使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本。
要求伺服器端加密
若要在特定 Amazon S3 儲存貯體中要求所有物件的伺服器端加密,您可以使用儲存貯體政策。例如,如果請求不包含要求含 SSE-KMS 之伺服器端加密的 x-amz-server-side-encryption-aws-kms-key-id 標頭,則下列儲存貯體政策會拒絕向所有人上傳物件 (s3:PutObject) 的許可。
若要要求使用特定 AWS KMS key 來加密儲存貯體中的物件,您可以使用 s3:x-amz-server-side-encryption-aws-kms-key-id 條件索引鍵。若要指定 KMS 金鑰,您必須使用格式為 arn:aws:kms: 的金鑰 Amazon Resource Name (ARN)。AWS Identity and Access Management 不會驗證 region:acct-id:key/key-ids3:x-amz-server-side-encryption-aws-kms-key-id 的字串是否存在。
注意
當您上傳物件時,您可以使用 x-amz-server-side-encryption-aws-kms-key-id 標頭或依賴您的預設儲存貯體加密組態來指定 KMS 金鑰。如果您的 PutObject 請求在 x-amz-server-side-encryption 標頭中指定 aws:kms,但未指定 x-amz-server-side-encryption-aws-kms-key-id 標頭,則 Amazon S3 會假設您想要使用 AWS 受管金鑰。無論如何,Amazon S3 用於物件加密的 AWS KMS 金鑰 ID 都必須符合政策中的 AWS KMS 金鑰 ID;否則 Amazon S3 會拒絕請求。
如需 Amazon S3 特定條件索引鍵的完整清單,請參閱服務授權參考中的 Amazon S3 的條件索引鍵。
加密內容
加密內容是一組金鑰值對,其中包含資料的其他相關內容資訊。加密內容不被加密。為加密操作指定加密內容時,Amazon S3 必須指定與解密操作相同的加密內容。否則,解密會失敗。AWS KMS 使用加密內容作為額外的驗證資料 (AAD),以支援驗證加密。如需有關加密內容的詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的加密內容。
根據預設,Amazon S3 會使用物件或儲存貯體 Amazon Resource Name (ARN) 作為加密內容對:
-
如果在未啟用 S3 儲存貯體金鑰的情況下使用 SSE-KMS,則使用物件 ARN 作為加密內容。
arn:aws:s3:::object_ARN -
如果使用 SSE-KMS 並啟用 S3 儲存貯體金鑰,則使用儲存貯體 ARN 作為加密內容。如需 S3 儲存貯體金鑰的詳細資訊,請參閱 使用 Amazon S3 儲存貯體金鑰降低 SSE-KMS 的成本。
arn:aws:s3:::bucket_ARN
您可以選擇在 s3:PutObject 請求中使用 x-amz-server-side-encryption-context 標頭,來提供其他加密內容對。不過,加密內容未加密,因此請確保其中不包含敏感資訊。Amazon S3 會一起存放此附加金鑰對與預設加密內容。當其處理 PUT 請求時,Amazon S3 會將 aws:s3:arn 的預設加密內容附加至您提供的加密內容。
您可以使用加密內容來識別和分類密碼編譯操作。您還可以使用預設加密內容 ARN 值來追蹤 AWS CloudTrail 中的相關請求,方法是檢視與加密金鑰一起使用的 Amazon S3 ARN。
在 CloudTrail 日誌檔案的 requestParameters 欄位中,加密內容看起來如下。
"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::" }amzn-s3-demo-bucket1/file_name
當您搭配選用 S3 儲存貯體金鑰功能使用 SSE-KMS 時,加密內容值是儲存貯體的 ARN。
"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::" }amzn-s3-demo-bucket1
傳送 AWS KMS 加密物件的請求
重要
AWS KMS 加密物件的所有 GET 和 PUT 請求必須使用 Secure Sockets Layer (SSL) 或 Transport Layer Security (TLS) 來建立。請求也必須使用有效的憑證簽署,例如 AWS 第 4 版簽署程序 (或 AWS 第 2 版簽署程序)。
AWS Signature 第 4 版是將身分驗證資訊新增至 HTTP 傳送至 AWS 請求的程序。基於安全考量,大多數對於 AWS 的請求都必須以存取金鑰來簽署,而這組存取金鑰中包含存取金鑰 ID 和私密存取金鑰。這兩種金鑰通常稱為您的安全憑證。如需詳細資訊,請參閱身分身分驗證請求 (AWS Signature 第 4 版) 和 Signature 第 4 版簽章程序。
重要
如果您的物件使用 SSE-KMS,請不要傳送 GET 請求與 HEAD 請求的加密請求標頭。否則,您會收到 HTTP 400 Bad Request (HTTP 400 錯誤的請求) 錯誤。