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>
Ответы
Ответ 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 перестали жаловаться на безопасность из-за пользователя и пароля в ссылке.