AWS Nitro Enclaves 如何使用 AWS KMS - AWS Key Management Service

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

AWS Nitro Enclaves 如何使用 AWS KMS

AWS KMS支援 AWS Nitro Enclaves密碼編譯證明。支援 AWS Nitro Enclaves 的應用程式會使用 enclave 的已簽署證明文件來呼叫下列 AWS KMS 密碼編譯操作。這些 AWS KMS API 會驗證證明文字件來自 Nitro enclave。然後,在回應時,這些 API 不會傳回純文字資料,而是利用證明文件的公有金鑰來加密純文字,並傳回僅能透過 enclave 的相應私有金鑰進行解密的密文。

下表顯示對 Nitro enclave 請求的回應與每個 API 操作的標準回應有何不同。

AWS KMS 操作 標準回應 對 AWS Nitro Enclaves 的回應
Decrypt 傳回純文字資料 傳回純文字資料 (經來自證明文件的公有金鑰加密)
GenerateDataKey 傳回資料金鑰的純文字複本

(也會傳回 KMS 金鑰加密的資料金鑰複本)

傳回資料金鑰複本 (經來自證明文件的公有金鑰加密)

(也會傳回 KMS 金鑰加密的資料金鑰複本)

GenerateDataKeyPair 傳回私有金鑰的純文字副本

(也會傳回公有金鑰以及由 KMS 金鑰加密的私有金鑰副本)

傳回私有金鑰複本 (經來自證明文件的公有金鑰加密)

(也會傳回公有金鑰以及由 KMS 金鑰加密的私有金鑰副本)

GenerateRandom 傳回隨機位元組字串 傳回隨機位元組字串 (經來自證明文件的公有金鑰加密)

AWS KMS 支援政策條件金鑰,可讓您根據證明文件內容利用 AWS KMS 來允許或拒絕 enclave 操作。您還可在 AWS CloudTrail 日誌監控針對 Nitro enclave 向 AWS KMS 提出的請求

如何呼叫 Nitro Enclaves 的 AWS KMS API

若要呼叫 Nitro Enclave 的 AWS KMS API,請於請求時採用 Recipient 參數為 enclave 提供已簽署的證明文件,以及要與 enclave 公有金鑰搭配使用的加密演算法。當請求包含已簽署證明文件的 Recipient 參數時,回應會包含 CiphertextForRecipient 欄位,以及由公有金鑰加密的密文。純文字欄位為空值或空白。

Recipient 參數必須從 AWS Nitro enclave 指定已簽署的證明文件。AWS KMS 依賴 enclave 證明文件的數位簽章來證明請求的公有金鑰來自有效 enclave。您無法提供自己的憑證來數位簽署證明文件。

若要指定 Recipient 參數,請採用 AWS Nitro Enclaves SDK 或任何 AWS SDK。AWS Nitro Enclaves SDK 僅在 Nitro enclave 受支援,會自動新增 Recipient 參數及其值至每個 AWS KMS 請求。若要在 AWS SDK 提出 Nitro Enclaves 請求,您必須指定 Recipient 參數及其值。於 2023 年 3 月針對 AWS SDK 推出 Nitro enclave 密碼編譯證明支援。

AWS KMS 支援政策條件金鑰,可讓您根據證明文件內容利用 AWS KMS 來允許或拒絕 enclave 操作。您還可在 AWS CloudTrail 日誌監控針對 Nitro enclave 向 AWS KMS 提出的請求

如需有關Recipient參數和 AWS CiphertextForRecipient 回應欄位的詳細資訊,請參閱 AWS Key Management ServiceAPI 參考GenerateDataKeyGenerateDataKeyPairAWSNitro Enclaves 開發套件或任何開發套件中的解密、、和GenerateRandom主題。AWS如需設定加密之資料和資料金鑰的相關資訊,請參閱將 AWS KMS 與密碼編譯證明搭配使用

AWS Nitro Enclaves 的 AWS KMS 條件索引鍵

您可針對控制 AWS KMS 資源存取的金鑰政策IAM 政策指定條件金鑰。包含條件金鑰的政策陳述式僅在符合條件時才有效。

