首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS SSM参数使用KMS解密获取

AWS SSM参数使用KMS解密获取
EN

Stack Overflow用户
提问于 2018-06-28 23:49:59
回答 2查看 7.6K关注 0票数 5

场景:我们的一个脚本使用boto3 kms接口,通过KMS加密和解密来上传和获取SSM参数。SSM param put工作得很好,在EC2 SSM param存储中添加了带有安全字符串的参数(解密为真)。我们面临的问题是,当试图获得解密为真的SSM参数值时。运行此脚本的相应lambda代码在尝试运行以下boto3脚本(在运行get_ssm_parameters_by_path时)时抛出以下错误:

代码语言:javascript
运行
复制
       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

我查阅了关于使用KMS加密和解密的不同AWS文档,并更新了我的策略文档,如下所示,但到目前为止还没有成功。lambda使用的角色具有以下策略访问权限:

代码语言:javascript
运行
复制
{
"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 key id是用于加密和解密SSM参数的默认"aws/ssm“密钥。该密钥确实存在于帐户中。我们给出的区域是"us-east-1“,所以这没问题,to0。错误的最后一部分写着“或者你没有访问权”。

我可以看到该参数在EC2 SSM参数存储中可用,并且使用我用来解密的密钥ID进行了适当的解密。

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

EN

回答 2

Stack Overflow用户

发布于 2019-01-24 22:05:50

您必须定义以下策略才能访问参数存储密钥。

代码语言:javascript
运行
复制
{
   "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

票数 9
EN

Stack Overflow用户

发布于 2018-07-20 02:01:23

因此,至少对我们来说,解决方案是在IAM中。在列表的底部有一个名为加密密钥的部分。您需要将相关的用户或角色添加到相应的密钥中。这个错误很痛苦,因为它只直接引用SSM,所以它在解决方案的位置上具有误导性。

更多信息:https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51087016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档