Como posso evitar que o Apache exponha a senha de um usuário?

Como posso evitar que o Apache exponha a senha de um usuário?

Ao usar autenticação básica (especificamente via LDAP, mas também htpasswd) com Apache, ele disponibiliza a variável REMOTE_USER para o código PHP/Ruby/Python abaixo - isso é muito útil para descarregar a autenticação para o servidor web.

Em nosso ambiente de escritório temos muitos aplicativos internos funcionando assim através de SSL, todos bastante seguros. MAS: O Apache expõe as variáveis ​​PHP_AUTH_USER (=REMOTE_USER) e PHP_AUTH_PW para qualquer aplicação dentro do PHP. (PHP_AUTH_PW contém a senha em texto simples que o usuário digitou.) Isso significa que é possível que o aplicativo colete nomes de usuário e senhas. Presumivelmente, a mesma informação está disponível para Python e Ruby (todos os três estão atualmente em uso; PHP está sendo descontinuado).

Então, como posso evitar que o Apache faça isso?

Uma ideia é usar a autenticação Kerberos Negotiate (que não expõe a senha e tem a vantagem de ser SSO), mas que volta automaticamente para o Basic para alguns navegadores (Chrome e em alguns casos Firefox), fazendo com que a senha seja exposta novamente .

Responder1

Apenas no caso de alguém tropeçar nesta questão como eu:

No Apache 2.4.5 e posterior você pode usar oAuthBasicFakediretiva para mascarar a senha:

AuthBasicFake toto tata

Resulta em:

PHP_AUTH_USER=toto
PHP_AUTH_PWD=tata

Para manter o nome de usuário:

AuthBasicFake %{REMOTE_USER} tata

resulta em:

PHP_AUTH_USER=value-of-remote-user 
PHP_AUTH_PWD=tata

REMOTE_USER não é afetado.

Responder2

Parece não ser possível, mas vejahttp://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
A postagem nº 8 sugere usar auto_prepend_file para executar um script que desativa a variável.
É uma solução alternativa, não uma solução limpa, mas existe ...

Você tentou o AuthType Digest?

Responder3

Radius está certo - você não pode.

Após mais pesquisas, percebi que este é basicamente um cenário clássico para uma afirmação de identidade: um provedor de identidade confiável "prova" a identidade do usuário para o aplicativo cliente. A especificação SAML 2.0 parece uma boa opção.

Eu esperava sair sem mais camadas de infraestrutura, mas vou usar simpleSAMLphp[1] para o IDP e mod_mellon[2] para o lado do Apache. (Basta um dia de ajustes e funciona.) Isso não resolve o problema da senha, mas a move para um local onde possa ser controlada.

Além: o OpenSSO da Sun é bastante robusto, mas a Oracle o matou e o futuro do projeto OpenAM relacionado ainda não está claro.

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

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

Responder4

Eu tenho uma solução alternativa. Eu adicionei o seguinte ao meu .htaccess

php_value auto_prepend_file "global_prepend.php"

No arquivo "global_prepend.php" adicionei a seguinte linha PHP:

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

Agora posso fazer login com minhas credenciais e minha senha real não está mais armazenada.

informação relacionada