密钥加密和解密 - Amazon Secrets Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

密钥加密和解密

Secrets Manager 使用信封加密以及 Amazon KMS 密钥数据密钥来保护每个密钥值。每当密钥中的密钥值更改时,Secrets Manager 便会生成新的数据密钥来保护它。然后,用 KMS 密钥加密数据密钥,存储在密钥元数据中。要解密密钥,Secrets Manager 首先使用 Amazon KMS 中的 KMS 密钥解密已加密的数据密钥。

Secrets Manager 不使用 KMS 直接对密钥值加密。相反,它使用 KMS 密钥来生成和加密 256 位高级加密标准 (AES) 对称数据密钥,并使用数据密钥对密钥值加密。Secrets Manager 使用明文数据密钥在 Amazon KMS 之外对密钥值加密,然后将其从内存中删除。它将数据密钥的加密副本存储在密钥的元数据中。

创建密钥时,您可以选择 Amazon Web Services 账户和区域中的任何对称加密客户管理的密钥,也可以使用适用于 Secrets Manager 的 Amazon 托管式密钥(aws/secretsmanager)。在控制台中,如果选择加密密钥的原定设置值,Secrets Manager 将创建 Amazon 托管式密钥 aws/secretsmanager,如果它不存在,并将其与密钥关联。可对您账户中的每个密钥使用相同的 KMS 密钥或不同的 KMS 密钥。Secrets Manager 仅支持对称加密 KMS 密钥

您可以在控制台或 Amazon CLI 或带 UpdateSecret 的 Amazon SDK 中更改密钥的加密密钥。当您更改加密密钥时,Secrets Manager 将在新加密密钥下重新加密具有临时标签的 AWSCURRENTAWSPENDINGAWSPREVIOUS 密钥版本。密钥值更改时,Secrets Manager 还会根据新密钥对其加密。您可以在检索密钥时使用旧密钥或新密钥来解密密钥。

要查找与密钥关联的 KMS 密钥,请在控制台中查看密钥或调用 ListSecrets 或者 DescribeSecret。当密钥与适用于 Secrets Manager (aws/secretsmanager) 的 Amazon 托管式密钥 关联时,这些操作不会返回 KMS 密钥标识符。

加密和解密流程

为了对密钥中的密钥值加密,Secrets Manager 使用以下过程。

  1. Secrets Manager 使用密钥 KMS 密钥的 ID,以及 256 位 AES 对称密钥的请求来调用 Amazon KMS GenerateDataKey 操作。Amazon KMS 返回明文数据密钥以及根据 KMS 密钥加密的数据密钥的副本。

  2. Secrets Manager 使用明文数据密钥和高级加密标准 (AES) 算法在 Amazon KMS 之外对密钥值加密。然后,它将尽快从内存中删除明文密钥。

  3. Secrets Manager 将加密的数据密钥存储在密钥的元数据中,使其可用于解密密钥值。但是,任何一个 Secrets Manager API 均不会返回加密的密钥或加密的数据密钥。

对已加密的密钥值解密:

  1. Secrets Manager 调用 Amazon KMS Decrypt 操作并传入已加密的数据密钥。

  2. Amazon KMS 使用密钥的 KMS 密钥来解密数据密钥。它将返回明文数据密钥。

  3. Secrets Manager 使用该明文数据密钥来解密密钥值。然后,它会尽快从内存中删除数据密钥。

Secrets Manager 如何使用您的 KMS 密钥

Secrets Manager 使用与密钥关联的 KMS 密钥来为每个密钥值生成数据密钥。当 Secrets Manager 需要对加密的密钥值解密时,还使用 KMS 密钥来解密该数据密钥。您可以在 Amazon CloudTrail 事件、Amazon CloudWatch Logs 和审计跟踪中跟踪请求和响应。

以下 Secrets Manager 操作将触发使用 KMS 密钥的请求。

GenerateDataKey

Secrets Manager 调用 Amazon KMS GenerateDataKey 操作来响应以下 Secrets Manager 操作。

  • CreateSecret – 如果新密钥包含密钥值,Secrets Manager 将请求新数据密钥来对其加密。

  • PutSecretValue– Secrets Manager 请求新数据密钥来对指定的密钥值加密。

  • UpdateSecret – 如果您更改了密钥值或 KMS 密钥,Secrets Manager 将请求新数据密钥来对新密钥值加密。