AWS KMS提供條件金鑰,GenerateDataKey可根據請求中已簽署的驗證文件內容限制解密GenerateDataKeyPair、、和GenerateRandom作業的權限。這些條件金鑰僅在 AWS KMS 操作請求包含 Recipient 參數,以及來自 AWS Nitro enclave 的有效證明文件時才有效。若要指定 Recipient 參數,請採用 AWS Nitro Enclaves SDK 或任何 AWS SDK。

Enclave 特定的 AWS KMS 條件金鑰在金鑰政策陳述式與 IAM 政策陳述式有效,即使其未出現在 IAM 主控台或 IAM 服務授權參考

公RecipientAttestation里 ImageSha

AWS KMS 條件金鑰 條件類型 值類型 API 操作 政策類型

kms:RecipientAttestation:ImageSha384

字串

單一值

Decrypt

GenerateDataKey

GenerateDataKeyPair

GenerateRandom

金鑰政策和 IAM 政策

當請求中已簽署證明文件的影像摘要符合條件金鑰的值時,kms:RecipientAttestation:ImageSha384 條件金鑰可利用 KMS 金鑰控制對以下各項的存取:DecryptGenerateDataKeyGenerateDataKeyPairGenerateRandomImageSha384 值對應證明文件的 PCR0。僅當請求的 Recipient 參數指定 AWS Nitro Enclave 的已簽署證明文件時,此條件金鑰才有效。

此值也包含在要求 Nitro 飛地AWS KMS的CloudTrail事件中。

注意

此條件金鑰在金鑰政策陳述式和 IAM 政策陳述式中有效,即使它未出現在 IAM 主控台或 IAM 服務授權參考

例如,下列金鑰原則陳述式允許data-processing角色使用 KMS 金鑰進行解密GenerateDataKeyGenerateDataKeyPair、和GenerateRandom作業。僅當請求中證明文件的影像摘要值 (PCR0) 符合條件的影像摘要值時,kms:RecipientAttestation:ImageSha384 條件金鑰才會允許操作。僅當請求的 Recipient 參數指定 AWS Nitro Enclave 的已簽署證明文件時,此條件金鑰才有效。

如請求不含來自 AWS Nitro enclave 的有效證明文件,則會因未滿足此條件而拒絕許可。

{ "Sid" : "Enable enclave data processing", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:role/data-processing" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey", "kms:GenerateDataKeyPair", "kms:GenerateRandom" ], "Resource" : "*", "Condition": { "StringEqualsIgnoreCase": { "kms:RecipientAttestation:ImageSha384": "9fedcba8abcdef7abcdef6abcdef5abcdef4abcdef3abcdef2abcdef1abcdef1abcdef0abcdef1abcdef2abcdef3abcdef4abcdef5abcdef6abcdef7abcdef99" } } }

公里:: 聚氯乙烯 RecipientAttestation <PCR_ID>

AWS KMS 條件金鑰 條件類型 值類型 API 操作 政策類型

kms:RecipientAttestation:PCR<PCR_ID>

字串

單一值

Decrypt

GenerateDataKey

GenerateDataKeyPair

GenerateRandom

金鑰政策和 IAM 政策

僅當請求中已簽署證明文件的平台組態註冊 (PCR) 符合條件金鑰的 PCR 時,kms:RecipientAttestation:PCR<PCR_ID> 條件金鑰才會利用 KMS 金鑰控制對以下各項的存取:DecryptGenerateDataKeyGenerateDataKeyPair 以及 GenerateRandom。僅當請求的 Recipient 參數指定來自 AWS Nitro Enclave 的已簽署證明文件時,此條件金鑰才有效。

此值也包含在代表AWS KMS對 Nitro 飛地的請求的CloudTrail事件中。

注意

此條件金鑰在金鑰政策陳述式和 IAM 政策陳述式中有效,即使它未出現在 IAM 主控台或 IAM 服務授權參考

若要指定 PCR 值,請使用以下格式。將 PCR ID 串連到條件索引鍵名稱。PCR 值必須是最多 96 個位元組的小寫十六進位字串。

"kms:RecipientAttestation:PCRPCR_ID": "PCR_value"

例如,下列條件金鑰指定 PCR1 的特定值,對應於用於 enclave 與啟動程序處理的核心雜湊。

