本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Secrets Manager 中的密钥加密和解密
Secrets Manager 使用信封加密以及 AWS KMS 密钥和数据密钥来保护每个密钥值。每当密钥中的密钥值更改时,Secrets Manager 都会从 AWS KMS 请求新数据密钥以为其提供保护。然后,用 KMS 密钥加密数据密钥,存储在密钥元数据中。要解密密钥,Secrets Manager 首先使用 AWS KMS 中的 KMS 密钥解密已加密的数据密钥。
Secrets Manager 不使用 KMS 直接对密钥值加密。相反,它使用 KMS 密钥来生成和加密 256 位高级加密标准 (AES) 对称数据密钥,并使用数据密钥对密钥值加密。Secrets Manager 使用明文数据密钥在 AWS KMS 之外对密钥值加密,然后将其从内存中删除。它将数据密钥的加密副本存储在密钥的元数据中。
主题
选择 AWS KMS 密钥
创建密钥时,您可以选择 AWS 账户和区域中的任何对称加密客户管理的密钥,也可以使用适用于 Secrets Manager 的 AWS 托管式密钥(aws/secretsmanager
)。如果您选择了 AWS 托管式密钥 aws/secretsmanager
,但它尚不存在,Secrets Manager 会创建它并将其与密钥关联。可对您账户中的每个密钥使用相同的 KMS 密钥或不同的 KMS 密钥。您可能希望使用不同的 KMS 密钥为一组密钥设置密钥的自定义权限,或者如果您希望审计这些密钥的特定操作。Secrets Manager 仅支持对称加密 KMS 密钥。如果您在外部密钥存储中使用 KMS 密钥,则对 KMS 密钥的加密操作可能需要更长时间,而且可靠性和持久性会降低,因为请求必须在 AWS 外部传输。
有关更改秘密的加密密钥的信息,请参阅 更改 AWS Secrets Manager 秘密的加密密钥。
当您更改加密密钥时,Secrets Manager 会使用新密钥重新加密 AWSCURRENT
、AWSPENDING
和 AWSPREVIOUS
版本。为了避免将您锁定在密钥之外,Secrets Manager 会使用以前的密钥加密所有现有版本。这意味着您可以使用以前的密钥或新密钥解密 AWSCURRENT
、AWSPENDING
和 AWSPREVIOUS
版本。如果没有先前密钥的 kms:Decrypt
权限,则当您更改加密密钥时,Secrets Manager 无法解密密钥版本来重新加密它们。在这种情况下,现有版本不会被重新加密。
为了使只能通过新加密密钥解密 AWSCURRENT
,请使用新密钥创建新版本的密钥。然后,为了能够解密 AWSCURRENT
密钥版本,您必须拥有新密钥的权限。
您可以拒绝对 AWS 托管式密钥 aws/secretsmanager
的权限,并要求使用客户自主管理型密钥对密钥进行加密。有关更多信息,请参阅 示例:拒绝使用特定 AWS KMS 密钥对密钥进行加密。
要查找与密钥关联的 KMS 密钥,请在控制台中查看密钥或调用 ListSecrets 或者 DescribeSecret。当密钥与适用于 Secrets Manager (aws/secretsmanager
) 的 AWS 托管式密钥 关联时,这些操作不会返回 KMS 密钥标识符。
什么是加密?
Secrets Manager 会加密密钥值,但不对以下项进行加密:
-
密钥名称和描述
-
轮换设置
-
与密钥关联的 KMS 密钥 ARN
-
任何附加的 AWS 标签
加密和解密流程
为了对密钥中的密钥值加密,Secrets Manager 使用以下过程。
-
Secrets Manager 使用密钥 KMS 密钥的 ID,以及 256 位 AES 对称密钥的请求来调用 AWS KMS GenerateDataKey 操作。AWS KMS 返回明文数据密钥以及根据 KMS 密钥加密的数据密钥的副本。
-
Secrets Manager 使用明文数据密钥和高级加密标准 (AES) 算法在 AWS KMS 之外对密钥值加密。然后,它将尽快从内存中删除明文密钥。
-
Secrets Manager 将加密的数据密钥存储在密钥的元数据中,使其可用于解密密钥值。但是,任何一个 Secrets Manager API 均不会返回加密的密钥或加密的数据密钥。
对已加密的密钥值解密:
-
Secrets Manager 调用 AWS KMS Decrypt 操作并传入已加密的数据密钥。
-
AWS KMS 使用密钥的 KMS 密钥来解密数据密钥。它将返回明文数据密钥。
-
Secrets Manager 使用该明文数据密钥来解密密钥值。然后,它会尽快从内存中删除数据密钥。
KMS 密钥的权限
当 Secrets Manager 在加密操作中使用 KMS 密钥时,它会代表创建或更新密钥值的用户执行操作。您可以在 IAM policy 或密钥政策中提供这些权限。以下 Secrets Manager 操作需要 AWS KMS 权限:
要仅允许将 KMS 密钥用于源自 Secrets Manager 的请求,在权限策略中,可将 kms:ViaService 条件密钥与 secretsmanager.
值结合使用。<Region>
.amazonaws.com
您还可以在加密上下文中将密钥或值用作将 KMS 密钥用于加密操作的条件。例如,可在 IAM 或密钥策略文档中使用字符串条件运算符,或在授权中使用授权约束。KMS 密钥授权传播可能需要长达五分钟的时间。有关更多信息,请参阅创建授权。
Secrets Manager 如何使用您的 KMS 密钥
Secrets Manager 使用您的 KMS 密钥调用以下 AWS KMS 操作。
- GenerateDataKey
-
Secrets Manager 调用 AWS 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 操作。
-
GetSecretValue 和 BatchGetSecretValue – Secrets Manager 先解密秘密值,然后再将其返回给调用方。为对加密的密钥值解密,Secrets Manager 将调用 AWS KMS Decrypt 操作,来对密钥中的已加密数据密钥解密。然后,它使用明文数据密钥来对已加密密钥值解密。对于批处理命令,Secrets Manager 可以重复使用解密后的密钥,因此并非所有调用都会产生
Decrypt
请求。 -
PutSecretValue 和 UpdateSecret – 大多数
PutSecretValue
和UpdateSecret
请求不会触发Decrypt
操作。但是,当PutSecretValue
或UpdateSecret
请求尝试更改现有密钥版本中的密钥值时,Secrets Manager 将对现有密钥值解密并将其与请求中的密钥值比较,以确认两者是否相同。此操作可确保 Secrets Manager 操作为幂等操作。为对加密的密钥值解密,Secrets Manager 将调用 AWS KMS Decrypt 操作,来对密钥中的已加密数据密钥解密。然后,它使用明文数据密钥来对已加密密钥值解密。 -
ReplicateSecretToRegions – Secrets Manager 首先解密主区域中的秘密值,然后使用副本区域中的 KMS 密钥重新加密秘密值。
-
- Encrypt
-
Secrets Manager 调用 Encrypt 操作来响应以下 Secrets Manager 操作:
-
UpdateSecret – 如果您更改 KMS 密钥,Secrets Manager 会使用新密钥重新加密保护
AWSCURRENT
、AWSPREVIOUS
和AWSPENDING
密钥版本的数据密钥。 -
ReplicateSecretToRegions – Secrets Manager 在复制过程中使用副本区域中的 KMS 密钥重新加密数据密钥。
-
- DescribeKey
-
密钥管理器调用 DescribeKey 操作来确定在密钥管理器控制台中创建或编辑密钥时是否列出 KMS 密钥。
- 验证对 KMS 密钥的访问
-
当您建立或更改与密钥关联的 KMS 密钥时,Secrets Manager 将用指定的 KMS 调用
GenerateDataKey
和Decrypt
操作。这些调用确认调用方是否有权将该 KMS 密钥用于这些操作。Secrets Manager 将放弃这些操作的结果;它不在任何加密操作中使用这些结果。您可以识别这些验证调用,因为这些请求中
SecretVersionId
密钥加密上下文的值为RequestToValidateKeyAccess
。注意
过去,Secrets Manager 验证调用不包含加密上下文。在较早的 AWS CloudTrail 日志中可能会找到没有加密上下文的调用。
AWS 托管式密钥 (aws/secretsmanager
) 的密钥策略
仅当 Secrets Manager 代表用户发出请求时,用于 AWS 托管式密钥 for Secrets Manager (aws/secretsmanager
) 的密钥策略才向用户授予将 KMS 密钥用于指定操作的权限。密钥策略不允许任何用户直接使用 KMS 密钥。
此密钥策略与所有 AWS 托管式密钥 策略类似,均由该服务来建立。您无法更改密钥策略,但可以随时查看。有关详细信息,请参阅查看密钥策略。
密钥策略中的策略语句具有以下影响:
-
仅当 Secrets Manager 代表账户中的用户发出请求时,才允许这些用户使用 KMS 密钥执行加密操作。
kms:ViaService
条件密钥可强制实施此限制。 -
允许 AWS 账户创建 IAM policy 以允许用户查看 KMS 密钥属性和撤销授权。
-
尽管 Secrets Manager 不使用授权来获取 KMS 密钥的访问权限,但该策略还允许 Secrets Manager 代表用户创建 KMS 密钥授权,并允许帐户撤销任何允许 Secrets Manager 使用 KMS 密钥的授权。这些是 AWS 托管式密钥 的策略文档的标准元素。
下面是 Secrets Manager 的 AWS 托管式密钥 示例的密钥策略。
{ "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 加密上下文
加密上下文 是一组包含任意非机密数据的键值对。在请求中包含加密上下文以加密数据时,AWS KMS 以加密方式将加密上下文绑定到加密的数据。要解密数据,您必须传入相同的加密上下文。
在发送给 AWS KMS 的 GenerateDataKey 和 Decrypt 请求中,Secrets Manager 使用具有两个用于标识密钥及其版本的名称-值对的加密上下文,如以下示例所示。名称不会变化,但与其组合的加密上下文会因每个密钥值而异。
"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1" }
您可以使用加密上下文在审计记录和日志中标识这些加密操作(例如 AWS 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 会将 GenerateDataKey 和 Decrypt 请求发送到 AWS KMS,以验证调用方是否有权将 KMS 密钥用于这些操作。它将放弃响应,并且不对密钥值使用这些响应。
在这些验证请求中,SecretARN
的值是密钥的实际 ARN,但 SecretVersionId
值为 RequestToValidateKeyAccess
,如以下加密上下文示例中所示。此特殊值可帮助您在日志和审核跟踪中标识验证请求。
"encryptionContext": { "SecretARN": "arn:aws:secretsmanager:us-east-2:111122223333:secret:test-secret-a1b2c3", "SecretVersionId": "RequestToValidateKeyAccess" }
注意
在过去,Secrets Manager 验证请求不包含加密上下文。在较早的 AWS CloudTrail 日志中可能会找到没有加密上下文的调用。
监控 Secrets Manager 与 AWS KMS 交互
您可以使用 AWS CloudTrail 和 Amazon CloudWatch Logs 来跟踪 Secrets Manager 代表您发送给 AWS KMS 的请求。有关监测密钥使用的更多信息,请参阅 监控 AWS Secrets Manager 密钥。
- GenerateDataKey
-
当您在密钥中创建或更改密钥值时,Secrets Manager 将向 AWS 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 都会向 AWS KMS 发送 Decrypt 请求,以对已加密数据密钥进行解密。对于批处理命令,Secrets Manager 可以重复使用解密后的密钥,因此并非所有调用都会产生
Decrypt
请求。记录
Decrypt
操作的事件与以下示例事件类似。用户是您的 AWS 账户中正在访问表的委托人。参数包括加密表密钥(作为密文 blob)以及标识表和 AWS 账户的加密上下文。AWS 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 会向 AWS KMS 发送 Encrypt 请求,要求使用新密钥重新加密
AWSCURRENT
、AWSPREVIOUS
和AWSPENDING
密钥版本。当您将密钥复制到另一个区域时,Secrets Manager 还会向 AWS KMS 发送 Encrypt 请求。记录
Encrypt
操作的事件与以下示例事件类似。用户是您的 AWS 账户中正在访问表的委托人。{ "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" }