Amazon Nitro Enclaves 如何使用 Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Nitro Enclaves 如何使用 Amazon KMS

Amazon KMS 支持 Amazon Nitro Enclaves加密证明。支持 Amazon Nitro Enclaves 的应用程序使用 Enclave 的已签名证明文档调用以下 Amazon KMS 加密操作。这些 Amazon KMS API 可验证证明文档是否来自 Nitro Enclave。然后,这些 API 不是在响应中返回明文数据,而是使用证明文档中的公有密钥对明文进行加密,并返回只能通过 Enclave 中相应的私有密钥解密的加密文字。

下表显示了对 Nitro Enclave 请求的响应与每个 API 操作的标准响应有何不同。

Amazon KMS 操作 标准响应 对 Amazon Nitro Enclaves 的响应
Decrypt 返回明文数据 返回证明文档中由公有密钥加密的明文数据
GenerateDataKey 返回数据密钥的明文副本

(还会返回由 KMS 密钥加密的数据密钥副本)

返回证明文档中由公有密钥加密的数据密钥副本

(还会返回由 KMS 密钥加密的数据密钥副本)

GenerateDataKeyPair 返回私有密钥的明文副本

(还会返回公有密钥和由 KMS 密钥加密的私有密钥副本)

返回证明文档中由公有密钥加密的私有密钥副本

(还会返回公有密钥和由 KMS 密钥加密的私有密钥副本)

GenerateRandom 返回一个随机字节字符串 返回证明文档中由公有密钥加密的随机字节字符串

Amazon KMS 支持策略条件键,您可以使用这些键根据证明文件的内容允许或拒绝对 Amazon KMS 密钥执行 Enclave 操作。您还可以在 Amazon CloudTrail 日志中监控对 Amazon KMS Nitro Enclave 的请求

如何为 Nitro Enclave 调用 Amazon KMS API

要为 Nitro Enclave 调用 Amazon KMS API,请使用请求中的 Recipient 参数为 Enclave 提供已签名的证明文档以及用于 Enclave 的公有密钥的加密算法。当请求中包含带有已签名证明文档的 Recipient 参数时,响应将包含一个具有由公有密钥加密的加密文字的 CiphertextForRecipient 字段。明文字段为空。

Recipient 参数必须指定来自 Amazon Nitro Enclave 的已签名证明文档。Amazon KMS 依赖于 Enclave 证明文档的数字签名来证明请求中的公有密钥来自于有效的 Enclave。您不能提供自己的证书来对证明文档进行数字签名。

要指定 Recipient 参数,请使用 Amazon Nitro Enclaves 开发工具包 或任何 Amazon 开发工具包。Amazon Nitro Enclaves 开发工具包仅在 Nitro Enclave 内受支持,会自动将 Recipient 参数及其值添加到每个 Amazon KMS 请求中。要在 Amazon 开发工具包中请求 Nitro Enclave,必须指定 Recipient 参数及其值。Amazon 开发工具包中对 Nitro Enclave 加密证明的支持于 2023 年 3 月推出。

Amazon KMS 支持策略条件键,您可以使用这些键根据证明文件的内容允许或拒绝对 Amazon KMS 密钥执行 Enclave 操作。您还可以在 Amazon CloudTrail 日志中监控对 Amazon KMS Nitro Enclave 的请求

有关Recipient参数和 AWS CiphertextForRecipient 响应字段的详细信息,请参阅 Amazon Key Management ServiceAPI 参考AmazonNitro Enclaves 软件开发工具包或任何软件开发工具包中的解密、、和GenerateRandom主题。GenerateDataKeyGenerateDataKeyPairAmazon有关为加密设置数据和数据密钥的信息,请参阅将加密证明与 Amazon KMS 结合使用

Amazon Nitro Enclaves 的 Amazon KMS 条件键

您可以在控制 Amazon KMS 资源访问的密钥政策IAM policy 中指定条件键。包含条件键的策略声明只有在满足条件时才有效。

Amazon KMS提供了条件密钥,这些条件密钥根据请求中已签名的证明文档的内容限制解GenerateDataKeyGenerateDataKeyPair、、和GenerateRandom操作的权限。这些条件键仅在 Amazon KMS 操作请求中包含带有来自 Amazon Nitro Enclave 的有效证明文档的 Recipient 参数时才起作用。要指定 Recipient 参数,请使用 Amazon Nitro Enclaves 开发工具包 或任何 Amazon 开发工具包。

特定于 Enclave 的 Amazon KMS 条件键在密钥政策语句和 IAM policy 语句中有效,即使没有出现在 IAM 控制台或 IAM《服务授权参考》中。

kms:RecipientAttestation: ImageSha 384

Amazon KMS 条件键 条件类型 值类型 API 操作 策略类型

kms:RecipientAttestation:ImageSha384

字符串

单值

Decrypt

GenerateDataKey

GenerateDataKeyPair

GenerateRandom

密钥策略和 IAM policy

