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

Как я могу запретить Apache раскрыть пароль пользователя?

При использовании базовой аутентификации (в частности, через LDAP, но также и htpasswd) с Apache он делает переменную REMOTE_USER доступной для кода PHP / Ruby / Python внизу - это очень полезно для разгрузки аутентификации на веб-сервере.

В нашем офисе у нас есть множество внутренних приложений, работающих подобным образом через SSL, и все они достаточно безопасны. НО: Apache предоставляет переменные PHP_AUTH_USER (= REMOTE_USER) и PHP_AUTH_PW любому приложению внутри PHP. (PHP_AUTH_PW содержит пароль в открытом виде, введенный пользователем.) Это означает, что приложение может собирать имена пользователей и пароли. Предположительно такая же информация доступна для Python и Ruby (все три в настоящее время используются; PHP постепенно прекращается).

Итак, как я могу предотвратить это от Apache?

Одна из идей состоит в том, чтобы использовать аутентификацию Kerberos Negotiate (которая не раскрывает пароль и имеет преимущество единого входа), но она автоматически возвращается к Basic для некоторых браузеров (Chrome и в некоторых случаях Firefox), в результате чего пароль снова открывается. .

На всякий случай, если кто-то наткнется на этот вопрос, как я:

В 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 не затронут.

Кажется невозможным, но посмотрим http://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
В сообщении № 8 предлагается использовать auto_prepend_file для запуска скрипта, который отключит переменную
Это обходной путь, а не чистое решение, но оно существует ...

Вы пробовали AuthType Digest?

Радиус правильный - нельзя.

После дальнейшего исследования я понял, что это, по сути, сценарий из учебника для утверждения идентичности: доверенный провайдер идентификации «доказывает» идентичность пользователя клиентскому приложению. Спецификация SAML 2.0 кажется подходящей.

Я надеялся обойтись без дополнительных уровней инфраструктуры, но я собираюсь использовать simpleSAMLphp [1] для IDP и mod_mellon [2] для стороны Apache. (День на возню, и он работает.) Это не решает проблему с паролем, но перемещает его туда, где его можно контролировать.

Кроме того: OpenSSO от Sun довольно мощный, но Oracle убил его, и будущее связанного с ним проекта OpenAM все еще неясно.

[1]: http://rnd.feide.no/simplesamlphp simpleSAMLphp

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

У меня есть обходной путь. Я добавил следующее в свой .htaccess

php_value auto_prepend_file "global_prepend.php"

В файл global_prepend.php я добавил следующую строку PHP:

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

Теперь я могу войти в систему с моими учетными данными, и мой настоящий пароль больше не сохраняется.