场景: 我们的脚本之一使用boto3 kms api通过KMS加密和解密来PUT和GET SSM参数。 SSM参数放置效果非常好,并且使用安全字符串在EC2 SSM参数存储中添加了参数(解密为真)。我们面临的问题是,当尝试使用解密为真来获取SSM参数值时。尝试运行以下boto3脚本时(运行get_ssm_parameters_by_path时),运行该脚本的相应lambda代码会引发以下错误:
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参数存储中可用,并且已使用要解密的KEY ID正确解密。
要成功运行“ get_parameters_by_path”,我们需要执行哪些其他策略访问或添加操作。
答案 0 :(得分:1)
您必须定义以下策略才能访问参数存储密钥。
{
"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。
答案 1 :(得分:0)
因此,至少对我们而言,解决方案是在IAM中。在列表的底部,有一个名为“加密密钥”的部分。您需要将相关用户或角色添加到相关密钥。该错误很痛苦,因为它仅直接涉及SSM,因此对于解决方案的位置具有误导性。