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 首先使用 Amazon KMS 中的 KMS 密钥解密已加密的数据密钥。

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

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

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

当您更改秘密的加密密钥时,秘密的现有版本不受影响。只有在密钥更改后创建的新版本才会使用新的加密密钥进行加密。(唯一例外是 AWSCURRENTAWSPENDINGAWSPREVIOUS 版本,Secrets Manager 会对这些版本进行重新加密,以帮助确保您不会被锁在秘密之外。)

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

什么是加密?

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

  • 密钥名称和描述

  • 轮换设置

  • 与密钥关联的 KMS 密钥 ARN

  • 任何附加的 Amazon 标签

加密和解密流程

为了对密钥中的密钥值加密,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 使用该明文数据密钥来解密密钥值。然后,它会尽快从内存中删除数据密钥。

KMS 密钥的权限

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

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

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

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 – 大多数 PutSecretValueUpdateSecret 请求不会触发 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

密钥管理器调用 DescribeKey 操作来确定在密钥管理器控制台中创建或编辑密钥时是否列出 KMS 密钥。

验证对 KMS 密钥的访问

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

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

注意

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

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

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

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

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

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

  • 允许 Amazon 账户创建 IAM policy 以允许用户查看 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 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。

在发送给 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 请求,以对已加密数据密钥进行解密。对于批处理命令,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 会向 Amazon KMS 发送 Encrypt 请求,要求使用新密钥重新加密 AWSCURRENTAWSPREVIOUS 和 AWSPENDING 密钥版本。当您将密钥复制到另一个区域时,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" }