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

Posted

技术标签:

【中文标题】在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问【英文标题】:Assumed role in AWS Lambda, access denied on SSM call 【发布时间】:2017-11-27 19:25:25 【问题描述】:

我在调用 SSM 的 Lambda 函数中遇到错误:

AccessDeniedException:用户:arn:aws:sts::redacted:assumed-role/LambdaBackend_master_lambda/SpikeLambda 无权执行:ssm:GetParameter on resource:arn:aws:ssm:eu-west-1:redacted:parameter /default/key/api

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

角色,与 Lambda 的 AssumeRole(尽管我们知道从错误消息中可以工作)。

λ 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"

我已经通过策略模拟器运行了它,它似乎很好!

【问题讨论】:

似乎是如何验证 ssm:GetParameters 的错误。当我使用boto3.client('ssm').get_parameter() 时,lambda 权限按预期工作,但我收到您在使用boto3.client('ssm').get_parameters() 时提到的权限错误。 【参考方案1】:

今天玩了这个,得到了以下结果,从ssm:GetParameters 中删除 s 并使用 ssm:GetParameter 似乎在使用 GetParameter 操作时有效。即AWS_PROFILE=pstore aws ssm get-parameter --name param_name这让我有点奇怪,因为我在 iam 操作文档 here 中根本找不到这个。然而,它似乎确实有效,而且 ssm 的文档仍然有点不足。 亚马逊已经更新并移动了它的文档。新的docs 包括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"
        
    ]

【讨论】:

记录不足,但仍然比我使用的某些软件记录得更好!谢谢! 将此策略附加到运行 Lambda 的角色为我解决了这个问题。 我有Action: ["ssm:GetParametersByPath", "ssm:GetParameters", "ssm:GetParameter"],但它失败了。删除前两个并只留下 "ssm:GetParameter" 后,我得到了它的工作【参考方案2】:

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

【讨论】:

谢谢,只有这对我有帮助。标准错误消息令人困惑。【参考方案3】:

今天遇到了同样的错误。当encrypted = falseparamName 引用未加密的参数时,以下Java 代码会导致此问题

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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


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

【讨论】:

以上是关于在 AWS Lambda 中担任角色,在 SSM 调用时拒绝访问的主要内容,如果未能解决你的问题,请参考以下文章

principal states.amazonaws.com 无权担任提供的角色

AWS 服务无法担任角色

使用 Spring Cloud AWS 自动配置担任角色

middy-ssm 没有对 lambda 的执行角色进行更改

AWS Elastic Beanstalk 无法担任角色

在 AWS 中的 SUSE Linux EC2 实例上安装 SSM 代理和角色确保启动