首页 > 解决方案 > 如何在 AWS IAM 策略中为联合用户提供 lambda 执行的选择性访问?

问题描述

我正在尝试为组内的选定成员授予 lambda 执行访问权限。用户通过 PingFederate 进行身份验证。我在将此选择性访问权限授予联合用户时遇到问题。

我有一个附加到此角色的自定义 IAM 策略 (allow-lambda-invocation-selective)。尽管该策略似乎通过了验证并且策略模拟显示允许访问,但是当我尝试执行 lambda 函数时,我收到了消息

Calling the invoke API action failed with this message: User:arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234 is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-east-1:123456789012:function:my-lambda-function

这是我的政策:allow-lambda-invocation-selective

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunction",
                "lambda:ListAliases"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function",
            "Condition": {
                "StringEquals": {
                    "aws:userid": "arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayers",
                "lambda:ListLayerVersions"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:userid": "arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234"
                }
            }
        }
    ]
}

我错过了什么吗?

标签: aws-lambdaamazon-iamfederated-identitypingfederate

解决方案


我试图理解你的问题。如果我做了错误的假设,请纠正我。

  1. 每个组/用户已经有自己的角色。

当您对您的用户进行身份验证时,他们将扮演自己的角色。myuser1234,经过身份验证后,会收到arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234角色,对吗?是否可以为每个组创建一个角色并删除该conditions属性(检查项目 2 解释原因)?

// role-for-grp-l2
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunction",
                "lambda:ListAliases"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayers",
                "lambda:ListLayerVersions"
            ],
            "Resource": "*"
        }
    ]
}
  1. 问题与aws:userid

阅读有关密钥的文档aws:userid,我们可以发现该密钥具有角色 id:caller-specified-role-name给出的值,

其中角色 id 是角色的唯一 id,调用者指定角色名称由传递给 AssumeRole 请求的RoleSessionName 参数指定。

所以aws:userid有像AIDAJQABLZS4A3QDU576Q:SomeNameYouGive. 因此,您的条件永远不会匹配arn:aws:sts::123456789012:assumed-role/role-for-grp-l2/myuser1234,然后用户无法承担该操作。

  1. 以另一种方式使用条件

假设RoleSessionName是用户名,您可以这样使用条件:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "lambda:InvokeAsync",
                "lambda:ListVersionsByFunction",
                "lambda:GetFunction",
                "lambda:ListAliases"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:my-lambda-function",
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:myuser1234"
                }
            }
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "lambda:ListFunctions",
                "lambda:ListEventSourceMappings",
                "lambda:ListLayers",
                "lambda:ListLayerVersions"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:myuser1234"
                }
            }
        }
    ]
}

如果您愿意,可以使用 AWS CLI 和以下命令删除*通配符获取:role id

aws iam get-role --role-name ROLE_NAME

并改变条件如下:

"Condition": {
   "StringEquals": {
       "aws:userid": "ROLE_ID:myuser1234"
   }
}


推荐阅读