Aws lambda 如何在AWS IAM策略中为联邦用户提供lambda执行的选择性访问?

Aws lambda 如何在AWS IAM策略中为联邦用户提供lambda执行的选择性访问?,aws-lambda,amazon-iam,federated-identity,pingfederate,Aws Lambda,Amazon Iam,Federated Identity,Pingfederate,我正在尝试为组中的选定成员授予lambda执行权限。用户通过PingFederate进行身份验证。我在向联邦用户授予此选择性访问权限时遇到问题 我有一个自定义IAM策略(允许lambda调用选择性)附加到此角色。虽然策略似乎通过了验证,并且策略模拟显示允许访问,但当我尝试执行lambda函数时,我得到了一条消息 Calling the invoke API action failed with this message: User:arn:aws:sts::123456789012:assume

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

我有一个自定义IAM策略(允许lambda调用选择性)附加到此角色。虽然策略似乎通过了验证,并且策略模拟显示允许访问,但当我尝试执行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
这是我的策略:允许lambda调用选择性

{
    "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"
                }
            }
        }
    ]
}

我遗漏了什么吗?

我正在努力理解你的问题。如果我做了一个错误的假设,请纠正我

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

  • aws:userid的问题
  • 阅读有关键的信息,我们可以发现该键的值由role id:caller指定的role name给定

    其中,角色id为,调用方指定的角色名称由传递给AssumeRole请求的指定

    所以
    aws:userid
    的值类似于
    AIDAJQABLZS4A3QDU576Q:SomeNameYouGive
    。因为这一点,您的条件永远不会匹配
    arn:aws:sts::123456789012:假定的角色/role-for-grp-l2/myuser1234
    ,然后用户就不能假定该操作

  • 以另一种方式使用条件
  • 假设
    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删除
    *
    通配符获取
    角色id

    aws iam get-role --role-name ROLE_NAME
    
    以及改变条件如下:

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

    谢谢你的回复,佩德罗。如果以上内容不清楚,请道歉。组中的每个成员获得的角色是“role-for-grp-l2”。i、 e.arn:aws:sts::123456789012:假定角色/role-for-grp-l2/So user1s arn将是arn:aws:sts::123456789012:假定角色/role-for-grp-l2/user1,而用户myuser1234将是arn:aws:sts::123456789012:假定角色/role-for-grp-l2/myuser1234我只希望允许此组中的特定用户(myuser1234)执行lambda函数。我无法创建单独的组并移动此用户(myuser1234)。所以我必须使用一个有条件的命令。@dadarw25检查我的更新。您可以将
    aws:userid
    的最后一部分与用户名进行比较。
    "Condition": {
       "StringEquals": {
           "aws:userid": "ROLE_ID:myuser1234"
       }
    }