Подтвердить что ты не робот

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

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

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

  • Мне не нужно выдавать одиночный пароль всем
  • У меня может быть несколько имен пользователей и паролей с помощью Apache BasicAuth
  • Для внутренних пользователей мне не нужно запрашивать пароль

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:[email protected]:8080/endpoint
  # ProxyPassReverse / http://username:[email protected]: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>
4b9b3361

Ответ 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

Пример

# 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=="

Ответ 2

Ну, я использовал ваш пример, чтобы указать на две IP-камеры, используя apache proxypass. Когда я использовал пользователя синтаксиса: [email protected] и получил доступ через iphone, я получил сообщение безопасности из сафари (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 перестали жаловаться на безопасность из-за пользователя и пароля в ссылке.