У меня есть веб-сервер Apache с включенным mod_proxy и Virtualhost, proxy.domain.com. Этот прокси настроен так, чтобы запрашивать у пользователя учетные данные с помощью AuthType Basic. Затем содержимое web.domain.com доступно через прокси с помощью ProxyPass и ProxyReverse. Однако переменная REMOTE_USER пуста. Я читал разные вещи, чтобы добиться этого с помощью mod_rewrite и mod_headers, но все мои попытки потерпели неудачу. Кому-нибудь повезло больше, чем мне?
Спасибо.
Это возможно с помощью mod_headers, mod_rewrite и mod_proxy.
Я предполагаю, что на прокси-сервере ваша аутентификация работает и REMOTE_USER настроен соответствующим образом. Если да, то поместите значение REMOTE_USER в заголовок Proxy-User для бэкэнда следующим образом:
RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}] # note mod_rewrite's lookahead option
RequestHeader set Proxy-User %{PROXY_USER}e
Вот что происходит:
Теперь на бэкэнде вы можете извлечь это значение заголовка и установить REMOTE_USER следующим образом:
RewriteCond %{HTTP:Proxy-user} ^(.*)$
RewriteRule .* - [E=REMOTE_USER:%1]
Вот что происходит:
На стороне бэкенда вы также можете использовать стандартный mod_auth_basic, если не хотите связываться с mod_rewrite. Предполагая, что вы передаете пользователя как X-Remote-User:
<Location />
AuthBasicFake "%{HTTP:X-Remote-User}" "password"
</Location>
Это работает только в версии 2.4, но имеет дополнительное преимущество настройки других аспектов истинного mod_auth (т.е. поддержки аутентификации PHP)
В apache 2.4 при попытке получить переменные env, созданные mod_authnz_ldap и mod_kerb, вот что сработало.
Допустим, вы ищете AUTHORIZE_sAMAccountName
,
RewriteEngine On
RewriteRule .* - [E=THE_ACCOUNT_NAME:%{ENV:AUTHORIZE_sAMAccountName}]
RequestHeader set MY_ACCOUNT_NAME %{THE_ACCOUNT_NAME}e
После этого можно, например, зарегистрировать ЗАГОЛОВОК:
CustomLog /tmp/custom.log "%h %l %u %t \"%r\" %>s %b %{MY_ACCOUNT_NAME}i"
Ссылки:
Пример заполнения заголовка X-Remote-User с содержанием REMOTE_USER после аутентификации и отправьте этот заголовок на серверный прокси (apache 2.4.6).
# Example for Apache 2.4.6
<VirtualHost *:80>
RewriteEngine on
<Location />
###############################################
# Your authentication logic here
AuthType .......
AuthName .......
AuthBasicProvider .......
.... etc
Require valid-user
###############################################
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X-Remote-User %{RU}e
</Location>
ProxyTimeout 300
ProxyPass / http://localhost:81/
ProxyPassReverse / http://localhost:81/
</VirtualHost>