web-dev-qa-db-ja.com

ProxyPassを使用したリバースプロキシ中のApache2.4 RequestHeader

Ubuntu 14.04を使用していて、ポート80でリッスンしている複数のApache HTTP VirtualHostsがあります。1つのサイトは、ローカルホストでリッスンしているアプリケーションのリバースプロキシです。 Apacheには、そのサイトのルートロケーション用に構成された基本認証があります。

Apacheの設定は次のとおりです。

<VirtualHost *:80>
        DocumentRoot /home/korisnik/site
        Alias /static /home/korisnik/site/static
        <Directory /home/korisnik/site/static>
          Require all granted
        </Directory>

        ProxyPass /static !
        ProxyPass / http://127.0.0.1:9002/
        ProxyPassReverse / http://127.0.0.1:9002/

        RequestHeader set X-Proxy-USER %{REMOTE_USER}e  #
        RequestHeader set X-Proxy-SECURE-USER %{REMOTE_USER}s
        RequestHeader set X-Foo "Bar"

        <Location />
          AuthType Basic
          AuthName "Authentication Required"
          AuthUserFile "/home/korisnik/htpasswd"
          Require valid-user
        </Location>
</VirtualHost>

私の目標は、認証されたユーザーのユーザー名をENV変数を介してバックエンドアプリケーションに渡すことです。これは、ApacheでSSLモジュールが有効になっている1つのサーバーで機能し、別のサーバーでは同じ構成でHTTP_X_PROXY_REMOTE_USERENV変数がnullに設定されました。サーバー間の違いのみがSSLモジュールを有効にしました。

ドキュメント( http://httpd.Apache.org/docs/current/mod/mod_headers.html )によると

RequestHeader set X-VARNAME %{VARNAME}e

非SSLで使用する必要がありますが、これはSSLを実行しているサイトで使用します

RequestHeader set X-VARNAME %{VARNAME}s

ヘッダーのダンプに使用するphpスクリプトは次のとおりです。

<?php
        print "REMOTE_USER: ".$_SERVER['REMOTE_USER']."\n";
        print "HTTP_X_PROXY_USER: ".$_SERVER['HTTP_X_PROXY_USER']."\n";
        print "HTTP_X_PROXY_SECURE_USER: ".$_SERVER['HTTP_X_PROXY_SECURE_USER']."\n";
        print "HTTP_X_FOO: ".$_SERVER['HTTP_X_FOO']."\n";
?>

SSLが無効になっている間は、これらのディレクティブはどちらも機能しないことがわかりました。 SSLが有効になっている場合、2番目のディレクティブは、そのサイトでSSLを有効にする、または他のサイトでSSLを有効にするなど、他の変更なしで機能します。

Apache2 mod_sslが有効になっているヘッダーと、ProxyPassを経由するリクエスト

REMOTE_USER: 
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: korisnik
HTTP_X_FOO: Bar

Apache2 mod_sslが有効になっているヘッダーと、ProxyPassなしでphpファイルに直接送信されるリクエスト

REMOTE_USER: korisnik
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: korisnik
HTTP_X_FOO: Bar

Apache2 mod_sslが無効になっているヘッダーと、ProxyPassを経由するリクエスト

REMOTE_USER: 
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: (null)
HTTP_X_FOO: Bar

Apache2 mod_sslが無効になっているヘッダーと、ProxyPassなしでphpファイルに直接送信されるリクエスト

REMOTE_USER: korisnik
HTTP_X_PROXY_USER: (null)
HTTP_X_PROXY_SECURE_USER: (null)
HTTP_X_FOO: Bar

何かが足りないのですか、それともSSLモジュールが無効になっているときにApacheがProxyディレクティブの背後にある接続にREMOTE_USER RequestHeaderを設定することを拒否していますか?

3
svakak

問題は、ヘッダーディレクティブが評価されるURL処理のフェーズ中に、リモートユーザーが_"%{REMOTE_USER}e"_を介して利用できないことであると思われます。 RewriteRuleのドキュメントによると:

For instance, to rewrite according to the REMOTE_USER variable from within the per-server context (httpd.conf file) you must use %{LA-U:REMOTE_USER} - this variable is set by the authorization phases, which come after the URL translation phase (during which mod_rewrite operates).

同様の理由で、ヘッダーディレクティブで失敗すると思います。 _"%{REMOTE_USER}s"_を介してSSLで突然利用可能になる理由はわかりませんが、これも、通信がSSLを介している初期のフェーズでリモートユーザーが設定されているためだと思います。

しかし、私はあなたの問題に対する解決策を持っています。 RewriteRuleを使用して、ドキュメントに従って先読みを行い、リモートユーザーを取得して、それに応じてヘッダーを設定できます。

 RewriteEngine On 
 RewriteRule ^-[E = MY_REMOTE_USER:%{LA-U:REMOTE_USER}] 
 RequestHeader set X-Proxy-USER%{MY_REMOTE_USER} e 
2
Unbeliever