【问题标题】:Lambda and API Gateway on the same VPC resulting in User: anonymous is not authorized to perform: execute-api:Invoke on resource同一 VPC 上的 Lambda 和 API Gateway 导致 User: anonymous is not authorized to perform: execute-api:Invoke on resource
【发布时间】:2020-12-31 16:42:52
【问题描述】:

我正在尝试了解 AWS 中的一般资源策略和权限。 最初的想法很简单,API 网关拒绝访问同一 VPC 中除其他资源之外的所有内容,但最终却是一场噩梦。

我想要什么:我的 API 只允许对同一 VPC 上的资源进行流量/调用。

所以我创建了 2 个子网和一个开放的安全组(所有入站和出站流量仅用于测试目的)

我创建了一个集成到 Lambda 函数和另一个 lambda 函数的 API 网关,并将它们部署到该 VPC。

API 网关有一个资源 /hi 并且只允许 GET。 当您点击该路径时,它会代理 Lambda,后者会返回一条简单消息:嗨。

另一个 lambda(位于同一 VPC 上)调用 API 并返回错误或响应。

到目前为止,一切正常。 lambda 函数命中 API 网关,该网关会攻击 lambda 并返回 Hi。

但是,正如我所说,我想使用权限。所以我决定将对 API Gateway 的调用锁定到两者所在的 VPC。

所以我将此资源策略添加到 API Gateway:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*",
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-id"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
        }
    ]
}

然后我去了 lambda(不是服务的一部分,如果不是调用 API 网关的那个)并添加托管策略

  • AWSLambdaVPCAccessExecutionRole
  • 还有一个内联策略,允许在资源 arn:aws:execute-api:us-east-1:account-id:api-id///* 上调用 execute-api:Invoke李>

当我再次运行 lambda 函数(之前与我的 API 网关和类似 https://jsonplaceholder.typicode.com/ 的虚拟 api 一起工作)时,我收到以下错误:

INFO    json {
  Message: 'User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:account-id:api-id/dev/GET/hi with an explicit deny'
}

如果我在 API Gateway 中删除了资源策略,它会再次起作用...只要我添加它,它就会检索到相同的错误。

有人知道为什么会这样吗? 我快疯了。我将不胜感激。


版本:尝试 IAM 角色和资源策略

我也尝试使用角色。 为此,我在 API 中设置了以下资源策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account-id:role/my-role-for-API-Gateway"
            },
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-east-1:account-id:api-id/*/*/*"
        }
    ]
}

然后,我将该角色附加到我的 lambda 函数(应该能够调用 API 的函数)。 重要提示:该 lambda 不是服务的一部分。它是一个单独的 Lambda,应该能够调用 API Gateway,它将请求代理到作为服务一部分的 lambda。

我为该角色附加了以下政策。

  • AWSLambdaVPCAccessExecutionRole(因为我也在同一个 VPC 中尝试过)
  • AmazonAPIGatewayInvokeFullAccess(打开权限以确保我没有遗漏任何内容)
  • 允许通过资源 ARN 调用 API 的内联策略:arn:aws:execute-api:us-east-1:account-id:api-id///*

我什至尝试将 AdministratorAccess 授予该角色,只是为了耗尽可能性。

我通过 API Gateway 控制台进行测试,我收到了正确的控制台。 当我通过 Lambda 控制台进行测试时,我收到以下错误:

INFO    json {
  Message: 'User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:account-id:api-id/dev/GET/hi'
}

所以这个块的问题是:lambda 如何调用一个 API 网关来限制对 lambda 具有的特定角色的访问?

【问题讨论】:

  • 你能说清楚吗?您正在使用私有 API?您的第二个 lambda 究竟如何从 VPC 调用 api?通过 NAT 网关?
  • 非常感谢,@Marcin 我没有使用私有 API,只是一个区域性的。 lambda 只是获取 API 网关提供的 dns 端点,我将不胜感激。我完全迷路了。

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


【解决方案1】:

部分问题在于aws:SourceVpc 条件只能用于私有 API。来自docs

aws:SourceVpc - 此密钥只能用于私有 API

由于您使用的是 regional API,因此您的 StringNotEquals 将不起作用,并且您将获得 explicit deny

如果你想使用aws:SourceVpc,你必须将你的api修改为私有API。但如果它是基于资源的策略的唯一学习经验,那么学习它们的最简单方法就是使用桶策略

【讨论】:

  • 非常感谢您的提示。我完全错过了。对于非私有 API,您会向我推荐什么?我想锁定从另一个 API 网关或 Lambda 对该 API 的访问,但可能有一些公开可用的资源。假设每个人都可以访问/public,但不能访问/hi。我还尝试将角色设置为委托人并将该角色添加到 Lambda,但这也不起作用。再次,非常感谢
  • @Peter API 网关策略很棘手。您必须提供更多详细信息,为什么对 lambda 使用 IAM 角色也不起作用。如果需要,您可以在新问题中添加相关详细信息、错误消息、lambda 代码。这样其他人也可以看到它并提供帮助。
  • 是的。我快疯了,哈哈。我知道我是一个新手,但不知何故,我的逻辑在我的脑海中是有道理的,但在资源中却没有。将 API 网关的使用限制为特定角色。将该角色添加到具有某些权限的 lambda 函数中。我在我的问题中添加了一个块:尝试 IAM 角色和资源策略非常感谢
  • @Peter 遗憾的是,与requests 类似的东西都不会起作用。因此,我最初的评论 - “API 网关策略很棘手。”。如果您希望您的 lambda 角色被识别,您必须自己构建对 AWS 的有效请求以使策略生效。不知道nodejs,但在python中你会使用aws-requests-auth来构造这样的请求。顺便说一句,如果我的回答有帮助,我们将不胜感激。
  • 谢谢!是的!我以为我做到了。你会指导那些正在学习的人吗?我正在学习,我没有很多经济资源,但我很想报应:)
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 2019-06-21
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2016-10-03
  • 2020-10-25
相关资源
最近更新 更多