1

为了避免牦牛剃须,我将尝试提供尽可能多的上下文。

我们有一个内部应用程序,它也可以在公共互联网上使用。该应用程序在 IBM i 上的多个 Apache 实例上运行——这些实例中的大多数都需要 http 基本身份验证,可以说是充当“欢迎页面”的一个实例除外。这个“欢迎页面”没有身份验证,但充当导航中心,用户可以通过链接转到应用程序的其他部分(这些部分具有身份验证并在不同的 Apache 实例上运行)。

我们还有一些文档存储在 Confluence(一个 wiki 应用程序)中,运行在单独的服务器上。此 wiki 应用程序可以显示文档而无需身份验证,但如果您进行身份验证,则可以选择编辑文档(当然,假设您被授权这样做)。但关键是文档是可见的,无需身份验证。

我的问题是:我们希望可以从主应用程序中访问 Confluence 中的文档(无论是在内部访问还是通过 Internet 访问时),但是由于文档有些敏感,我们不希望整个 Internet 都可以访问它.

我们提出的解决方案是使用反向代理——我们在主应用程序上配置 Apache 实例,以便将主应用程序/help/上的请求代理到汇合应用程序。因此,Confluence 应用程序不会直接暴露在 Internet 上。

但这就是问题开始的地方。

如果我们只是通过不需要身份验证的主应用程序 Apache 实例进行代理/help/,那么文档可以从主应用程序中毫无问题地获得 - 但由于您不需要身份验证,因此互联网上的每个人都可以使用它 - 所以这是不行的。

如果我们改为通过需要身份验证的主应用程序 Apache 实例代理“/help/”,似乎基本身份验证信息从主应用程序服务器传递到 Confluence 服务器,然后我们得到身份验证失败,因为没有每个使用主应用程序的人在 Confluence 服务器上都有一个帐户。(对于那些这样做的人,它可以正常工作 - 但大多数用户不会拥有 Confluence 帐户)。

(从现在开始可能会发出牦牛剃毛警报)

因此,似乎在处理 HTTP 基本身份验证时,如果您设置从服务器 A 到服务器 B 的代理配置,并在服务器 A 上设置代理以要求 HTTP 基本身份验证,那么该身份验证信息会直接传递给服务器 B,在这种情况下,服务器 B 会抱怨,因为它不需要身份验证信息。

我对这个问题的解决方案是设置 2 个级别的代理 - 使用需要身份验证的 Apache 实例也需要对代理进行身份验证/help/,但/help/代理到不同的服务器(服务器 C)。此服务器 C 不需要身份验证,但不会暴露在 Internet 上。服务器 C 被配置为代理/help/到实际的 Confluence 服务器。

我这样做是基于proxy-chain-auth- 一个环境变量,它似乎表明默认情况下,如果您有代理链,则不会自动沿链发送身份验证信息。

唉,这不起作用 - 我收到一个身份验证错误,似乎表明服务器 C 实际上代理了身份验证信息,即使我没有设置proxy-chain-auth.

所以,这就是我的剃牦牛之旅。

我只是想设置一个配置,以便我们存储在 Confluence 上的文档需要某种身份验证,但该身份验证来自主应用程序,而不是来自 Confluence。

(如果不需要通过 Internet 访问它,这一切都不会成为问题,因为 Confluence 服务器可以被其网络上的任何人查看而没有问题)。

我希望我的问题足够清楚 - 老实说,我不介意被指向不同的方向来实现主要目标,但需要注意的是,我无法使用 HTTP 基本身份验证更改主应用程序(或 Confluence) .

想法,有人吗?

PS。为了从 Confluence 服务器中检索文档,我实际上是在使用他们的 REST API 来检索页面内容——我不知道这是否有任何相关性,但我只是想明确一点,以防万一。

4

1 回答 1

3

事实证明,该问题的解决方案非常简单。

对于不需要身份验证的第二个代理,我必须更改 Apache 配置以删除任何授权标头。

RequestHeader unset Authorization

这会阻止身份验证信息从第二个代理传递到 Confluence。

于 2017-04-11T14:06:59.930 回答