【发布时间】:2017-10-20 18:24:22
【问题描述】:
我正在尝试使用 .NET Core's proxy library 在 Azure Web 应用程序后面设置 Sonarqube。这听起来可能很奇怪,但由于 Web 应用程序会自动提供 SSL 证书,而且我无法获得自定义域,我认为这个解决方案对我来说是最简单的;)
现在经过一番尝试,一切都很好,网站在浏览器中没有任何错误,可以使用 Sonar 登录或 Azure Active Directory 登录。
但在我的构建过程中,无法将分析结果发布到服务器。响应总是 401。
我检查了 Sonarqube 日志,发现以下对应条目:
在 Web.log 中
DEBUG web[...][auth.event] login failure [cause|Wrong CSFR in request][method|JWT][provider|LOCAL|local][IP|some ip|actual client ip:37390][login|admin]
在 access.log 中:
some ip - - [...] "POST /api/ce/submit HTTP/1.1" 401 - "-" "Mozilla/5.0 ..." "..."
因此,我可以看到实际的声纳请求来自不同的 IP,可能是因为网络设置或任何其他 Azure 魔法。
我不知道如何解决这个问题:D
我的反向代理解决方案非常简单。基本上我使用一个简单的空 ASP.NET Core 应用程序并在 Startup.cs 中集成反向代理功能,如下所示:
app.RunProxy(new ProxyOptions
{
BackChannelMessageHandler = new HttpClientHandler
{
CheckCertificateRevocationList = false,
ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true,
AllowAutoRedirect = true,
AutomaticDecompression = DecompressionMethods.GZip,
CookieContainer = new CookieContainer
{
Capacity = int.MaxValue,
MaxCookieSize = int.MaxValue,
PerDomainCapacity = int.MaxValue
}
},
Scheme = serverConfiguration.Scheme,
Host = serverConfiguration.Host,
Port = serverConfiguration.Port,
});
我还添加了一些中间件来添加 X_FORWARDED_PROTO 标头,并检查 X-Forwarded-For 标头是否配置正确。我还将 Azure IIS 配置为不通过 web.config 方式截断大型请求中的查询参数或内容。
我还尝试伪造它并将 X-Forwarded-For IP 设置为向 Sonarqube 发送实际请求但无效的 IP。
有人知道如何解决这个问题吗? :) 因为这只是一个 POC 设置,我很想关闭 CSRF 检查,但我找不到任何配置。任何帮助,将不胜感激。
编辑 + 当前解决方案
对我最初的解决方案进行更多思考,问题变得非常清楚。我正在尝试使用Azure App Service's VNet Integration Feature 连接到服务器。这在代理站点和实际服务器之间提供了安全的 VPN 连接。但这也会导致 IP 与预期不同:
Client [Client IP] -> Web App Proxy [Proxy Public IP] -> VNet VPN [VPN IP of the Web App == some ip in the logs] -> Sonarqube => 401 CSRF error
我猜X-Fowarded-For 链在这种情况下不正确,我不知道如何解决。
现在,作为一种解决方法,我向 Sonarqube 服务器添加了一个公共 IP,并将网络安全组配置为仅允许来自 Web 应用程序的流量(使用提供的 Web 应用程序的传出 IP 地址)。使用该解决方案一切正常:)
我仍然想促进 VNet 集成功能,所以如果有人有想法,请告诉我 :)
【问题讨论】:
-
根据您的描述,我猜您在请求中得到错误 CSFR 的原因是您的 jwt 令牌(存储在库克中)的 CSRF_JWT_PARAM 与您请求的 CSRF_HEADER 值不相等。所以我建议您在将请求重定向到本地服务器时检查请求的标头。
-
嗯,我想我可以在代理实现中修改 JWT,但不知何故我对此有一种不好的感觉:D 这是代理的默认方式吗?我认为唯一需要的就是
X-Forwarded-For链? -
据我所知,CSFR令牌是用来防止跨站请求攻击的。现在,您要做的是添加一个中间站点以将请求重定向到您的本地服务器。这是跨站。所以你会遇到这个问题,因为 sonarqube 会检查 CSFR 令牌。正如我所说,原因是 CSFR 令牌,两个站点的请求不一样。更多细节,我建议你可以参考这篇文章:stackoverflow.com/a/33829607/7609093。这不是一个好方法,我建议您使用常规方式购买自定义域并将其与您的服务器绑定或使用VNET。
标签: azure sonarqube .net-core azure-web-app-service reverse-proxy