注意

RotateSecret 操作不会调用 GenerateDataKey,因为它不更改密钥值。但是,如果 RotateSecret 调用的 Lambda 函数更改了密钥值,则其调用 PutSecretValue 操作时将触发 GenerateDataKey 请求。

Decrypt

为对加密的密钥值解密,Secrets Manager 将调用 Amazon KMS Decrypt 操作,来对密钥中的已加密数据密钥解密。然后,它使用明文数据密钥来对已加密密钥值解密。

Secrets Manager 调用 Decrypt 操作来响应以下 Secrets Manager 操作。

  • GetSecretValue – Secrets Manager 解密密钥值,然后将其返回给调用方。

  • PutSecretValueUpdateSecret – 大多数 PutSecretValueUpdateSecret 请求不会触发 Decrypt 操作。但是,当 PutSecretValueUpdateSecret 请求尝试更改现有密钥版本中的密钥值时,Secrets Manager 将对现有密钥值解密并将其与请求中的密钥值比较,以确认两者是否相同。此操作可确保 Secrets Manager 操作为幂等操作。

验证对 KMS 密钥的访问

当您建立或更改与密钥关联的 KMS 密钥时,Secrets Manager 将用指定的 KMS 调用 GenerateDataKeyDecrypt 操作。这些调用确认调用方是否有权将该 KMS 密钥用于这些操作。Secrets Manager 将放弃这些操作的结果;它不在任何加密操作中使用这些结果。

您可以识别这些验证调用,因为这些请求中 SecretVersionId 密钥加密上下文的值为 RequestToValidateKeyAccess

注意

过去,Secrets Manager 验证调用不包含加密上下文。在较早的 Amazon CloudTrail 日志中可能会找到没有加密上下文的调用。

KMS 密钥的权限

当 Secrets Manager 在加密操作中使用 KMS 密钥时,它代表创建或更改密钥中的密钥值的用户执行操作。

要代表您将 KMS 密钥用于密钥,用户必须拥有以下权限。您可以在 IAM 策略或密钥策略中指定这些所需的权限。

  • kms:GenerateDataKey

  • kms:Decrypt

要仅允许将 KMS 密钥用于源自 Secrets Manager 的请求,可将 kms:ViaService 条件密钥secretsmanager.<Region>.amazonaws.com 值结合使用。

您还可以在加密上下文中将密钥或值用作将 KMS 密钥用于加密操作的条件。例如,可在 IAM 或密钥策略文档中使用字符串条件运算符,或在授权中使用授权约束

Amazon 托管式密钥 (aws/secretsmanager) 的密钥策略

仅当 Secrets Manager 代表用户发出请求时,用于 Amazon 托管式密钥 for Secrets Manager (aws/secretsmanager) 的密钥策略才向用户授予将 KMS 密钥用于指定操作的权限。密钥策略不允许任何用户直接使用 KMS 密钥。

此密钥策略与所有 Amazon 托管式密钥 策略类似,均由该服务来建立。您无法更改密钥策略,但可以随时查看。有关详细信息,请参阅查看密钥策略

密钥策略中的策略语句具有以下影响:

  • 仅当 Secrets Manager 代表账户中的用户发出请求时,才允许这些用户使用 KMS 密钥执行加密操作。kms:ViaService 条件密钥可强制实施此限制。

  • 允许 Amazon 账户创建 IAM 策略以允许用户查看 KMS 密钥属性和撤销授权。

  • 尽管 Secrets Manager 不使用授权来获取 KMS 密钥的访问权限,但该策略还允许 Secrets Manager 代表用户创建 KMS 密钥授权,并允许帐户撤销任何允许 Secrets Manager 使用 KMS 密钥的授权。这些是 Amazon 托管式密钥 的策略文档的标准元素。

下面是 Secrets Manager 的 Amazon 托管式密钥 示例的密钥策略。

{ "Version" : "2012-10-17", "Id" : "auto-secretsmanager-1", "Statement" : [ { "Sid" : "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS S ecrets Manager", "Effect" : "Allow", "Principal" : { "AWS" : "*" }, "Action" : [ "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:Describ eKey" ], "Resource" : "*", "Condition" : { "StringEquals" : { "kms:ViaService" : "secretsmanager.us-west-2.amazonaws.com", "kms:CallerAccount" : "111122223333" } } },{ "Sid" : "Allow direct access to key metadata to the account", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::111122223333:root" }, "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ], "Resource" : "*" } ] }

