Назад | Перейти на главную страницу

REMOTE_USER через обратный прокси-сервер Apache

У меня есть веб-сервер 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

Вот что происходит:

  1. RewriteRule срабатывает для каждого запроса и устанавливает переменную среды PROXY_USER равной значению REMOTE_USER, которое уже должно быть установлено модулем аутентификации.
  2. RequestHeader устанавливает заголовок запроса с именем Proxy-User со значением PROXY_USER.

Теперь на бэкэнде вы можете извлечь это значение заголовка и установить REMOTE_USER следующим образом:

RewriteCond %{HTTP:Proxy-user} ^(.*)$
RewriteRule .* - [E=REMOTE_USER:%1]

Вот что происходит:

  1. RewriteCondition проверяет значение заголовка Proxy-User, чтобы увидеть, соответствует ли он шаблону ^. * $ (Что будет). Скобки указывают mod_rewrite хранить это значение в% 1.
  2. Затем RewriteRule устанавливает переменной среды 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>