当请求中的已签名证明文档中的映像摘要与条件键中的值相匹配时,kms:RecipientAttestation:ImageSha384 条件键使用 KMS 密钥控制对 DecryptGenerateDataKeyGenerateDataKeyPairGenerateRandom 的访问。ImageSha384 值对应于证明文档中的 PCR0。仅当请求中的 Recipient 参数为 Amazon Nitro Enclave 指定了已签名的证明文档时,此条件键才有效。

此值也包含在请求获得 Nitro 飞地CloudTrailAmazon KMS的事件中。

注意

此条件键在密钥策略语句和 IAM policy 语句中有效,即使没有出现在 IAM 控制台或 IAM 服务授权引用中。

例如,以下密钥策略声明允许该data-processing角色使用 KMS 密钥进行解密GenerateDataKeyGenerateDataKeyPair、和GenerateRandom操作。kms:RecipientAttestation:ImageSha384 条件键仅允许在请求中的证明文档的映像摘要值(PCR0)与条件中的映像摘要值匹配时执行操作。仅当请求中的 Recipient 参数为 Amazon Nitro Enclave 指定了已签名的证明文档时,此条件键才有效。

如果请求不包含来自 Amazon 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" } } }

kms:: PCR RecipientAttestation <PCR_ID>

Amazon KMS 条件键 条件类型 值类型 API 操作 策略类型

kms:RecipientAttestation:PCR<PCR_ID>

字符串

单值

Decrypt

GenerateDataKey

GenerateDataKeyPair

GenerateRandom

密钥策略和 IAM policy

kms:RecipientAttestation:PCR<PCR_ID> 条件键仅在请求中的已签名证明文档的平台配置注册(PCR)与条件键中的 PCR 匹配时,通过 KMS 密钥控制对 DecryptGenerateDataKeyGenerateDataKeyPairGenerateRandom 的访问。仅当请求中的 Recipient 参数指定来自 Amazon Nitro Enclave 的已签名证明文档时,该条件键才有效。

此值也包含在代表对 Nitro 飞地Amazon KMS的请求CloudTrail的事件中。

注意

此条件键在密钥策略语句和 IAM policy 语句中有效,即使没有出现在 IAM 控制台或 IAM 服务授权引用中。

要指定 PCR 值,请使用以下格式。将 PCR ID 连接到条件键名称。PCR 值必须是最多 96 个字节的小写十六进制字符串。

"kms:RecipientAttestation:PCRPCR_ID": "PCR_value"

例如,以下条件键指定 PCR1 的特定值,该值对应于用于 Enclave 和引导启动过程的内核的哈希值。

kms:RecipientAttestation:PCR1: "0x1abcdef2abcdef3abcdef4abcdef5abcdef6abcdef7abcdef8abcdef9abcdef8abcdef7abcdef6abcdef5abcdef4abcdef3abcdef2abcdef1abcdef0abcde"

以下示例密钥政策语句允许 data-processing 角色将 KMS 密钥用于 Decrypt 操作。

此语句中的 kms:RecipientAttestation:PCR 条件键仅在请求中的签名证明文档的 PCR1 值与条件中的 kms:RecipientAttestation:PCR1 值匹配时允许执行操作。使用 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 Enclave 的请求

您可以使用Amazon CloudTrail日志来监控 Amazon Nitro 飞地的解密GenerateDataKeyGenerateDataKeyPair、、和GenerateRandom操作。在这些日志条目中,additionalEventData 字段包含一个 recipient 字段,该字段包含来自请求中证明文档的模块 ID (attestationDocumentModuleId)、映像摘要 (attestationDocumentEnclaveImageDigest) 和平台配置寄存器(PCR)。仅当请求中的 Recipient 参数指定来自 Amazon Nitro Enclave 的已签名证明文档时,才会包含这些字段。

模块 ID 是 Nitro Enclave 的 Enclave ID。映像摘要是 Enclave 映像的 SHA384 哈希值。您可以在密钥政策和 IAM policy 的条件中使用映像摘要和 PCR 值。有关 PCR 的信息,请参阅《Amazon Nitro Enclave User Guide》中的 Where to get an enclave's measurements

本节显示了每个受支持的 Nitro 安全区请求的 CloudTrail 日志条目示例。Amazon KMS

解密(适用于 Enclave)

以下示例显示了 Amazon Nitro enclave 的 Decrypt 操作的一个 Amazon 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-27T22:58:24Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-west-2", "sourceIPAddress": "192.0.2.0", "userAgent": "Amazon 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 (用于飞地)

以下示例显示了 Amazon Nitro 安全区GenerateDataKey操作的Amazon 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": "Amazon 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 (用于飞地)

以下示例显示了 Amazon Nitro 安全区GenerateDataKeyPair操作的Amazon 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": "Amazon 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 (用于飞地)

以下示例显示了 Amazon Nitro 安全区GenerateRandom操作的Amazon 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": "Amazon 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" }