Apache がユーザーのパスワードを公開するのを防ぐにはどうすればよいですか?

Apache がユーザーのパスワードを公開するのを防ぐにはどうすればよいですか?

Apache で基本認証 (具体的には LDAP 経由ですが、htpasswd も) を使用すると、REMOTE_USER 変数がその下の PHP / Ruby / Python コードで使用できるようになります。これは、認証を Web サーバーにオフロードするのに非常に便利です。

私たちのオフィス環境では、SSL 経由でこのように動作する社内アプリケーションが多数あり、すべて非常に安全です。ただし、Apache は PHP_AUTH_USER (=REMOTE_USER) および PHP_AUTH_PW 変数を PHP 内の任意のアプリケーションに公開します (PHP_AUTH_PW には、ユーザーが入力したプレーンテキストのパスワードが含まれます)。つまり、アプリケーションがユーザー名とパスワードを収集できる可能性があります。おそらく、同じ情報が Python と Ruby にも利用可能でしょう (現在、3 つすべてが使用されており、PHP は段階的に廃止されています)。

では、Apache がこれを行わないようにするにはどうすればよいでしょうか?

1 つのアイデアは、Kerberos ネゴシエート認証 (パスワードが公開されず、SSO の利点がある) を使用することですが、一部のブラウザー (Chrome や場合によっては Firefox) では自動的に Basic にフォールバックし、パスワードが再び公開されることになります。

答え1

万が一、私と同じように誰かがこの質問に遭遇した場合に備えて:

Apache 2.4.5以降では、AuthBasicFakeパスワードをマスクするディレクティブ:

AuthBasicFake toto tata

結果:

PHP_AUTH_USER=toto
PHP_AUTH_PWD=tata

ユーザー名を保持するには:

AuthBasicFake %{REMOTE_USER} tata

結果は次のようになります:

PHP_AUTH_USER=value-of-remote-user 
PHP_AUTH_PWD=tata

REMOTE_USER は影響を受けません。

答え2

不可能に思えるが、http://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
投稿 #8 では、変数を設定解除するスクリプトを実行するために auto_prepend_file を使用することを提案しています。
これは回避策であり、クリーンな解決策ではありませんが、存在します...

AuthType Digest を試しましたか?

答え3

Radius は正しいです。それはできません。

さらに調査を進めていくと、これは基本的に ID アサーションの教科書的なシナリオであることがわかりました。信頼できる ID プロバイダーが、ユーザーの ID をクライアント アプリケーションに「証明」します。SAML 2.0 仕様は適しているようです。

インフラストラクチャ層を増やさずに済むことを期待していましたが、IDP には simpleSAMLphp[1]、Apache 側には mod_mellon[2] を使用することにしました。(1 日かけて調整すれば動作します。) これでパスワードの問題は解決しませんが、制御できる状態になります。

余談ですが、Sun の OpenSSO は非常に強力ですが、Oracle はそれを廃止し、関連する OpenAM プロジェクトの将来はまだ明らかではありません。

[1]:http://rnd.feide.no/simplesamlphpシンプルなSAMLphp

[2]:http://code.google.com/p/modmellon/メロン

答え4

回避策があります。.htaccessに以下を追加しました。

php_value auto_prepend_file "global_prepend.php"

ファイル「global_prepend.php」に次の PHP 行を追加しました。

$_SERVER["PHP_AUTH_PW"]="Shh! It's a secret!";

これで自分の資格情報でログインできるようになり、実際のパスワードは保存されなくなりました。

関連情報