Обратный прокси-сервер Apache2 к конечной точке, которая требует BasicAuth, но хочет скрыть это от пользователя - PullRequest
20 голосов
/ 20 февраля 2009

В основном мой сценарий заключается в том, что у меня есть внутренний веб-сайт, для которого требуется ОДНО жестко закодированное имя пользователя и пароль (и это нельзя отключить, только изменить). Я выставляю этот сайт через обратный прокси по разным причинам (скрытие порта, упрощение 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>

Ответы [ 2 ]

24 голосов
/ 21 февраля 2009

Добавить или перезаписать заголовок авторизации перед передачей любого запроса конечной точке. Заголовок авторизации может быть жестко запрограммирован, это просто кодировка base-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=="

3 голосов
/ 18 января 2012

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

...