如何Amazon Systems ManagerParameter Store 使用Amazon KMS - Amazon Key Management Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

如何Amazon Systems ManagerParameter Store 使用Amazon KMS

与Amazon Systems Manager参数存储,您可以创建安全字符串参数,这些参数具有明文参数名称和加密的参数值。Parameter Store 使用Amazon KMS以加密和解密安全字符串参数的值。

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

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

重要

Parameter Store 仅支持对称 CMK。不能使用非对称 CMK来加密您的参数。要获取确定 CMK 是对称还是非对称的帮助,请参阅识别对称 CMK 和非对称 CMK

Parameter Store 支持两个级别的安全字符串参数:标准Advanced。不能超过 4096 字节的标准参数直接在指定的 CMK 下进行加密和解密。要加密和解密高级安全字符串参数,参数存储将信封加密与Amazon Encryption SDK。您可以将标准安全字符串参数转换为高级参数,但不能将高级参数转换为标准参数。有关标准和高级安全字符串参数之间差异的更多信息,请参阅关于 Systems Manager 高级参数中的Amazon Systems Manager用户指南。

保护标准安全字符串参数

参数存储不执行任何加密操作。相反,它依赖于Amazon KMS以加密和解密安全字符串参数值。在创建或更改标准安全字符串参数值时,参数存储会调用Amazon KMS Encryptoperation. 该操作直接使用对称 Amazon KMS CMK 加密参数值,而不是使用 CMK 生成数据密钥

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

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

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

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

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

以下示例使用 Systems Managerput-Parameter命令及其--type中的参数Amazon CLI以创建安全字符串参数。因为该命令省略了可选的--tier--key-id参数,则参数存储创建标准安全字符串参数,然后在Amazon托管 CMK。

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

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

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

从 Parameter Store 中获取安全字符串参数时,将对该参数值进行加密。要获取参数,请使用GetParameter操作在 Systems Manager API 中。

以下示例使用 Systems ManagerGet-Parameter命令Amazon CLI获取MyParameter参数,而不解密其值。

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

要在返回之前解密参数值,请将 GetParameterWithDecryption 参数设置为 true。当您使用WithDecryption,参数存储会调用Amazon KMS Decrypt操作以解密该参数值。因此,GetParameter 请求返回参数以及明文参数值,如以下示例中所示。

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

以下工作流程说明了参数存储如何使用Amazon KMSCMK 加密和解密标准安全字符串参数。

加密标准参数

  1. 当您使用PutParameter创建安全字符串参数时,Parameter Store 将向Encrypt请求Amazon KMS。该请求包含明文参数值、您选择的 CMK 以及参数存储加密上下文。在传输过程中Amazon KMS,则将通过传输层安全性 (TLS) 保护安全字符串参数中的明文值。

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

    
              加密标准安全字符串参数值

解密标准参数

  1. 当您包含WithDecryption中的参数GetParameter请求时,参数存储会发送Decrypt请求Amazon KMS与加密的安全字符串参数值和参数存储加密上下文

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

  3. 参数 Store 向您返回明文参数值。GetParameter响应如下.

保护高级安全字符串参数

当您使用PutParameter创建高级安全字符串参数,参数存储使用信封加密与Amazon Encryption SDK和对称Amazon KMS客户主密钥 (CMK) 以保护参数值。每个高级参数值在唯一数据密钥下加密,数据密钥在 Amazon KMS CMK 下加密。您可以将 Amazon 托管 CMK 用于账户 (aws/ssm) 或任何客户托管 CMK。

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

对于每个安全字符串参数值,参数存储调用Amazon Encryption SDK以使用唯一数据密钥对参数值进行加密Amazon KMS生成 (GenerateDataKey)。这些区域有:Amazon Encryption SDK返回到 Parameter Store加密的消息,其中包含加密的参数值和唯一数据密钥的加密副本。参数存储将整个加密消息存储在安全字符串参数值中。然后,在您获取高级安全字符串参数值时,Parameter Store 将使用Amazon Encryption SDK以解密该参数值。这需要调用 Amazon KMS 以解密加密的数据密钥。

要创建高级安全字符串参数,请使用PutParameter操作在 Systems Manager API 中。将 Tier 参数的值设置为 Advanced。请包含具有 SecureString 值的 Type 参数。要指定 Amazon KMS CMK,请使用 KeyId 参数。默认值为您的账户的 Amazon 托管 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

在从参数存储获取安全字符串参数时,其值为Amazon Encryption SDK返回。要获取参数,请使用GetParameter操作在 Systems Manager API 中。

以下示例使用 Systems ManagerGetParameter操作,获取MyParameter参数,而不解密其值。

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

