Apache2反向代理到需要BasicAuth但希望对用户隐藏的端点
Posted
技术标签:
【中文标题】Apache2反向代理到需要BasicAuth但希望对用户隐藏的端点【英文标题】:Apache2 Reverse Proxy to an end-point that requires BasicAuth but want to hide this from user 【发布时间】:2010-10-08 17:50:59 【问题描述】:基本上,我的情况是我有一个内部网站,需要一个硬编码的用户名和密码才能访问(并且无法关闭,只能更改)。由于各种原因(隐藏端口、简化 url、简化 NAT 等),我通过反向代理公开了这个网站。
但是,我想做的是能够使用 Apache 来处理身份验证,以便:
-
我不必向所有人提供
编辑:关于更丰富身份验证的第二部分已移至new question
这或多或少是我现在拥有的:
<VirtualHost *:80>
ServerName sub.domain.com
ProxyPass / http://192.168.1.253:8080/endpoint
ProxyPassReverse / http://192.168.1.253:8080/endpoint
# The endpoint has a mandatory password that I want to avoid requiring users to type
# I.e. something like this would be nice (but does not work)
# ProxyPass / http://username:password@192.168.1.253:8080/endpoint
# ProxyPassReverse / http://username:password@192.168.1.253:8080/endpoint
# Also need to be able to require a password to access proxy for people outside local subnet
# However these passwords will be controlled by Apache using BasicAuth, not the ProxyPass endpoint
# Ideas?
</VirtualHost>
【问题讨论】:
【参考方案1】:在将任何请求传递到端点之前添加或覆盖授权标头。授权标头可以硬编码,它只是字符串“用户名:密码”的 base-64 编码(不带引号。)
如果尚未完成,请启用 mod_headers 模块。
RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
要有条件地执行此操作,请启用 mod_setenvif,例如在本地请求的情况下仍然要求主密码:
SetEnvIf Remote_Addr "127\.0\.0\.1" localrequest
RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==" env=!localrequest
http://en.wikipedia.org/wiki/Basic_access_authentication
http://httpd.apache.org/docs/2.0/mod/mod_headers.html
http://httpd.apache.org/docs/2.0/mod/mod_setenvif.html
示例
# ALL remote users ALWAYS authenticate against reverse proxy's
# /www/conf/passwords database
#
<Directory /var/web/pages/secure>
AuthBasicProvider /www/conf/passwords
AuthType Basic
AuthName "Protected Area"
Require valid-user
</Directory>
# reverse proxy authenticates against master server as:
# Aladdin:open sesame (Base64 encoded)
#
RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
【讨论】:
这看起来很有希望,但如果是非本地请求,我不想询问 MASTER 密码,我希望 apache 维护一个基本的 Auth passwd 列表并允许用户使用几种不同的密码之一进行身份验证端点永远不会看到的密码。这样做不对吗? 只使用第一个(无条件的,即没有 SetEnvIf 和 'localrequest')变体,即'RequestHeader set Authorization "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="'。反向代理将始终使用主密码进行身份验证,用户将始终使用其他密码连接到 RP。 我尝试了使用 SetEnvIf 的原始建议并尝试让 BasicAuth 正常工作,但都没有成功。我可以完全通过代理成功禁用密码,但不能根据请求类型有条件地禁用。 不知道我理解什么是成功的,什么是不成功的。 “示例”是否有效,从某种意义上说,它是否能够使用主密码成功地对后端进行身份验证?什么不起作用? RequestHeader 部分很有魅力,但完整的示例有一些问题: 目录在这里没有意义, AuthBasicProvider 不像我认为的那样,如果它这样做总是需要密码。如果用户在 192.168.1 上,则需要允许他们访问代理。* 或拥有有效的 PW【参考方案2】:我用你的例子来指向两个使用 apache proxypass 的 IP 摄像机。当我使用语法 user:password@camarafeliz3.compufiber.com 并通过 iphone 访问时,我从 safari (iphone navigator) 收到了一条安全消息,因此我更改了示例以与 iPhone 4S 配合使用
<Location /camarafeliz1/ >
# usuario admin password 123456
ProxyPass http://192.168.0.39/
ProxyPassReverse http://192.168.0.39/
RequestHeader set Authorization "Basic YWRtaW46MTIzNDU2=="
</Location>
<Location /camarafeliz3/ >
# usuario admin password 123456
ProxyPass http://192.168.0.99/
ProxyPassReverse http://192.168.0.99/
RequestHeader set Authorization "Basic YWRtaW46MTIzNDU2=="
</Location>
由于链接中的用户名和密码,iphone 4s 不再抱怨安全问题。
【讨论】:
以上是关于Apache2反向代理到需要BasicAuth但希望对用户隐藏的端点的主要内容,如果未能解决你的问题,请参考以下文章
ubuntu12.04+apache2.4+django 配置反向代理
反向代理不适用于使用 apache2 的 ubuntu 20 上的 https