Sonarqube 6.3.1支持Azure Web App反向代理:401关于API发布请求/错误的CSFR请求

时间:2017-05-20 19:37:13

标签: azure sonarqube .net-core azure-web-sites reverse-proxy

我尝试使用.NET Core's proxy library在Azure Web App后面设置Sonarqube。这可能听起来很奇怪但是由于Web Apps自动提供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设置为IP,向Sonarqube发送实际请求但没有效果。

有谁知道如何解决这个问题? :)由于这只是一个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 App的流量(使用提供的Web App的传出IP地址)。有了这个解决方案,一切正常:)

我仍然想要促进VNet集成功能,所以如果有人有想法,请告诉我:))

1 个答案:

答案 0 :(得分:1)

我们在Apache背后的Sonar与SSO的反向代理有同样的问题。 Apache将代理请求中的SSO标头发送给声纳。

我已将此问题报告给Google群组作为错误:

“即使使用SSO,也会随机显示声纳本机登录表单”

https://groups.google.com/forum/#!msg/sonarqube/o2p2ZmjqRN8/UAZZF3tMBgAJ

我发现,apache为不同的用户重用一个连接。 User-A通过Apache-Sonar connection-1,然后Apache重新使用此连接用于其他用户-B的其他请求,然后在同一Apache-Sonar连接中的下一个请求用于来自用户-A的新请求。然后,此请求被分类为未授权,Sonar生成登录表单,尽管Apache请求包含带有SSO登录数据的标头。

今天,我已经激活了DEBUG日志并发现消息“请求中的CSFR错误”。它看起来非常像CSFR保护,但有一些bug,好像代码确实忽略用户名或类似的东西。

此致

罗伯特。