当前位置: 首页 > 知识库问答 >
问题:

AWS SSM参数使用KMS解密获取

虞唯
2023-03-14

场景:我们的一个脚本使用boto3 kms api使用kms加密和解密来放置和获取SSM参数。SSM param put工作非常好,并且在EC2 SSM param存储中使用安全字符串添加参数(解密为true)。我们所面临的问题是当解密为真时尝试获取SSM参数值。运行此脚本的相应lambda代码在尝试运行以下boto3脚本时(在运行get_ssm_parameters_by_path时)抛出以下错误:

       session = boto3.Session()
       ssm_client = session.client('ssm', 'us-east-1')
       ssm_parameters = []
       response = ssm_client.get_parameters_by_path(
         Path=self.ssm_parameter_path,
         Recursive=True,
         WithDecryption=True
       )

错误:调用GetParametersByPath操作时出错(AccessDeniedException):密文引用的客户主密钥不存在、不在此区域中或不允许您访问。(服务:AWSKMS;状态代码:400;错误代码:AccessDeniedException;请求ID:eaaxx-7ae7-11e8-97xx5e-b9exxxxxxx410):ClientError

我通过不同的AWS文档与KMS加密和解密工作,并更新了我的政策文档如下,但没有运气到目前为止。lambda使用的角色具有以下策略访问权限:

{
"Sid": "AllowSSMAccess",
"Effect": "Allow",
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"],
"Resource": "arn:aws:kms:us-east-1:AWS_ACCOUNT_NUMBER:key/<aws/ssm default key id>",
"Condition": {
    "StringEquals": {
        "kms:ViaService": "ssm.us-east-1.amazonaws.com",
        "kms:CallerAccount": "AWS_ACCOUNT_NUMBER"
    }
  }
}, 
{
"Sid": "AllowKeyMetadata",
"Effect": "Allow",
"Action": ["kms:Describe*", "kms:Get*", "kms:List*"],
"Resource": "arn:aws:kms:us-east-1:AWS_ACCOUNT_NUMBER:key/<aws/ssm default key id>"
},  
{
  "Sid": "KeyAccess",
  "Effect": "Allow",
  "Action": [
    "kms:Describe*",
    "kms:Enable*",
    "kms:List*",
    "kms:Get*",
"kms:TagResource"
  ],
  "Resource": "arn:aws:kms:us-east-1:AWS_ACCOUNT_NUMBER:key/<aws/ssm default key id>"
}

其中AWS_ACCOUNT_NUMBER是我的AWS帐号,kms密钥id是默认的“AWS/SSM”密钥,用于加密和解密SSM参数。密钥确实存在于帐户中。我们给出的区域是“US-East-1”,所以0可以。错误的最后一部分说“或者您没有访问权限”。

我可以看到,该参数在EC2 SSM param store中可用,并且使用我正在解密的密钥ID正确地进行了解密。

为了成功运行“get_parameters_by_path”,我们需要执行哪些其他策略访问或添加。

共有1个答案

施自怡
2023-03-14

您必须定义以下策略来访问参数存储键。

{
   "Sid": "getParameter",
    "Effect": "Allow",
    "Action": [
        "ssm:GetParameters"
    ],
    "Resource": "arn:aws:ssm:<region>:<AWS_ACCOUNT_NUMBER>:parameter/<Parameter_Store_Key_Name>"
},
{
    "Sid": "decryptKey",
    "Effect": "Allow",
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "arn:aws:kms:<region>:<AWS_ACCOUNT_NUMBER>:key/<aws/ssm_Key_Id>"
}

ssm:getParameters将允许我们访问parameter_store_key_name。请参阅https://docs.aws.amazon.com/kms/latest/developerguide/services-parameter-store.html。

 类似资料:
  • decrypt方法中没有提供KMS密钥。这是否意味着KMS密钥在cyphertext Blob中被加密了?如果是... 如何授予解密加密密文Blob的权限? 如果要解密AWS服务中的值,是否创建IAM角色来执行此操作,并配置KMS密钥以允许该角色进行解密?

  • 一对亚马逊lambda会对称地加密和解密一小块应用数据。我想用亚马逊KMS来方便这一点,因为它解决了秘密存储和密钥旋转的问题,然后一些。 Amazon KMS开发人员指南指出: 这些操作是为了加密和解密数据密钥而设计的。他们在加密操作中使用AWS KMS客户主密钥(CMK),并且不能接受超过4 KB(4096字节)的数据。虽然您可以使用它们来加密少量数据(如密码或RSA密钥),但它们并不是为加密应

  • 我正在尝试使用作为一个具有加密功能的文件系统。 我成功地实现了在AWS S3服务器上使用加密密钥(服务器端加密)上传文件。请找到以下工作代码: 对于加密: 代码:InvalidArgument 消息:使用AWS KMS托管密钥指定服务器端加密的请求需要AWS签名版本4。 使用KMS密钥读取对象: 这样做对吗?有什么建议吗?请帮帮忙。

  • 我无法解决问题,而且文件也没有什么帮助。 我有一个lambda需要使用KMS解密一个值。我正在使用sam部署我的lambda。最初我尝试添加策略声明

  • 我正在从https://docs.AWS.amazon.com/cli/latest/reference/kms/encrypt.html和https://docs.AWS.amazon.com/cli/latest/reference/kms/decrypt.html读取AWS加密cli文档。我发现我可以在不创建数据密钥的情况下加密/解密。当我阅读https://docs.aws.amazon.

  • 谁能给我一个提示如何解决这个问题?我这样做是为了通过servlet链接执行电子邮件确认,如果有人可以建议我另一个解决方案将非常感谢。