【问题标题】:How to make a role assumable by given lambda function?如何通过给定的 lambda 函数来承担角色?
【发布时间】:2018-01-30 02:33:54
【问题描述】:

我们有这个要求来自笔测试。我有一个 lambda 函数说“add_address”和一个角色“account_management_role”。

我想让“account_management_role”只能由“add_address”lambda 函数承担。我不希望任何其他 lambda 函数承担这个角色。

我尝试了不同的方法,我尝试在 IAM 角色的“信任关系”中添加此条目。这没有用。

有人知道如何让它工作吗?

{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "<ARN of lambda function>"
        }
      }
    }
  ]
}

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-iam


    【解决方案1】:

    旧的,但最近遇到了这个问题。答案是如下信任关系:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringLike": {
              "lambda:FunctionArn": "arn:aws:lambda:eu-west-1:[account_id]:function:testaa"
            }
          }
        }
      ]
    }
    

    【讨论】:

      【解决方案2】:

      @nagalakshmi 在第一段的给定链接http://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html 中,他们清楚地提到它不受支持。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "CreateFunctionPermissions",
                  "Effect": "Allow",
                  "Action": [
                      "lambda:CreateFunction"
                  ],
                  "Resource": "*"
              },
              {
                  "Sid": "PermissionToPassAnyRole",
                  "Effect": "Allow",
                  "Action": [
                      "iam:PassRole"
                  ],
                  "Resource": "arn:aws:iam::account-id:role/*"
              }
          ]
      }
      

      来自 AWS 文档

      该政策有两个声明:

      第一条语句使用 Lambda 函数的 Amazon 资源名称 (ARN) 授予对资源的 AWS Lambda 操作 (lambda:CreateFunction) 的权限。 目前,AWS Lambda 不支持在资源级别执行此特定操作的权限。因此,该策略将通配符 (*) 指定为资源值。


      第二条语句授予对 IAM 角色的 IAM 操作 (iam:PassRole) 的权限。 Resource 值末尾的通配符 () 表示该语句允许对任何 IAM 角色执行 iam:PassRole 操作。要将此权限限制为特定角色,请将资源 ARN 中的通配符 () 替换为特定角色名称。

      他们提到的文档中的上述声明目前不支持资源级别的权限。

      所以他们可能有功能请求。

      【讨论】:

      • 有道理。这就是我们现在正在做的事情。似乎添加条件来限制谁可以担任角色并没有按预期工作。
      【解决方案3】:

      看起来这是一个错误。这是我与 AWS 支持团队创建的票证的回复。 似乎限制谁可以担任该角色的唯一方法是通过更改用户级别访问来限制

      块引用 我继续尝试了您试图在单个 Lambda 函数中实现的限制,但我们无法使其正常工作;我们进行了一系列测试来确定结果,但我们的测试失败了,因为我们无法指定特定功能作为担任角色的条件。这是因为初始角色假设是由 Lambda 服务本身执行的,甚至不需要寻找它试图调用的函数。我通过将“IfExists”修饰符添加到“StringLike”来发现这一点:这告诉 IAM 在 AssumeRole 请求中检查这个特定特征,但如果它不存在,则忽略条件并继续。该函数不适用于特定条件集,即使提供了确切的 ARN,它仍然失败。但是,在添加 IfExists 之后,该函数起作用了……但是另一个尝试利用该角色的不相关函数也起作用了。这意味着在 Lambda 服务承担角色之前不会检查 Lambda 函数 ARN。 块引用 在您调用函数时,您隐含地信任 AWS Lambda 服务来承担角色并完全按照描述执行函数。因此,您的信任关系不应该被修改;相反,如果您想限制特定函数具有的访问权限,您应该限制调用它的 IAM 实体,因为该实体具有足够的 iam:PassRole 权限来将特定角色传递给 Lambda 服务,从而传递角色然后 Lambda 用于调用该函数。以下文档显示了如何将 iam:PassRole 限制为特定角色或仅角色集的示例:http://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html

      【讨论】:

      • 嗨 nagalakshmi 昨天首先我尝试使用 IAM:passrole 但它不适用于您的用例。如果您在此处找到解决方案更新
      • @MohanShanmugam:基本上我们做不到。我们不能直接设置这个限制。
      【解决方案4】:

      创建角色 X 并附加到函数 Lambda 函数 A。然后我创建了具有相同角色 X 的新 Lambda 函数 B。我得到了以下错误

      “配置选项卡保存失败。原因:您的角色尚未准备好,或无法由 Lambda 担任。请等待一分钟,然后重试。”。

      以下是相同的信任关系政策。 请检查您的 lambda ARN。

      {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Principal": {
                  "Service": "lambda.amazonaws.com"
                },
                "Action": "sts:AssumeRole",
                "Condition": {
                  "ArnEquals": {
                    "aws:SourceArn": "arn:aws:lambda:us-east-1:xxxxxxxxx:function:lambdatest"
                  }
                }
              }
            ]
          }
      

      【讨论】:

      • 问题是 Lambda 函数 A 无法承担角色 X。我遇到了同样的错误。 “配置选项卡保存失败。原因:您的角色未准备好,或无法由 Lambda 承担。请等待一分钟,然后重试。” 不一致。等待几个小时后它停止工作。
      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2016-07-24
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2021-08-30
      • 2014-06-24
      相关资源
      最近更新 更多