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

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

中的秘密加密和解密 Amazon Secrets Manager

Secrets Manager 使用带有 Amazon KMS 密钥数据密钥信封加密来保护每个密钥值。每当密钥中的密钥值发生变化时,Secrets Manager 都会向其请求一个新的数据密钥 Amazon KMS 来保护它。然后,用 KMS 密钥加密数据密钥,存储在密钥元数据中。要解密密密钥,Secrets Manager 首先使用中的 KMS 密钥对加密的数据密钥进行解密。 Amazon KMS

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

创建密钥时,您可以选择 Amazon Web Services 账户 和区域中的任何对称加密客户托管密钥,也可以使用 for Secrets Manager (aws/secretsmanager)。 Amazon 托管式密钥 如果你选择但它还不存在 Amazon 托管式密钥 aws/secretsmanager,则 Secrets Manager 会创建它并将其与密钥关联。可对您账户中的每个密钥使用相同的 KMS 密钥或不同的 KMS 密钥。您可能希望使用不同的 KMS 密钥为一组密钥设置密钥的自定义权限,或者如果您希望审计这些密钥的特定操作。Secrets Manager 仅支持对称加密 KMS 密钥。如果您在外部密钥存储中使用 KMS 密钥,则对 KMS 密钥的加密操作可能需要更长时间,而且可靠性和持久性会降低,因为请求必须在 Amazon外部传输。

有关更改秘密的加密密钥的信息,请参阅 更改密钥的加密 Amazon Secrets Manager 密钥

当您更改加密密钥时,Secrets Manager 会使用新密钥重新加密AWSCURRENTAWSPENDING、和AWSPREVIOUS版本。为了避免将您锁定在密钥之外,Secrets Manager 会使用以前的密钥对所有现有版本进行加密。这意味着您可以使用先前的密钥或新密钥解密AWSCURRENTAWSPENDING、和AWSPREVIOUS版本。

要使其AWSCURRENT只能通过新的加密密钥解密,请使用新密钥创建新版本的密钥。然后,为了能够解AWSCURRENT密密密钥的版本,您必须拥有新密钥的权限。

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

什么是加密?

Secrets Manager 会加密密钥值,但不对以下项进行加密:

  • 密钥名称和描述

  • 轮换设置

  • 与密钥关联的 KMS 密钥 ARN

  • 任何附带的 Amazon 标签

加密和解密流程

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

  1. Secrets Manager 使用密钥的 KMS 密钥的 ID 调用该 Amazon KMS GenerateDataKey操作,并请求提供 256 位 AES 对称密钥。 Amazon KMS 返回一个纯文本数据密钥和在 KMS 密钥下加密的数据密钥的副本。

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

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

对已加密的密钥值解密:

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

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

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

KMS 密钥的权限

当 Secrets Manager 在加密操作中使用 KMS 密钥时,它会代表创建或更新密钥值的用户执行操作。您可以在 IAM policy 或密钥政策中提供这些权限。以下 Secrets Manager 操作需要 Amazon KMS 权限。

要允许 KMS 密钥仅用于源自 Secrets Manager 的请求,可以在权限策略中使用带有secretsmanager.<Region>.amazonaws.com值的 k m ViaService s: 条件密钥

您还可以在加密上下文中将密钥或值用作将 KMS 密钥用于加密操作的条件。例如,可在 IAM 或密钥策略文档中使用字符串条件运算符,或在授权中使用授权约束。KMS 密钥授权传播可能需要长达五分钟的时间。有关更多信息,请参阅CreateGrant

Secrets Manager 如何使用您的 KMS 密钥

Secrets Manager 使用你的 KMS 密钥调用以下 Amazon KMS 操作。

GenerateDataKey

Secrets Manager 调用该 Amazon KMS GenerateDataKey操作是为了响应以下 Secrets Manager 操作。

  • CreateSecret— 如果新密钥包含密钥值,则 Secrets Manager 会请求新的数据密钥对其进行加密。

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

  • ReplicateSecretToRegions— 要加密复制的密钥,Secrets Manager 在副本区域中请求一个 KMS 密钥的数据密钥。

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

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

