繁体   English   中英

在 AWS Lambda 中担任角色,SSM 调用拒绝访问

[英]Assumed role in AWS Lambda, access denied on SSM call

我在调用 SSM 的 Lambda function 中收到错误消息:

AccessDeniedException:用户:arn:aws:sts::redacted:assumed-role/LambdaBackend_master_lambda/SpikeLambda 无权执行:资源上的 ssm:GetParameter:arn:aws:ssm:eu-west-1:redacted:parameter/default/密钥/API

但是,我很确定我配置正确:

角色,AssumeRole 为 Lambda(尽管我们从错误消息中知道它有效)。

λ aws iam get-role --role-name LambdaBackend_master_lambda
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    }
                }
            ]
        },
        "RoleId": "redacted",
        "CreateDate": "2017-06-23T20:49:37Z",
        "RoleName": "LambdaBackend_master_lambda",
        "Path": "/",
        "Arn": "arn:aws:iam::redacted:role/LambdaBackend_master_lambda"
    }
}

我的政策:

λ aws iam list-role-policies --role-name LambdaBackend_master_lambda
{
    "PolicyNames": [
        "ssm_read"
    ]
}
λ aws iam get-role-policy --role-name LambdaBackend_master_lambda --policy-name ssm_read
{
    "RoleName": "LambdaBackend_master_lambda",
    "PolicyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "ssm:DescribeParameters"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "ssm:GetParameters"
                ],
                "Resource": "arn:aws:ssm:eu-west-1:redacted:parameter/*",
                "Effect": "Allow"
            }
        ]
    },
    "PolicyName": "ssm_read"
}

我已经通过策略模拟器运行它,它似乎没问题!

AWS IAM 策略模拟

今天玩这个并得到以下内容,从ssm:GetParameters删除 s 并使用ssm:GetParameter在使用 GetParameter 操作时似乎可以工作。 AWS_PROFILE=pstore aws ssm get-parameter --name param_name 这weirded我出去了一下,因为我无法找到这在所有在IAM行动文档 在这里 但是它似乎确实有效,并且 ssm 的文档记录仍然不足。 亚马逊已经更新并移动了它的文档。 文档包含ssm:GetParametersssm:GetParameter

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ssm:DescribeParameters"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": "arn:aws:ssm:eu-west-1:redacted:parameter/*",
            "Effect": "Allow"
        }
    ]
}

就我而言(我使用 AWS SDK for Go V2),我需要ssm:GetParametersByPathssm:GetParameter才能使其工作。

今天遇到了同样的错误。 以下 Java 代码在encrypted = falseparamName引用未加密参数时导致它

    GetParameterRequest request = new GetParameterRequest()
        .withName(paramName)
        .withWithDecryption(encrypted);
    GetParameterResult resultPacket = ssmClient.getParameter(request);

修复方法是在不设置WithDecryption标志的情况下创建未加密的参数请求 - GetParameterRequest request = new GetParameterRequest().withName(paramName);

这实际上取决于您在 Lambda 中使用的命令。

如果您使用boto3.client('ssm').get_parameters(Names=[param1, param2]) ,那么您需要"Action": ["ssm:GetParameters"]

或者,当您使用boto3.client('ssm').get_parameter(Name=param) ,您需要"Action": ["ssm:GetParameter"]

就我而言,我使用的是s3:GetObjects3:ListBucket 为了解决这个错误,我不得不在资源中两次添加存储桶,并在其中一个附加一个* 例如:

{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : [
        "s3:GetObject",
        "s3:ListBucket",
      ],
      "Resource" : [
        "arn:aws:s3:::mybucket/*",
        "arn:aws:s3:::mybucket",
      ]
    },
  ]
}

关于混淆 ssm:GetParameter 和 ssm:GetParameters。 我将策略 AmazonEC2RoleforSSM 附加到某些用户并遇到了同样的问题,“未授权执行:ssm:GetParameter”,因为该策略只有 ssm:GetParameters。 AWS 对该政策附加了弃用警告,并建议改用 AmazonSSMManagedInstanceCore,它同时具有操作 ssm:GetParameters 和 ssm:GetParameter。 然后工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM