Bei Verwendung der Basisauthentifizierung (speziell über LDAP, aber auch über htpasswd) mit Apache wird die Variable REMOTE_USER für den darunterliegenden PHP-/Ruby-/Python-Code verfügbar – dies ist sehr nützlich, um die Authentifizierung auf den Webserver auszulagern.
In unserer Büroumgebung arbeiten viele interne Anwendungen auf diese Weise über SSL, und das alles ziemlich sicher. ABER: Apache stellt die Variablen PHP_AUTH_USER (=REMOTE_USER) und PHP_AUTH_PW jeder Anwendung innerhalb von PHP zur Verfügung. (PHP_AUTH_PW enthält das vom Benutzer eingegebene Passwort im Klartext.) Das bedeutet, dass die App Benutzernamen und Passwörter abgreifen kann. Vermutlich stehen Python und Ruby dieselben Informationen zur Verfügung (alle drei werden derzeit verwendet; PHP wird auslaufen).
Wie kann ich Apache also daran hindern, dies zu tun?
Eine Idee besteht darin, die Kerberos-Negotiate-Authentifizierung zu verwenden (die das Kennwort nicht preisgibt und den Vorteil hat, dass es sich um SSO handelt). Bei einigen Browsern (Chrome und in einigen Fällen Firefox) wird dabei jedoch automatisch auf Basic zurückgegriffen, wodurch das Kennwort erneut preisgegeben wird.
Antwort1
Nur für den Fall, dass jemand wie ich über diese Frage stolpert:
In Apache 2.4.5 und höher können Sie denAuthBasicFake
Anweisung zum Maskieren des Passworts:
AuthBasicFake toto tata
Ergebnisse in:
PHP_AUTH_USER=toto
PHP_AUTH_PWD=tata
So behalten Sie den Benutzernamen:
AuthBasicFake %{REMOTE_USER} tata
ergibt:
PHP_AUTH_USER=value-of-remote-user
PHP_AUTH_PWD=tata
REMOTE_USER ist nicht betroffen.
Antwort2
Scheint nicht möglich zu sein, aber sehen Siehttp://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
In Beitrag Nr. 8 wird vorgeschlagen, auto_prepend_file zu verwenden, um ein Skript auszuführen, das die Variable aufhebt.
Es handelt sich dabei um einen Workaround, nicht um eine saubere Lösung, aber es gibt sie ...
Haben Sie AuthType Digest ausprobiert?
Antwort3
Radius hat recht – das geht nicht.
Nach weiteren Recherchen wurde mir klar, dass dies im Grunde ein Musterszenario für eine Identitätsbestätigung ist: Ein vertrauenswürdiger Identitätsanbieter „beweist“ der Client-Anwendung die Identität des Benutzers. Die SAML 2.0-Spezifikation scheint hierfür gut zu passen.
Ich hatte gehofft, ohne weitere Infrastrukturschichten auszukommen, werde aber simpleSAMLphp[1] für den IDP und mod_mellon[2] für die Apache-Seite verwenden. (Nach einem Tag Herumprobieren funktioniert es.) Das löst das Passwortproblem zwar nicht, bringt es aber in eine kontrollierbare Richtung.
Abgesehen davon: Suns OpenSSO ist ziemlich leistungsstark, wurde aber von Oracle eingestellt und die Zukunft des zugehörigen OpenAM-Projekts ist noch immer ungewiss.
[1]:http://rnd.feide.no/simplesamlphpsimpleSAMLphp
[2]:http://code.google.com/p/modmellon/mod_mellon
Antwort4
Ich habe einen Workaround. Ich habe meiner .htaccess Folgendes hinzugefügt
php_value auto_prepend_file "global_prepend.php"
In der Datei „global_prepend.php“ habe ich folgende PHP-Zeile hinzugefügt:
$_SERVER["PHP_AUTH_PW"]="Shh! It's a secret!";
Ich kann mich jetzt mit meinen Anmeldeinformationen anmelden und mein echtes Passwort ist nicht mehr gespeichert.