Decrypt

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

  • GetSecretValueBatchGetSecretValue— Secrets Manager 在将密钥值返回给调用者之前对其进行解密。要解密加密的密钥值,Secrets Manager 会调用 Amazon KMS Decrypt 操作来解密密密钥中的加密数据密钥。然后,它使用明文数据密钥来对已加密密钥值解密。对于批处理命令,Secrets Manager 可以重复使用解密后的密钥,因此并非所有调用都会产生 Decrypt 请求。

  • PutSecretValueUpdateSecret— 大多数 PutSecretValue UpdateSecret and 请求不会触发Decrypt操作。但是,当 PutSecretValueUpdateSecret 请求尝试更改现有密钥版本中的密钥值时,Secrets Manager 将对现有密钥值解密并将其与请求中的密钥值比较,以确认两者是否相同。此操作可确保 Secrets Manager 操作为幂等操作。要解密加密的密钥值,Secrets Manager 会调用 Amazon KMS Decrypt 操作来解密密密钥中的加密数据密钥。然后,它使用明文数据密钥来对已加密密钥值解密。

  • ReplicateSecretToRegions— Secrets Manager 首先解密主区域中的密钥值,然后在副本区域中使用 KMS 密钥重新加密密钥值。

Encrypt

Secrets Manager 调用 Encrypt 操作来响应以下 Secrets Manager 操作:

  • UpdateSecret— 如果您更改 KMS 密钥,Secrets Manager 会使用新密钥重新加密保护AWSCURRENTAWSPREVIOUS、和AWSPENDING机密版本的数据密钥。

  • ReplicateSecretToRegions— Secrets Manager 在复制过程中使用副本区域中的 KMS 密钥对数据密钥进行重新加密。

DescribeKey

当你在 Secrets Manager 控制台中创建或编辑密钥时,Secrets Manager 调用该DescribeKey操作来确定是列出 KMS 密钥。

验证对 KMS 密钥的访问

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

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

注意

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

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

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

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

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

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

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

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

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

{ "Id": "auto-secretsmanager-2", "Version": "2012-10-17", "Statement": [ { "Sid": "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS Secrets Manager", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:CreateGrant", "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "111122223333", "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com" } } }, { "Sid": "Allow access through AWS Secrets Manager for all principals in the account that are authorized to use AWS Secrets Manager", "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": "kms:GenerateDataKey*", "Resource": "*", "Condition": { "StringEquals": { "kms:CallerAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.us-west-2.amazonaws.com" } } }, { "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 方式将加密上下文绑定到加密数据。要解密数据,您必须传入相同的加密上下文。

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

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

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

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 会向发送GenerateDataKey解密请求, 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 会向发送一个GenerateDataKey请求 Amazon KMS ,为该密钥指定 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 以解密加密的数据密钥。对于批处理命令,Secrets Manager 可以重复使用解密后的密钥,因此并非所有调用都会产生 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" }
Encrypt

当您更改与密钥关联的 KMS 密钥时,Secrets Manager 会向发送加密请求,要求使用新密钥重新加AWSPENDINGAWSCURRENTAWSPREVIOUS、和密钥版本。 Amazon KMS 当您将密钥复制到另一个区域时,Secrets Manager 还会向  Amazon KMS 发送 Encrypt 请求。

记录 Encrypt 操作的事件与以下示例事件类似。用户是您 Amazon 账户中访问表格的委托人。

{ "eventVersion": "1.08", "userIdentity": { "type": "IAMUser", "principalId": "AROAIGDTESTANDEXAMPLE:user01", "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "creationDate": "2023-06-09T18:11:34Z", "mfaAuthenticated": "false" } }, "invokedBy": "secretsmanager.amazonaws.com" }, "eventTime": "2023-06-09T18:11:34Z", "eventSource": "kms.amazonaws.com", "eventName": "Encrypt", "awsRegion": "us-east-2", "sourceIPAddress": "secretsmanager.amazonaws.com", "userAgent": "secretsmanager.amazonaws.com", "requestParameters": { "keyId": "arn:aws:kms:us-east-2:111122223333:key/EXAMPLE1-f1c8-4dce-8777-aa071ddefdcc", "encryptionAlgorithm": "SYMMETRIC_DEFAULT", "encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:ChangeKeyTest-5yKnKS", "SecretVersionId": "EXAMPLE1-5c55-4d7c-9277-1b79a5e8bc50" } }, "responseElements": null, "requestID": "129bd54c-1975-4c00-9b03-f79f90e61d60", "eventID": "f7d9ff39-15ab-47d8-b94c-56586de4ab68", "readOnly": true, "resources": [ { "accountId": "AWS Internal", "type": "AWS::KMS::Key", "ARN": "arn:aws:kms:us-west-2:111122223333:key/EXAMPLE1-f1c8-4dce-8777-aa071ddefdcc" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "111122223333", "eventCategory": "Management" }