如何防止 Apache 洩漏使用者密碼?

如何防止 Apache 洩漏使用者密碼?

當使用 Apache 的基本驗證(特別是透過 LDAP,但也透過 htpasswd)時,它使 REMOTE_USER 變數可供下面的 PHP / Ruby / Python 程式碼使用 - 這對於將驗證轉移到 Web 伺服器非常有用。

在我們的辦公環境中,我們有許多內部應用程式透過 SSL 運行,而且都非常安全。但是:Apache 向 PHP 內的任何應用程式公開 PHP_AUTH_USER (=REMOTE_USER) 和 PHP_AUTH_PW 變數。 (PHP_AUTH_PW 包含使用者輸入的明文密碼。)這表示應用程式可以取得使用者名稱和密碼。大概 Python 和 Ruby 也可以使用相同的資訊(這三種語言目前都在使用;PHP 正在被淘汰)。

那麼我該如何阻止 Apache 這樣做呢?

一種想法是使用 Kerberos Negotiate 驗證(它不會暴露密碼並具有 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
Post #8 建議使用 auto_prepend_file 執行一個取消設定變數的腳本
這是一個解決方法,不是一個乾淨的解決方案,但它存在...

您嘗試過 AuthType Digest 嗎?

答案3

半徑是對的——但你不能。

經過進一步研究,我意識到這基本上是身份斷言的教科書場景:受信任的身份提供者向客戶端應用程式「證明」用戶的身份。 SAML 2.0 規格似乎很適合。

我希望在沒有更多基礎設施層的情況下擺脫困境,但我將在 IDP 方面使用 simpleSAMLphp[1],在 Apache 方面使用 mod_mellon[2]。 (經過一天的修改,它成功了。)這並不能解決密碼問題,而是將其移至可以控制的位置。

旁白: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!";

我現在可以使用我的憑證登錄,並且不再儲存我的真實密碼。

相關內容