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

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

AWS Systems Manager Parameter Store 如何使用 AWS KMS

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

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

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

重要

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

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

保护标准安全字符串参数

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

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

要查看默认aws/ssmCMK 为您的帐户,请使用DescribeKeyAWS KMS API 中的操作。下面的示例使用了describe-key命令与 AWS Command Line Interface (AWS CLI) 中的aws/ssm别名。

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

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

参数存储然后调用 AWS KMSEncrypt操作,以及明文参数值。AWS KMS 返回加密的参数值,将该值与参数名称一起存储。

以下示例使用 Systems Managerput-Parameter命令及其--type参数创建安全字符串参数。因为该命令省略了可选的--tier--key-id参数时,参数存储将创建标准安全字符串参数,并在 AWS 托管 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 Manager获取参数命 AWS,获取MyParameter参数,而不解密其值。

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

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

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

以下工作流程介绍了参数存储如何使用 AWS KMS CMK 加密和解密标准安全字符串参数。

加密标准参数

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

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

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

解密标准参数

  1. 当您包含WithDecryption中的参数GetParameter请求时,参数存储会发送Decrypt请求添加到 AWS KMS,并使用加密的安全字符串参数值和Parameter Store 加密上下文

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

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

保护高级安全字符串参数

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

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

对于每个安全字符串参数值,参数存储调用 AWS 加密开发工具包,以使用 AWS KMS 生成的唯一数据密钥 (GenerateDataKey)。AWS 加密软件开发工具包返回参数存储加密的消息,其中包含加密参数值和唯一数据密钥的加密副本。参数存储将整个加密消息存储在安全字符串参数值中。之后,在您获取高级安全字符串参数值时,参数存储使用 AWS 加密开发工具包来解密参数值。这需要调用 AWS KMS 以解密加密的数据密钥。

要创建高级安全字符串参数,请使用PutParameter操作在 Systems Manager API 中。将 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

在从参数存储获取安全字符串参数时,其值为 AWS 加密开发工具包返回的加密消息。要获取参数,请使用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,参数存储会调用 AWS KMSDecrypt操作以解密该参数值。因此,GetParameter 请求返回参数以及明文参数值,如以下示例中所示。

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

您无法将高级安全字符串参数转换为标准字符串参数,但可以将标准安全字符串转换为高级字符串。要将标准安全字符串参数转换为高级安全字符串,请使用PutParameter运算符Overwrite参数。这些区域有:Type必须为。SecureStringTier值必须为。AdvancedKeyId 参数(它标识客户托管 CMK)是可选的。如果您省略此参数,参数 Store 将使用该账户的 AWS 托管 CMK。您可以指定委托人有权使用的任何 CMK,即使您使用不同的 CMK 来加密标准参数也是如此。

当您使用Overwrite参数时,Parameter Store 使用 AWS 加密开发工具包对参数值进行加密。然后,它会将新加密的消息存储在参数存储中。

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

以下工作流程介绍了参数存储如何使用 AWS KMS CMK 加密和解密高级安全字符串参数。

加密高级参数

  1. 当您使用PutParameter创建高级安全字符串参数,参数存储使用 AWS 加密软件开发工具包和 AWS KMS 对参数值进行加密。参数存储使用参数值、您指定的 AWS KMS CMK 和Parameter Store 加密上下文

  2. AWS 加密开发工具包发送GenerateDataKey请求发送到 AWS KMS,其中包含您指定的 CMK 标识符和参数存储加密上下文。AWS KMS 返回唯一数据密钥的两个副本:一个是纯文本形式的副本,一个是在 CMK 下加密的副本。(加密数据密钥时将使用加密上下文。)

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

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

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

解密高级参数

  1. 您可以将WithDecryption中的参数GetParameter请求获取高级安全字符串参数。执行此操作时,参数存储将传递加密的消息从参数值转换为 AWS 加密开发工具包的解密方法。

  2. AWS 加密软件开发工具包调用 KMSDecryptoperation. 它传入加密消息中的加密的数据密钥和参数存储加密上下文。

  3. AWS KMS 使用 CMK 和参数存储加密上下文来解密加密的数据密钥。然后,它向 AWS 加密开发工具包返回明文(解密的)数据密钥。

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

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

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

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

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

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

以下示例显示了一个用于标准安全字符串参数的 IAM 策略。此策略允许用户调用 Systems ManagerPutParameter操作中的所有参数FinancialParameters路径。该策略还允许用户调用 AWS KMSEncrypt对示例客户托管 CMK 进行操作。

{ "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路径。该策略还允许用户调用 AWS KMSGenerateDataKey对示例客户托管 CMK 进行操作。

{ "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路径。该策略还允许用户调用 AWS KMSDecrypt操作示例客户托管 CMK 上。

{ "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 加密开发工具包还采用加密上下文,但它以不同方式处理该上下文。Parameter Store 向加密方法提供加密上下文。AWS 加密软件开发工具包以加密方式将加密上下文绑定到加密数据。它还以明文形式将加密上下文包含在其返回的加密消息的标头中。但与 AWS KMS 不同,AWS 加密软件开发工具包解密方法不将加密上下文作为输入。相反,在解密数据时,AWS 加密开发工具包将获取加密消息中的加密上下文。在将明文参数值返回给您之前,参数存储验证加密上下文是否包含所期望的值。

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

  • 键:PARAMETER_ARN

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

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

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

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

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

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

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

您可以通过调用 AWS KMS 来解密加密的安全字符串参数值Decrypt操作与正确的加密上下文和加密参数值,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 问题

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

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

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

  • 找不到 CMK。

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

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

    要查找密钥状态在 AWS KMS 控制台中的客户托管密钥或者AWS 托管密钥页面上,请参阅状态列。要使用 AWS KMS API 查找 CMK 的状态,请使用DescribeKeyoperation.