При использовании базовой аутентификации (в частности, через 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!";
Теперь я могу войти в систему с моими учетными данными, и мой настоящий пароль больше не сохраняется.