Как предотвратить раскрытие паролей пользователей Apache?

Как предотвратить раскрытие паролей пользователей 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 (которая не раскрывает пароль и имеет преимущество единого входа), но в некоторых браузерах (Chrome и в некоторых случаях Firefox) она автоматически возвращается к базовому режиму, в результате чего пароль снова становится раскрытым.

решение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

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

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

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

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

[1]:http://rnd.feide.no/simplesamlphpпростойSAMLphp

[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!";

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

Связанный контент