为了避免牦牛剃须,我会尝试提供尽可能多的上下文。
我们有一个内部应用程序,也可以在公共互联网上找到。此应用程序在IBM i上的几个Apache实例上运行 - 大多数这些实例都需要http基本身份验证,但可以这么说的一个实例充当“欢迎页面”。这个“欢迎页面”没有身份验证,但充当导航中心,其中包含用户可以转到应用程序其他部分的链接(这些部分具有身份验证并在不同的Apache实例上运行)。
我们还在Confluence(一个wiki应用程序)中存储了一些文档,这些文档在一个单独的服务器上运行。此Wiki应用程序可以显示文档而无需身份验证,但如果您进行身份验证,则可以选择编辑文档(当然,假设您已获得授权)。但关键是文档是可见的,无需验证。
我的问题是:我们希望Confluence中的文档可以从主应用程序中访问(无论是在内部访问还是通过Internet访问),但是,由于文档有些敏感,我们不希望它可以访问互联网。
我们提出的解决方案是使用反向代理 - 我们在主应用程序上配置Apache实例,以便主应用程序上的/help/
请求代理到confluence应用程序。因此,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
的基础上做到的 - 这是一个环境变量,似乎表明默认情况下,如果你有一个代理链,那么身份验证信息不会自动沿着链发送。
唉,这不起作用 - 我收到一个身份验证错误,似乎表明Server C确实代理了身份验证信息,即使我没有设置proxy-chain-auth
。
所以,那是我的牦牛剃须之旅。
我只想设置一个配置,以便我们在Confluence上存储的文档需要某种身份验证,但该身份验证来自主应用程序,而不是来自Confluence。
(无需通过互联网访问,因为Confluence服务器可以被其网络上的任何人查看而没有任何问题,所以这一切都不会成为问题。)
我希望我的问题足够清楚 - 老实说,我不介意指向不同的方向来实现主要目标,但需要注意的是我无法改变主要应用(或者就此而言是Confluence) HTTP基本身份验证。
想法,有人吗?
PS。要从Confluence服务器检索文档,我实际上是使用他们的REST API来检索页面内容 - 我不知道这是否有任何相关性,但我只是希望它能够清楚地表明它。
答案 0 :(得分:2)
事实证明,问题的解决方案非常简单。
对于我不需要身份验证的第二个代理,我不得不更改Apache配置以删除任何授权标头。
RequestHeader unset Authorization
这会阻止身份验证信息从第二个代理传递到Confluence。