Azure API 管理 - 当 APM 落后于 WAF 时如何获取原始 IP

Posted

技术标签:

【中文标题】Azure API 管理 - 当 APM 落后于 WAF 时如何获取原始 IP【英文标题】:Azure API Management - How to get original IP when APM is behind WAF 【发布时间】:2019-10-29 01:01:18 【问题描述】:

我们有以下技术栈

Imperva WAF API 管理 WebApp 中的 WebApi

这是当前的实现

客户端 IP 在 WAF 级别进行身份验证 WAF IP 在 APIM 被列入白名单 APIM IP 在 WebApp 级别被列入白名单

一切正常,符合预期。

现在,当我转到 APIM -> 分析 -> 请求时,我看到此处列出了 WAF IP,而不是客户端 IP。所以在这种情况下,我们将无法跟踪谁在使用什么

我知道我们可以选择通过订阅密钥进行跟踪,但这还不够。

谁能建议如何配置以获得正确的 IP?

【问题讨论】:

MSDN 论坛问题中也有同样的问题。 social.msdn.microsoft.com/Forums/en-US/… @ibrahimatay,感谢您的回复,对不起,我错过了您的回复,是的,所以我现在有 x-forwarded-for,其中包含标头中的客户端 IP,现在的问题是如何获取并添加它在 App Insights 中,然后从 App Insights 本身创建自定义报告? 【参考方案1】:

相信你可以在here找到你的答案。 您只需要配置您的服务器以从相关标头中检索正确的 IP。

引用相关部分:

需要原始客户端 IP 如果您的应用程序需要真实的客户端 IP 地址,请确保您已启用从“X-Forwarded-For”或“Incap-Client-IP”标头中检索此值。使用 Imperva 时,您的服务器将看到 Imperva IP 而不是真实的客户端 IP。但是,默认情况下,Imperva 会将原始客户端 IP 地址插入两个 HTTP 标头:“X-Forwarded-For”和 Imperva 标头“Incap-Client-IP”。

但请注意,您应该在给定的 XFF 值中取第一个 IP,否则,第二个标头 real-client-IP 的使用可能会受到第 3 方代理等的影响。

希望对您有所帮助。

【讨论】:

【参考方案2】:

向微软提出支持请求后,我们得到了我们想要的

我们就是这样完成的

Imperva WAF 调用 APIM 端点时,也会在 header 中传递 Incap-Client-IP 在 APIM -> API -> 所有 API -> 设置 -> 输入要添加到 App Insights 请求日志中的标头属性 在请求日志下 -> 自定义维度 -> 可以看到 App Insights 中添加了 InCap-Client-IP 属性

现在我们可以将其导出为 csv 格式,并可以根据客户端 IP 跟踪使用情况。

【讨论】:

【参考方案3】:

这对于 Azure APIM 中的内置报告是不可能的。如果您可以在标头中让 WAF 将客户端 IP 转发到 APIM,那么您可以构建自己的报告基础架构,但这会非常复杂。

【讨论】:

感谢 Vitaliy 的回复。好的。正如您所提到的,客户端 IP 对我们捕获很重要,但捕获 i 并创建自己的报告基础架构是一项艰巨的任务。构建 APIM 内置报告提供的工作量太大。如果我们将客户端 ip 传递给 APIM 并报告将基于它,是否有可能? 不可能立即实现。在低投资选项中,最好的方法是使用 AppInsight 集成并设置包含 WAF 传递的客户端 IP 的额外标头的日志记录。也许然后基于 AppInsight 构建所需的报告可能会更简单。 感谢 Vitaliy 的回复。好的。您是否有任何示例实现链接可供我们从 APIM 向 App Insights 添加自定义数据? 谁能帮我设置包含客户端 IP 的额外头部到 Application Insights 的日志记录? 你试过这个docs.microsoft.com/en-us/azure/api-management/… 吗?

以上是关于Azure API 管理 - 当 APM 落后于 WAF 时如何获取原始 IP的主要内容,如果未能解决你的问题,请参考以下文章

创建 Azure API 管理策略时的 XML 语法帮助

Azure API 管理集状态代码策略未按预期工作

Azure API 管理不会在 4xx 上发送 CORS 标头

在Azure API Management中设置并发限制

云原生时代的 APM

Azure API 管理 + Azure 函数和托管标识