21

基本上我的情况是我有一个内部网站,需要一个硬编码的用户名和密码才能访问(并且不能关闭,只能更改)。由于各种原因(隐藏端口、简化 url、简化 NAT 等),我通过反向代理公开了这个网站。

但是,我想做的是能够使用 Apache 来处理身份验证,以便:

  1. 我不必给每个人一个密码
  2. 我可以使用 Apache 的 BasicAuth 拥有多个用户名和密码
  3. 对于内部用户,我不必提示输入密码

编辑:关于更丰富的身份验证的第二部分已移至新问题

这或多或少是我现在所拥有的:

<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>
4

2 回答 2

27

在将任何请求传递到端点之前添加或覆盖授权标头。授权标头可以硬编码,它只是字符串“用户名:密码”的 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

例子

# 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=="
于 2009-02-20T21:14:42.630 回答
5

好吧,我用你的例子来指向两个使用 apache proxypass 的 IP 摄像机。当我使用语法 user:password@camarafeliz3.compufiber.com 并通过 iphone 访问时,我从 safari(iphone 导航器)收到了一条安全消息,因此我更改了示例以与 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 不再抱怨安全性。

于 2012-01-17T20:57:16.537 回答