要在返回之前解密参数值,请将 GetParameterWithDecryption 参数设置为 true。当您使用WithDecryption,参数存储会调用Amazon KMS Decrypt操作以解密该参数值。因此,GetParameter 请求返回参数以及明文参数值,如以下示例中所示。

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

您无法将高级安全字符串参数转换为标准参数,但可以将标准安全字符串转换为高级参数。要将标准安全字符串参数转换为高级安全字符串,请使用PutParameter的操作Overwrite参数。Type 必须为 SecureString,并且 Tier 值必须为 AdvancedKeyId 参数(它标识客户托管 CMK)是可选的。如果省略它,参数存储将使用Amazon托管 CMK。您可以指定委托人有权使用的任何 CMK,即使您使用不同的 CMK 来加密标准参数也是如此。

当您使用Overwrite参数,参数存储使用Amazon Encryption SDK以加密该参数值。然后,它将新加密的消息存储存在参数存储中。

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

以下工作流程说明了参数存储如何使用Amazon KMSCMK 加密和解密高级安全字符串参数。

加密高级参数

  1. 当您使用PutParameter创建高级安全字符串参数,参数存储使用Amazon Encryption SDK和Amazon KMS以加密该参数值。Parameter Store 调用Amazon Encryption SDK与参数值一起使用,Amazon KMS您指定的 CMK,以及参数存储加密上下文

  2. 这些区域有:Amazon Encryption SDK发送GenerateDataKey请求Amazon KMS替换为您指定的 CMK 的标识符和参数存储加密上下文。Amazon KMS返回唯一数据密钥的两个副本:一个是明文副本,一个是使用 CMK 加密的副本。(加密数据密钥时将使用加密上下文。)

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

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

    
              加密高级安全字符串参数值

解密高级参数

  1. 您可以将WithDecryption中的参数GetParameter请求以获取高级安全字符串参数。执行此操作时,参数存储将传递加密的消息从参数值转换为Amazon Encryption SDK。

  2. 这些区域有:Amazon Encryption SDK调用Amazon KMS Decryptoperation. 它传入加密消息中的加密的数据密钥和参数存储加密上下文。

  3. Amazon KMS使用 CMK 和参数存储加密上下文来解密加密的数据密钥。然后,它向 Amazon Encryption SDK 返回明文(解密的)数据密钥 。

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

  5. 参数存储验证加密上下文,并在GetParameter响应如下.

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

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

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

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

下面是一个 IAM 策略示例,它为标准安全字符串参数设计的。此策略允许用户调用 Systems ManagerPutParameter操作中的所有参数FinancialParameters路径。此策略还允许用户对示例客户托管 CMK 调用 Amazon 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" } ] }

下一个示例显示用于高级安全字符串参数的 IAM 策略。此策略允许用户调用 Systems ManagerPutParameter操作中的所有参数ReservedParameters路径。此策略还允许用户对示例客户托管 CMK 调用 Amazon 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 策略,该策略可用于标准或高级安全字符串参数。此策略允许用户调用 Systems ManagerGetParameter操作(以及相关操作)ITParameters路径。此策略还允许用户对示例客户托管 CMK 调用 Amazon 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" } ] }

参数存储加密上下文

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

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

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

参数存储在加密操作中使用以下加密上下文:

  • 键:PARAMETER_ARN

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

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

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

例如,参数存储在调用中包含以下加密上下文以加密和解密MyParameter示例中的参数 Amazon Web Services 账户 和区域性的节点。

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

如果该参数位于参数存储分层路径中,则在加密上下文中包含路径和名称。例如,在加密和解密MyParameter中的参数/ReadableParameters示例中的路径 Amazon Web Services 账户 和区域性的节点。

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

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

您还可以在 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" } } } ] }

排查参数存储中的 CMK 问题

要对安全字符串参数执行任何操作,参数存储必须能够使用Amazon KMS您为预期操作指定的 CMK。与 CMK 相关的大多数参数存储故障都是由以下问题造成的:

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

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

  • 找不到 CMK。

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

  • 未启用 CMK。发生这种情况时,参数存储将返回InvalidKeyId异常,以及来自Amazon KMS。如果 CMK 状态为 Disabled,请启用它。如果状态为 Pending Import,请完成导入过程。如果密钥状态为 Pending Deletion,请取消密钥删除或使用不同的 CMK。

    要查找键状态中的 CMKAmazon KMS控制台上的客户托管密钥或者Amazon托管密钥页面上,请参阅状态列。要使用 Amazon KMS API 查找 CMK 的状态,请使用 DescribeKey 操作。