kms:RecipientAttestation:PCR1: "0x1abcdef2abcdef3abcdef4abcdef5abcdef6abcdef7abcdef8abcdef9abcdef8abcdef7abcdef6abcdef5abcdef4abcdef3abcdef2abcdef1abcdef0abcde"

下列範例金鑰政策陳述式允許 data-processing 角色利用 KMS 金鑰進行 Decrypt 操作。

僅當請求中已簽署證明文件中的 PCR1 值符合條件中的 kms:RecipientAttestation:PCR1 值時,本陳述式中的 kms:RecipientAttestation:PCR 條件索引鍵才會允許操作。使用 StringEqualsIgnoreCase 政策運算子要求 PCR 值不區分大小寫的比較。

如請求不含證明文件,則會因未滿足此條件而拒絕許可。

{ "Sid" : "Enable enclave data processing", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:role/data-processing" }, "Action": "kms:Decrypt", "Resource" : "*", "Condition": { "StringEqualsIgnoreCase": { "kms:RecipientAttestation:PCR1": "0x1de4f2dcf774f6e3b679f62e5f120065b2e408dcea327bd1c9dddaea6664e7af7935581474844767453082c6f1586116376cede396a30a39a611b9aad7966c87" } } }

對 Nitro Enclaves 的監空請求

您可以使用AWS CloudTrail記錄來監視 AWS Nitro 飛地的解密GenerateDataKeyGenerateDataKeyPair、、和GenerateRandom作業。在這些日誌項目,additionalEventData 欄位具 recipient 欄位,其中包含請求證明文件的模組 ID (attestationDocumentModuleId)、影像摘要 (attestationDocumentEnclaveImageDigest),以及平台組態註冊 (PCR)。僅當請求的 Recipient 參數指定來自 AWS Nitro Enclave 的已簽署證明文件時,才會包含這些欄位。

模組 ID 是 Nitro enclave 的 enclave ID。影像摘要是 enclave 影像的 SHA384 雜湊。您可在金鑰政策與 IAM 政策的條件運用影像摘要及 PCR 值。如需 PCR 的相關資訊,請參閱《AWSNitro Enclaves使用者指南》Where to get an enclave's measurements

本節顯示每個受支援的 Nitro enclave 要求的範例 CloudTrail 記錄項目。AWS KMS

Decrypt (針對 enclave)

以下 AWS CloudTrail 日誌項目範例顯示 AWS Nitro enclave 的 Decrypt 操作。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "EX_PRINCIPAL_ID", "arn": "arn:aws:iam::111122223333:user/Alice", "accountId": "111122223333", "accessKeyId": "EXAMPLE_KEY_ID", "userName": "Alice" }, "eventTime": "2020-07-27T22:58:24Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "192.0.2.0", "userAgent": "AWS Internal", "requestParameters": { "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "additionalEventData": { "recipient": { "attestationDocumentModuleId": "i-123456789abcde123-enc123456789abcde12", "attestationDocumentEnclaveImageDigest": "<AttestationDocument.PCR0>", "attestationDocumentEnclavePCR1": "<AttestationDocument.PCR1>", "attestationDocumentEnclavePCR2": "<AttestationDocument.PCR2>", "attestationDocumentEnclavePCR3": "<AttestationDocument.PCR3>", "attestationDocumentEnclavePCR4": "<AttestationDocument.PCR4>", "attestationDocumentEnclavePCR8": "<AttestationDocument.PCR8>" } }, "requestID": "b4a65126-30d5-4b28-98b9-9153da559963", "eventID": "e5a2f202-ba1a-467c-b4ba-f729d45ae521", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }

GenerateDataKey (適用於飛地)

下列範例顯示AWS硝基飛地之GenerateDataKey作業的AWS CloudTrail記錄項目。

