【问题标题】:API Gateway Custom Authorizer - Get Source IP AddressAPI Gateway 自定义授权者 - 获取源 IP 地址
【发布时间】:2017-03-20 00:55:20
【问题描述】:

是否可以在'Custom Authorizer' lambda 函数中获取对 API 网关的请求的源 IP 地址?

这绝对可以通过您的API Gateway to a lambda function 的实际集成来实现。虽然似乎无法在自定义授权函数中获取请求者的 IP 地址。

我的目标是直接在 APIG 中进行基于速率的阻塞。 A similar solution is described here。但是,由于我只限制对一个或两个 APIG 端点的访问,我宁愿在自定义授权函数中执行此操作,该函数只是在 APIG 达到速率限制时将源地址添加到拒绝策略中。

编辑:澄清一些潜在的混淆。我知道我可以通过上面提到的常规集成和this other post 来做到这一点。但我正在尝试利用自定义授权器功能,这样我就不必在我的所有 lambda 函数中编写相同的速率限制代码。

【问题讨论】:

  • “一个自定义授权函数,当它达到速率限制时,它只是将源地址添加到 APIG 的拒绝策略中。” 似乎有问题。策略没有锁定机制,因此考虑到多个并发的过多用户,执行(获取策略、修改策略、保存策略)很容易使您处于这样一种状态,即您“添加”到策略中的每件事也会同时删除其他添加的内容.在无状态世界中,您如何通过计数来确定是否需要限速?
  • 计数保存在 DDB 表中,包含 request_id、source_ip 和 TTL 列。然后自定义授权器检查具有给定 source_ip 和大于当前时间的 TTL 的条目数。其中 TTL 类似于当前时间加上 10 秒。锁定是我没有考虑过的,这将是一个问题。也许我最终还是会使用 CloudFront 和 WAF。
  • 我想我可以在 DDB 表中添加一个锁定键来访问策略。
  • 您会考虑使用使用计划功能提供的速率强制功能吗?它需要使用 API 密钥发送请求。然后 API Gateway 将通过 API 密钥限制请求。
  • @KaHouIeong 不幸的是,您可以拥有的 api 密钥数量有限。

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


【解决方案1】:

你应该看看

event.requestContext.identity.sourceIp

它将包含原始客户端 IP。

在“身份来源”部分创建授权方时添加

Context: identity.sourceIp

并启用缓存(默认为 300 秒)。 这样就不会为每个请求调用您的授权器 lambda,因为它会缓存该 IP 的返回策略。

如果您添加传递事件参数的日志记录,您可以自己进行试验(只是不要忘记缓存,并非所有对 API 网关的调用都会触发授权 lambda)。

顺便说一句,不要使用“X-Forwarded-For”看看我对另一个@binshi 答案的评论。

【讨论】:

    【解决方案2】:

    自定义授权者现在可以使用所谓的Enhanced Context。 您应该能够使用appropriate context variable 来获取该信息(例如$context.identity.sourceIp)。 您或许也可以使用 API 映射,但我尚未对此进行测试。

    【讨论】:

    • context.identity 对象实际上只是一个 CognitoIdentity 对象。没有属性'sourceIp'。我假设您从this post 获得了这些信息。也就是说,创建一个 API 映射以将源 IP 传递到 Lambda。 API 映射不能在自定义授权函数中使用。正如您所建议的,默认情况下,此变量在上下文对象中不可用。
    • 阅读了你提供的关于增强上下文的链接,它似乎实际上是关于从授权方返回附加信息给 APIG。 APIG 上下文对象不会传递给您的 lambda 函数。它们是两个不同的东西。
    • 在我的第一条评论中,我谈到了 python 上下文对象。
    • @unclemeat,我实际上相信上下文正在传递给自定义授权者per this article。请看一下这个例子。有两种不同的用例:上下文被传递给自定义授权者,以及在 API 网关阶段的接收端输出回原始 lambda 函数。第一个用例(如果有兴趣)。
    • 另外,请注意我列出的上下文变量来自[这篇文章] (docs.aws.amazon.com/apigateway/latest/developerguide/…),我在原始答案中引用了它。它确实有一个上下文中存在的变量列表。
    【解决方案3】:

    您可以在

    中获取源ip以及任何代理服务器ip
    events['headers']['X-Forwarded-For']
    

    【讨论】:

    • 没有。不要那样做。你不能相信那个标题。任何人都可以将其添加到他们的请求中并在其中放入任何值。我进行了测试,我发明的价值出现在日志中。
    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多