AWS Key Management Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS Systems Manager Parameter Store 如何使用 AWS KMS

借助 AWS Systems Manager Parameter Store,您可以创建secure string参数,这些参数具有明文参数名称和加密的参数值。Parameter Store 使用 AWS KMS 加密和解密secure string参数的参数值。

借助 Parameter Store,您可以将数据作为具有值的参数进行创建、存储和管理。您可以在 Parameter Store 中创建一个参数,然后在多个受您设计的策略和权限限制的应用程序和服务中使用该参数。在需要更改参数值时,您可以更改一个实例,而不是管理对众多源进行的更改,后者很容易出错。Parameter Store 支持参数名称采用分层结构,因此,您可以将某个参数限制为用于特定的用途。

要管理敏感数据,您可以创建secure string参数。在创建或更改secure string参数的参数值时,Parameter Store 使用 AWS KMS 客户主密钥 (CMK) 加密这些参数值。在访问这些参数值时,它也使用 CMK 解密这些值。您可以使用 Parameter Store 为您的账户创建的 AWS 托管 CMK,或者指定您自己的客户托管 CMK

Parameter Store 支持两个级别的secure string参数:标准高级,不能超过 4096 字节的标准参数直接在指定的 CMK 下进行加密和解密。为了加密和解密高级secure string参数,Parameter Store 将信封加密与 AWS 加密 SDK结合使用。您可以将标准secure string参数转换为高级参数,但不能将高级参数转换为标准参数。有关标准和高级secure string参数之间的差异的更多信息,请参阅 AWS Systems Manager 用户指南 中的关于 Systems Manager 高级参数

保护标准安全字符串参数

Parameter Store 不执行任何加密操作。相反,它依赖于 AWS KMS 加密和解密secure string参数值。在创建或更改标准secure string参数值时,Parameter Store 调用 AWS KMS Encrypt API 操作。该操作直接使用 AWS KMS CMK 加密参数值,而不是使用 CMK 生成数据密钥

您可以选择 Parameter Store 使用的 CMK 加密参数值。如果未指定 CMK,Parameter Store 将使用 Systems Manager 在您的账户中自动创建的 AWS 托管 CMK。此 CMK 具有 aws/ssm 别名。

要查看您的账户的默认 aws/ssm CMK,请使用 AWS KMS API 中的 DescribeKey 操作。以下示例在别名为 describe-key 的 AWS Command Line Interface (AWS CLI) 中使用 aws/ssm 命令。

aws kms describe-key --key-id alias/aws/ssm

要创建标准secure string参数,请使用 Systems Manager API 中的 PutParameter 操作。省略 Tier 参数或指定 Standard 的值(它是默认值)。请包含具有 SecureString 值的 Type 参数。要指定 AWS KMS CMK,请使用 KeyId 参数。默认值为您的账户的 AWS 托管 CMK,即 aws/ssm

然后,Parameter Store 使用该 CMK 和明文参数值调用 AWS KMS Encrypt API。AWS KMS 返回加密的参数值,Parameter Store 将该值与参数名称一起存储。

以下示例在 AWS CLI 中使用 Systems Manager put-parameter 命令及其 --type 参数创建secure string参数。由于该命令省略了可选的 --tier--key-id 参数,因此,Parameter Store 将创建标准secure string参数,并在 AWS 托管 CMK 下对其进行加密。

aws ssm put-parameter --name MyParameter --value "secret_value" --type SecureString

以下类似的示例使用 --key-id 参数指定客户托管的 CMK。该示例使用 CMK ID 标识 CMK,但您可以使用任何有效的 CMK 标识符。由于该命令省略 Tier 参数 (--tier),因此,Parameter Store 将创建标准secure string参数而非高级参数。

aws ssm put-parameter --name param1 --value "secret" --type SecureString --key-id 1234abcd-12ab-34cd-56ef-1234567890ab

在从 Parameter Store 获取secure string参数时,将对其值进行加密。要获取参数,请使用 Systems Manager API 中的 GetParameter 操作。

以下示例在 AWS CLI 中使用 Systems Manager get-parameter 命令从 Parameter Store 中获取 MyParameter 参数,而不解密该参数值。

$ aws ssm get-parameter --name MyParameter { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "AQECAHgnOkMROh5LaLXkA4j0+vYi6tmM17Lg/9E464VRo68cvwAAAG8wbQYJKoZIhvcNAQcGoGAwXgIBADBZBgkqhkiG9w0BBwEwHgYJYZZIAWUDBAEuMBEEDImYOw44gna0Jm00hAIBEIAsjgr7mum1EnnXzE3xM8bGle0oKYcfVCHtBkfjIeZGTgL6Hg0fSDnpMHdcSXY=" } }