Secrets Manager 加密上下文

加密上下文 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时,Amazon KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。

在发送给 Amazon KMS 的 GenerateDataKeyDecrypt 请求中,Secrets Manager 使用具有两个用于标识密钥及其版本的名称-值对的加密上下文,如以下示例所示。名称不会变化,但与其组合的加密上下文会因每个密钥值而异。

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" }

您可以使用加密上下文在审计记录和日志中标识这些加密操作(例如 Amazon CloudTrail 和 Amazon CloudWatch Logs),并将加密上下文用作在策略和授权中进行授权的条件。

Secrets Manager 加密上下文包含两个名称–值对。

  • SecretARN – 第一个名称–值对标识密钥。密钥是 SecretARN。该值是密钥的 Amazon Resource Name (ARN)。

    "SecretARN": "ARN of an Secrets Manager secret"

    例如,如果密钥的 ARN 是 arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3,加密上下文将包括以下对。

    "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3"
  • SecretVersionId – 第二个名称–值对标识密钥的版本。密钥是 SecretVersionId。该值为版本 ID。

    "SecretVersionId": "<version-id>"

    例如,如果密钥的版本 ID 是 EXAMPLE1-90ab-cdef-fedc-ba987SECRET1,加密上下文将包括以下对。

    "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"

当您建立或更改密钥的 KMS 密钥时,Secrets Manager 会将 GenerateDataKeyDecrypt 请求发送到 Amazon KMS,以验证调用方是否有权将 KMS 密钥用于这些操作。它将放弃响应,并且不对密钥值使用这些响应。

在这些验证请求中,SecretARN 的值是密钥的实际 ARN,但 SecretVersionId 值为 RequestToValidateKeyAccess,如以下加密上下文示例中所示。此特殊值可帮助您在日志和审核跟踪中标识验证请求。

"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "RequestToValidateKeyAccess" }
注意

在过去,Secrets Manager 验证请求不包含加密上下文。在较早的 Amazon CloudTrail 日志中可能会找到没有加密上下文的调用。

监控 Secrets Manager 与 Amazon KMS 交互

您可以使用 Amazon CloudTrail 和 Amazon CloudWatch Logs 来跟踪 Secrets Manager 代表您发送给 Amazon KMS 的请求。有关监测密钥使用的更多信息,请参阅 监控 Amazon Secrets Manager 密钥

GenerateDataKey

当您在密钥中创建或更改密钥值时,Secrets Manager 将向 Amazon KMS 发送 GenerateDataKey 请求,为密钥指定 KMS 密钥。

记录 GenerateDataKey 操作的事件与以下示例事件类似。该请求由 secretsmanager.amazonaws.com 调用。参数包括密钥的 KMS 密钥的 Amazon Resource Name (ARN)、需要 256 位密钥的密钥说明符以及标识密钥和版本的加密上下文

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:23:41Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:23:41Z", "eventSource": "kms.amazonaws.com", "eventName": "GenerateDataKey", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "keySpec": "AES_256", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "a7d4dd6f-6529-11e8-9881-67744a270888", "eventID": "af7476b6-62d7-42c2-bc02-5ce86c21ed36", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }
Decrypt

每当您获取或更改密钥的密钥值时,Secrets Manager 都会向 Amazon KMS 发送 Decrypt 请求,以对已加密数据密钥进行解密。

记录 Decrypt 操作的事件与以下示例事件类似。用户是您的 Amazon 账户中正在访问表的委托人。参数包括加密表密钥(作为密文 blob)以及标识表和 Amazon 账户的加密上下文。Amazon KMS 从密文得出 KMS 密钥 ID。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2018-05-31T23:36:09Z" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2018-05-31T23:36:09Z", "eventSource": "kms.amazonaws.com", "eventName": "Decrypt", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" } }, "responseElements": null, "requestID": "658c6a08-652b-11e8-a6d4-ffee2046048a", "eventID": "f333ec5c-7fc1-46b1-b985-cbda13719611", "readOnly": true, "resources": [ { "ARN": "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "accountId": "111122223333", "type": "AWS::KMS::Key" } ], "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }