Apache2 обратный прокси к конечной точке, которая требует BasicAuth, но хочет скрыть это от пользователя

в основном мой сценарий заключается в том, что у меня есть внутренний веб-сайт, для доступа к которому требуется одно жестко закодированное имя пользователя и пароль (и это нельзя отключить, только изменить). Я выставляю этот сайт через обратный прокси по разным причинам (скрытие порта, упрощение url, упрощение NAT и т. д.).

однако то, что я хотел бы сделать, это использовать Apache для обработки аутентификации, чтобы:

  1. Я не должен выдавать один пароль для всех
  2. Я могу иметь несколько имен пользователей и паролей, используя BasicAuth Apache
  3. для внутренних пользователей мне не нужно запрашивать пароль

EDIT: вторая часть о более богатой аутентификации была перемещена в новому вопросу

вот более или менее то, что у меня есть сейчас:

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

2 ответов


добавление или перезапись заголовка авторизации перед передачей любого запроса на конечную точку. Заголовок авторизации может быть жестко закодирован, это просто базовая кодировка 64 строки "username: password" (без кавычек.)

включить модуль 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=="

Ну, я использовал ваш пример, чтобы указать на две IP-камеры, используя Apache proxypass. Когда я использовал синтаксис 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 перестал жаловаться на безопасность из-за пользователя и пароля в ссылке.