要在返回之前解密参数值,请将 GetParameterWithDecryption 参数设置为 true。在使用 WithDecryption 时,Parameter Store 代表您调用 AWS KMS Decrypt API 操作以解密该参数值。因此,GetParameter 请求返回参数以及明文参数值,如以下示例中所示。

$ aws ssm get-parameter --name MyParameter --with-decryption { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "secret_value" } }

以下工作流程演示 Parameter Store 如何使用 AWS KMS CMK 加密和解密标准secure string参数。

加密标准参数

  1. 在使用 PutParameter 创建 secure string 参数时,Parameter Store 将向 AWS KMS 发送 Encrypt 请求。该请求包含明文参数值、您选择的 CMK 和 Parameter Store 加密上下文。在传输到 AWS KMS 期间,将通过传输层安全性 (TLS) 保护secure string参数中的明文值。

  2. AWS KMS 使用指定的 CMK 和加密上下文来加密参数值。它将密文返回到 Parameter Store,后者将存储参数名称及其加密值。

    
              加密标准secure string参数值

解密标准参数

  1. GetParameter 请求中包含 WithDecryption 参数时,Parameter Store 向 AWS KMS 发送包含加密的 secure string 参数值和 Parameter Store 加密上下文Decrypt 请求。

  2. AWS KMS 使用相同的 CMK 和提供的加密上下文来解密加密的值。它向 Parameter Store 返回明文(解密的)参数值。在传输期间,将通过 TLS 保护明文数据。

  3. Parameter Store 在 GetParameter 响应中向您返回明文参数值。

保护高级安全字符串参数

在使用 PutParameter 创建高级secure string参数时,Parameter Store 使用信封加密与 AWS 加密 SDK 和 AWS KMS 客户主密钥 (CMK) 来保护参数值。每个高级参数值在唯一数据密钥下加密,数据密钥在 AWS KMS CMK 下加密。您可以将 AWS 托管 CMK 用于账户 (aws/ssm) 或任何客户托管 CMK。

AWS 加密 SDK 是一个开源客户端库,可帮助您使用行业标准和最佳实践来加密和解密数据。它在多个平台上受支持并支持多种编程语言,包括命令行界面。您可以在 GitHub 中查看源代码并加入源代码的开发工作。

对于每个secure string参数值,Parameter Store 调用 AWS 加密 SDK 以使用 AWS KMS 生成的唯一数据密钥 (GenerateDataKey) 来加密参数值。AWS 加密 SDK 向 Parameter Store 返回一条加密消息(其中包含加密参数值)和唯一数据密钥的加密副本。Parameter Store 将整个加密消息存储在secure string参数值中。之后,在您获取高级secure string参数值时,Parameter Store 使用 AWS 加密 SDK 解密参数值。这需要调用 AWS KMS 以解密加密的数据密钥。

要创建高级secure string参数,请使用 Systems Manager API 中的 PutParameter 操作。将 Tier 参数的值设置为 Advanced。请包含具有 SecureString 值的 Type 参数。要指定 AWS KMS CMK,请使用 KeyId 参数。默认值为您的账户的 AWS 托管 CMK,即 aws/ssm

aws ssm put-parameter --name MyParameter --value "secret_value" --type SecureString --tier Advanced

以下类似的示例使用 --key-id 参数指定客户托管的 CMK。此示例使用 CMK 的 Amazon 资源名称 (ARN),但您可以使用任何有效的 CMK 标识符。

aws ssm put-parameter --name MyParameter --value "secret_value" --type SecureString --tier Advanced --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

在从 Parameter Store 获取secure string参数时,其值为 AWS 加密 SDK 所返回的加密消息。要获取参数,请使用 Systems Manager API 中的 GetParameter 操作。

以下示例使用 Systems Manager GetParameter 操作从 Parameter Store 获取 MyParameter 参数,而不解密其值。

$ aws ssm get-parameter --name MyParameter { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "AQECAHgnOkMROh5LaLXkA4j0+vYi6tmM17Lg/9E464VRo68cvwAAAG8wbQYJKoZIhvcNAQcGoGAwXgIBADBZBgkqhkiG9w0BBwEwHgYJYZZIAWUDBAEuMBEEDImYOw44gna0Jm00hAIBEIAsjgr7mum1EnnXzE3xM8bGle0oKYcfVCHtBkfjIeZGTgL6Hg0fSDnpMHdcSXY=" } }

