如何防止 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 协商身份验证(不会暴露密码并具有 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 是正确的——你不能。

经过进一步研究,我意识到这基本上是身份断言的教科书场景:受信任的身份提供者向客户端应用程序“证明”用户的身份。SAML 2.0 规范似乎很合适。

我希望不用更多基础设施层,但我打算使用 simpleSAMLphp[1] 作为 IDP,使用 mod_mellon[2] 作为 Apache 端。(经过一天的调整,终于成功了。)这并不能解决密码问题,但可以将其移至可控制的位置。

另外:Sun 的 OpenSSO 非常强大,但 Oracle 却将其淘汰,而相关的 OpenAM 项目的未来仍不明朗。

[1]:http://rnd.feide.no/simplesamlphpsimpleSAMLphp

[2]:http://code.google.com/p/modmellon/mod_mellon

答案4

我有一个解决方法。我将以下内容添加到我的 .htaccess 中

php_value auto_prepend_file "global_prepend.php"

在文件“global_prepend.php”中我添加了以下 PHP 行:

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

我现在可以使用我的凭证登录,并且我的真实密码不再存储。

相关内容