{ "eventVersion": "1.02", "userIdentity": { "type": "IAMUser", "principalId": "EX_PRINCIPAL_ID", "arn": "arn:aws:iam::111122223333:user/Alice", "accountId": "111122223333", "accessKeyId": "EXAMPLE_KEY_ID", "userName": "Alice" }, "eventTime": "2014-11-04T00:52:40Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-1", "sourceIPAddress": "192.0.2.0", "userAgent": "AWS Internal", "requestParameters": { "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "numberOfBytes": 32 }, "responseElements": null, "additionalEventData": { "recipient": { "attestationDocumentModuleId": "i-123456789abcde123-enc123456789abcde12", "attestationDocumentEnclaveImageDigest": "<AttestationDocument.PCR0>", "attestationDocumentEnclavePCR1": "<AttestationDocument.PCR1>", "attestationDocumentEnclavePCR2": "<AttestationDocument.PCR2>", "attestationDocumentEnclavePCR3": "<AttestationDocument.PCR3>", "attestationDocumentEnclavePCR4": "<AttestationDocument.PCR4>", "attestationDocumentEnclavePCR8": "<AttestationDocument.PCR8>" } }, "requestID": "e0eb83e3-63bc-11e4-bc2b-4198b6150d5c", "eventID": "a9dea4f9-8395-46c0-942c-f509c02c2b71", "readOnly": true, "resources": [{ "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333" }], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }

GenerateDataKeyPair (適用於飛地)

下列範例顯示AWS硝基飛地之GenerateDataKeyPair作業的AWS CloudTrail記錄項目。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "EX_PRINCIPAL_ID", "arn": "arn:aws:iam::111122223333:user/Alice", "accountId": "111122223333", "accessKeyId": "EXAMPLE_KEY_ID", "userName": "Alice" }, "eventTime": "2020-07-27T18:57:57Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKeyPair", "awsRegion": "us-west-2", "sourceIPAddress": "192.0.2.0", "userAgent": "AWS Internal", "requestParameters": { "keyPairSpec": "RSA_3072", "encryptionContext": { "Project": "Alpha" }, "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab" }, "responseElements": null, "additionalEventData": { "recipient": { "attestationDocumentModuleId": "i-123456789abcde123-enc123456789abcde12", "attestationDocumentEnclaveImageDigest": "<AttestationDocument.PCR0>", "attestationDocumentEnclavePCR1": "<AttestationDocument.PCR1>", "attestationDocumentEnclavePCR2": "<AttestationDocument.PCR2>", "attestationDocumentEnclavePCR3": "<AttestationDocument.PCR3>", "attestationDocumentEnclavePCR4": "<AttestationDocument.PCR4>", "attestationDocumentEnclavePCR8": "<AttestationDocument.PCR8>" } }, "requestID": "52fb127b-0fe5-42bb-8e5e-f560febde6b0", "eventID": "9b6bd6d2-529d-4890-a949-593b13800ad7", "readOnly": true, "resources": [ { "accountId": "111122223333", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }

GenerateRandom (適用於飛地)

下列範例顯示AWS硝基飛地之GenerateRandom作業的AWS CloudTrail記錄項目。

{ "eventVersion": "1.02", "userIdentity": { "type": "IAMUser", "principalId": "EX_PRINCIPAL_ID", "arn": "arn:aws:iam::111122223333:user/Alice", "accountId": "111122223333", "accessKeyId": "EXAMPLE_KEY_ID", "userName": "Alice" }, "eventTime": "2014-11-04T00:52:37Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateRandom", "awsRegion": "us-east-1", "sourceIPAddress": "192.0.2.0", "userAgent": "AWS Internal", "requestParameters": null, "responseElements": null, "additionalEventData": { "recipient": { "attestationDocumentModuleId": "i-123456789abcde123-enc123456789abcde12", "attestationDocumentEnclaveImageDigest": "<AttestationDocument.PCR0>", "attestationDocumentEnclavePCR1": "<AttestationDocument.PCR1>", "attestationDocumentEnclavePCR2": "<AttestationDocument.PCR2>", "attestationDocumentEnclavePCR3": "<AttestationDocument.PCR3>", "attestationDocumentEnclavePCR4": "<AttestationDocument.PCR4>", "attestationDocumentEnclavePCR8": "<AttestationDocument.PCR8>" } }, "requestID": "df1e3de6-63bc-11e4-bc2b-4198b6150d5c", "eventID": "239cb9f7-ae05-4c94-9221-6ea30eef0442", "readOnly": true, "resources": [], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }