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,您可以创建secure string参数,这些参数具有明文参数名称和加密的参数值。Parameter Store 使用 AWS KMS 加密和解密secure string参数的参数值。

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

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

重要

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

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 操作。此操作使用对称 AWS KMS CMK 直接加密参数值,而不是使用 CMK 生成 数据密钥.

您可以选择 CMK 那个 Parameter Store 用于加密参数值。如果您未指定 CMK, Parameter Store 使用 AWS 管理 CMK 那个 Systems Manager 自动创建您的帐户。这个 CMK 拥有 aws/ssm 别名。

如何查看默认 aws/ssm CMK 对于您的帐户,请使用 描述 操作 AWS KMS API。以下示例在别名为 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 的值(它是默认值)。包括 Type 参数 SecureString。要指定 AWS KMS CMK,使用 KeyId 参数。默认值为 AWS 管理 CMK 对于您的帐户, aws/ssm.

Parameter Store 然后致电 AWS KMS Encrypt 使用 CMK 和纯文本参数值。 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 要指定A的参数 客户管理 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=" } }

要在返回之前解密参数值,请设置 WithDecryption 参数 GetParametertrue...使用时 WithDecryption, Parameter Store 呼叫 AWS KMS 解密 代表您解密参数值。因此,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...包括 Type 参数 SecureString...要指定 AWS KMS CMK,使用 KeyId 参数。默认值为 AWS 管理 CMK 对于您的帐户, aws/ssm.

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

以下类似示例使用 --key-id 要指定A的参数 客户管理 CMK. 该示例使用了 CMK,但您可以使用任何有效的 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=" } }

要在返回之前解密参数值,请设置 WithDecryption 参数 GetParametertrue...使用时 WithDecryption, Parameter Store 呼叫 AWS KMS 解密 代表您解密参数值。因此,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 参数结合使用。TheThethe Type 必须 SecureStringTier 值必须 Advanced。TheThethe KeyId 标识客户管理的参数 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. TheThethe AWS 加密 SDK 发送 GenerateDataKey 请求 AWS KMS 标识符 CMK 您指定的和 Parameter Store 加密上下文。 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 操作的权限。

如果您正在使用客户管理 CMKs 对您的 secure string 参数值,您可以使用 IAM 管理加密和解密权限的策略和关键策略。但是,您无法为默认设置访问控制策略 aws/ssm CMK. 有关控制对客户管理访问权限的详细信息 CMKs,参见 AWS KMS 的身份验证和访问控制.

以下示例显示了一个用于标准secure string参数的 IAM 策略。此策略允许用户对 FinancialParameters 路径中的所有参数调用 Systems Manager PutParameter 操作。该策略还允许用户调用 AWS KMS Encrypt 在客户管理的示例上操作 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" } ] }

下一个示例显示用于高级secure string参数的 IAM 策略。此策略允许用户对 ReservedParameters 路径中的所有参数调用 Systems Manager PutParameter 操作。该策略还允许用户调用 AWS KMS GenerateDataKey 在客户管理的示例上操作 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 策略,该策略可用于标准或高级secure string参数。此策略允许用户对 ITParameters 路径中的所有参数调用 Systems Manager GetParameter 操作(以及相关操作)。该策略还允许用户调用 AWS KMS Decrypt 在客户管理的示例上操作 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 加密 SDK 也接受加密上下文,但它以不同方式处理该上下文。Parameter Store 向加密方法提供加密上下文。AWS 加密 SDK 以加密方式将加密上下文绑定到加密数据。它还以明文形式将加密上下文包含在其返回的加密消息的标头中。但与 AWS KMS 不同,AWS 加密 SDK 解密方法不将加密上下文作为输入。相反,在解密数据时,AWS 加密 SDK 将获取加密消息中的加密上下文。Parameter Store 验证加密上下文是否包含在将明文参数值返回给您之前所期望的值。

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

  • 键:PARAMETER_ARN

  • Value 正在加密的参数的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" } } } ] }

故障排 CMK 问题 Parameter Store

执行任何操作 secure string 参数, Parameter Store 必须能够使用 AWS KMS CMK 指定您的预期操作。大多数 Parameter Store 与 CMKs 由以下问题引起:

  • 应用程序正在使用的凭据无权在 CMK.

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

  • TheThethe CMK 未找到。

    这通常会在您使用错误的ID标识符时发生 CMK. 找到正确的标识符 对于 CMK 然后再次尝试命令。

  • TheThethe CMK 未启用。发生这种情况时, Parameter Store 返回 InvalidKeyId 例外情况包含来自 AWS KMS. 如果 CMK 州为 Disabled启用. 如果状态为 Pending Import,请完成导入过程。如果关键状态为 Pending Deletion取消密钥删除 或使用不同的 CMK.

    查找 关键状态 的 CMK 在 AWS KMS 控制台, 客户管理密钥AWS托管密钥 页面,请参阅 状态列. 使用 AWS KMS API以查找 CMK,使用 描述 操作。