要在返回之前解密参数值,请将 GetParameterWithDecryption 参数设置为 true。在使用 WithDecryption 时,Parameter Store 代表您调用 AWS KMS Decrypt API 操作以解密该参数值。因此,GetParameter 请求返回参数以及明文参数值,如以下示例中所示。

$ aws ssm get-parameter --name MyParameter --with-decryption { "Parameter": { "Type": "SecureString", "Name": "MyParameter", "Value": "secret_value" } }

您无法将高级secure string参数转换为标准参数,但可以将标准secure string参数转换为高级参数。要将标准secure string参数转换为高级secure string参数,请将 PutParameter 操作与 Overwrite 参数结合使用。Type 必须为 SecureString,并且 Tier 值必须为 AdvancedKeyId 参数(它标识客户托管 CMK)是可选的。如果您省略此参数,Parameter Store 将使用该账户的 AWS 托管 CMK。您可以指定委托人有权使用的任何 CMK,即使您使用不同的 CMK 来加密标准参数也是如此。

当您使用 Overwrite 参数时,Parameter Store 使用 AWS 加密 SDK 加密参数值。然后,它会将新加密的消息存储在 Parameter Store 中。

$ aws ssm put-parameter --name myStdParameter --value "secret_value" --type SecureString --tier Advanced --key-id 1234abcd-12ab-34cd-56ef-1234567890ab --overwrite

以下工作流程介绍 Parameter Store 如何使用 AWS KMS CMK 加密和解密高级secure string参数。

加密高级参数

  1. 在使用 PutParameter 创建高级secure string参数时,Parameter Store 使用 AWS 加密 SDK 和 AWS KMS 加密参数值。Parameter Store 调用带参数值的 AWS 加密 SDK、您指定的 AWS KMS CMK 以及 Parameter Store 加密上下文

  2. AWS 加密 SDK 向 AWS KMS 发送包含您指定的 CMK 的标识符和 Parameter Store 加密上下文的 GenerateDataKey 请求。AWS KMS 返回唯一数据密钥的两个副本:一个采用明文形式,一个已在 CMK 下进行加密。(加密数据密钥时将使用加密上下文。)

  3. AWS 加密 SDK 使用明文数据密钥对参数值进行加密。它返回一条加密消息,其中包含加密的参数值、加密的数据密钥和其他数据(包括 Parameter Store 加密上下文)。

  4. Parameter Store 将加密消息存储为参数值。

    
              加密高级secure string参数值

解密高级参数

  1. 您可以将 WithDecryption 参数包含在 GetParameter 请求中以获取高级secure string参数。在执行此操作时,Parameter Store 将加密消息从参数值传递到 AWS 加密 SDK 的解密方法。

  2. AWS 加密 SDK 调用 KMS Decrypt 操作。它传入加密消息中的加密的数据密钥和 Parameter Store 加密上下文。

  3. AWS KMS 使用 CMK 和 Parameter Store 加密上下文来解密加密的数据密钥。然后,它向 AWS 加密 SDK 返回明文(解密的)数据密钥 。

  4. AWS 加密 SDK 使用明文数据密钥对参数值进行解密。它向 Parameter Store 返回明文参数值。

  5. Parameter Store 验证您的加密上下文,并在 GetParameter 响应中向您返回明文参数值。

设置权限以加密和解密参数值

要加密标准secure string参数值,用户需要 kms:Encrypt 权限。要加密高级secure string参数值,用户需要 kms:GenerateDataKey 权限。要解密任一类型的secure string参数值,用户需要 kms:Decrypt 权限。

您可以使用 IAM 策略允许或拒绝用户调用 Systems Manager PutParameterGetParameter 操作的权限。

如果您使用客户托管 CMK 加密secure string参数值,则可使用 IAM 策略和密钥策略来管理加密和解密权限。不过,您无法为默认 aws/ssm CMK 制定访问控制策略。有关控制对客户托管 CMK 的访问的详细信息,请参阅AWS KMS 的身份验证和访问控制

以下示例显示了一个用于标准secure string参数的 IAM 策略。此策略允许用户对 FinancialParameters 路径中的所有参数调用 Systems Manager PutParameter 操作。此策略还允许用户对示例客户托管 CMK 调用 AWS KMS Encrypt 操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:PutParameter" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/FinancialParameters/*" }, { "Effect": "Allow", "Action": [ "kms:Encrypt" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

下一个示例显示用于高级secure string参数的 IAM 策略。此策略允许用户对 ReservedParameters 路径中的所有参数调用 Systems Manager PutParameter 操作。此策略还允许用户对示例客户托管 CMK 调用 AWS KMS GenerateDataKey 操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:PutParameter" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/ReservedParameters/*" }, { "Effect": "Allow", "Action": [ "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

最后一个示例还显示了一个 IAM 策略,该策略可用于标准或高级secure string参数。此策略允许用户对 ITParameters 路径中的所有参数调用 Systems Manager GetParameter 操作(以及相关操作)。此策略还允许用户对示例客户托管 CMK 调用 AWS KMS Decrypt 操作。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter*" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/ITParameters/*" }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab" } ] }

Parameter Store 加密上下文

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

您还可以使用加密上下文在审核记录和日志中识别加密操作。加密上下文在日志中以明文形式显示,例如,AWS CloudTrail 日志。

虽然 AWS 加密 SDK 也接受加密上下文,但它以不同方式处理该上下文。Parameter Store 向加密方法提供加密上下文。AWS 加密 SDK 以加密方式将加密上下文绑定到加密数据。它还以明文形式将加密上下文包含在其返回的加密消息的标头中。但与 AWS KMS 不同,AWS 加密 SDK 解密方法不将加密上下文作为输入。相反,在解密数据时,AWS 加密 SDK 将获取加密消息中的加密上下文。Parameter Store 验证加密上下文是否包含在将明文参数值返回给您之前所期望的值。

Parameter Store 在加密操作中使用以下加密上下文:

  • Key: PARAMETER_ARN

  • 值:要加密的参数的 Amazon 资源名称 (ARN)。

加密上下文的格式如下所示:

"PARAMETER_ARN":"arn:aws:ssm:<REGION_NAME>:<ACCOUNT_ID>:parameter/<parameter-name>"

例如,Parameter Store 在调用中包含此加密上下文,以在示例 AWS 账户和区域中加密和解密 MyParameter 参数。

"PARAMETER_ARN":"arn:aws:ssm:us-west-2:111122223333:parameter/MyParameter"

如果该参数位于 Parameter Store 分层路径中,则在加密上下文中包含路径和名称。例如,在示例 AWS 账户和区域中加密和解密 /ReadableParameters 路径的 MyParameter 参数时,将使用此加密上下文:

"PARAMETER_ARN":"arn:aws:ssm:us-west-2:111122223333:parameter/ReadableParameters/MyParameter"

您可以使用正确的加密上下文和 Systems Manager GetParameter 操作返回加密参数值调用 AWS KMS Decrypt 操作,以解密加密的secure string参数值。不过,我们建议您将 GetParameter 操作与 WithDecryption 参数一起使用以解密 Parameter Store 参数值。

您还可以在 IAM 策略中包含加密上下文。例如,您可以允许用户仅解密某个特定参数值或一组参数值。

以下示例 IAM 策略语句允许用户获取 MyParameter 参数值,以及使用指定的 CMK 解密该参数值。不过,只有在加密上下文与指定的字符串匹配时,这些权限才适用。这些权限不适用于任何其他参数或 CMK;如果加密上下文与该字符串不匹配,对 GetParameter 的调用将失败。

使用类似于此策略语句的策略语句之前,请使用有效值替换示例 ARN。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter*" ], "Resource": "arn:aws:ssm:us-west-2:111122223333:parameter/MyParameter", }, { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "kms:EncryptionContext:PARAMETER_ARN":"arn:aws:ssm:us-west-2:111122223333:parameter/MyParameter" } } } ] }

排查 Parameter Store 中的 CMK 问题

要对secure string参数执行任何操作,Parameter Store 必须能够使用为预期操作指定的 AWS KMS CMK。与 CMK 相关的大多数 Parameter Store 故障都是由以下问题造成的:

  • 应用程序使用的凭证无权对 CMK 执行指定的操作。

    要修复该错误,请使用不同的凭证运行应用程序,或者修改妨碍执行该操作的 IAM 或密钥策略。有关 AWS KMS IAM 和密钥策略的帮助,请参阅AWS KMS 的身份验证和访问控制

  • 找不到 CMK。

    在 CMK 使用不正确的标识符时,通常会发生这种情况。请查找 CMK 的正确标识符,然后重试该命令。

  • 未启用 CMK。在发生这种情况时,Parameter Store 返回 InvalidKeyId 异常,并包含来自 AWS KMS 的详细错误消息。如果 CMK 状态为 Disabled,请启用它。如果状态为 Pending Import,请完成导入过程。如果密钥状态为 Pending Deletion,请取消密钥删除或使用不同的 CMK。

    要在 AWS KMS 控制台中查找 CMK 的密钥状态,请在 Customer managed keys (客户托管密钥)AWS managed keys (AWS 托管密钥) 页面上,参阅状态列。要使用 AWS KMS API 查找 CMK 的状态,请使用 DescribeKey 操作。