PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zugriffskontrolle mit .htaccess



Wolfman_II
30.04.12, 10:33
Hallo zusammen, ich habe hier ein kniffliges Problem bei dem ich bislang weder mit Suchen im Internet, noch in diversen Foren weitergekommen bin. Eigentlich geht es "nur" um den Schutz eines Verzeichnisses mittels .htaccess

Folgende Ausgangssituation:

Ich betreibe eine Website auf meinem eigenen Server. Installiert ist ein Apache 2.2.22; die Module mod_ssl und OpenSSL sind ebenfalls installiert. Der Zugriff über das Internet erfolgt ausschließlich über https. Im Router ist hierfür der Port 443 freigeschaltet. Um auf eine bestimmte Seite zugreifen zu können habe ich in einer .htaccess Datei eine SSL Client Authentifizierung eingerichtet. Dies funktioniert auch alles völlig problemlos.

Nun möchte ich aber zusätzlich folgendes erreichen:
Um aus dem LAN auf die selbe Seite zugreifen zu können, möchte ich keine SSL Client Authentifizierung durchführen. Hier soll jeder Client aus einem bestimmten Subnetz berechtigt sein die Seite mittels HTTP aufzurufen.

Es gibt Apache Konfiguartionen sowohl für den Zugriff mittels HTTPS, als auch für HTTP.

Nun gibt es in der Apache-Dokumentation eine Kombinationsprüfung (http://httpd.apache.org/docs/2.0/ssl/ssl_howto.html#intranet), die (so wie ich das verstehe) genau das umsetzt was ich vorhabe und ich habe versucht diese in eine .htaccess Datei umzubauen. Leider mit mäßigem Erfolg.

So wie ich die Doku verstehe kann man hier unterschiedliche Prüfungskriterien definieren, die dann entweder jeweils einzeln (Satisfy any) oder alle zusammen (Statisfy all) zutreffen müssen, damit der Zugriff gestattet wird. Eigentlich entspricht das ganz exakt dem was ich vorhabe.

Ich habe mir aus dem Beispiel nun eine .htaccess Datei gebastelt, wobei ich das FakeBasicAuth aus der Doku weggelassen habe, da ich ja gerade keine Passwortabfrage generieren möchte, sondern eine reine Client-Zertifikats-Auth.

Meine .htaccess sieht nun so aus:




SSLOptions +StrictRequire
SSLVerifyClient optional
SSLVerifyDepth 5
SSLRequire %{SSL_CLIENT_S_DN_CN} eq "xxxxx" \
or %{SSL_CLIENT_S_DN_CN} > "yyyyy"

Order deny,allow
Deny from all
Allow from 192.168.178.0/24

Satisfy any


Leider funktioniert das nicht so wie in der Doku beschrieben.

Wenn ich nun aus dem LAN heraus per http auf die Webseite zugreife, wird mir diese einwandfrei angezeigt.
Wenn ich aus dem Internet per https auf die Webseite zugreife, wird mir eine Fehlerseite angezeigt, dass die Seite nicht gefunden werden konnte. Wenn ich allerdings die Order, Deny, Allow und Satisfy Anweisung auskommentiere und dann nochmal per https aus dem Internet die Seite aufrufe, wird, so wie es sein soll, nach dem Zertifikat gefragt und danach die Seite korrekt angezeigt.
Scheinbar funktioniert hier die Satisfy Prüfung irgendwie nicht.

Hab ich etwas übersehen oder muss in den Apache-Conf Dateien etwas besonderes eingestellt werden, damit die Satisfy Prüfung überhaupt stattfindet?

Ich hoffe, ich habe mich jetzt nicht zu verwirrend ausgedrückt.

DrunkenFreak
30.04.12, 10:50
Wir haben das mit zwei verschiedenen Vhosts gelöst. Vielleicht wäre das eine Alternative.

marce
30.04.12, 11:27
ich vermute mal nach lesen der Doku, daß Du das falsch verstanden hast - es geht im Beispiel von der Apache-Doku nicht darum, daß jemand entweder mit ClientCert oder aus einem ded. Netzwerk zugreifen kann sondern darum, daß sowohl bei https also auch mit http entweder jemand aus einem ded. Netzwerk kommt oder eben ein htaccess-PW gewünscht ist.

Das was Du willst kannst Du denke ich nur dadurch erreichen, daß Du die jeweils gewünschten Config-Einstellungn direkt im vHost konfigurierst und nicht über eine allgemeingültige htacces.

Wolfman_II
30.04.12, 11:30
Ja, den Tip mit zwei vHosts habe ich auch schon mal bekommen. Diese Lösung würde für mich aber verschiedene Nachteile mitbringen.

Erstens werden die vHosts ja in den Apache-Conf Dateien konfiguriert und diese werden bei mir leider bei jedem Firmwareupdate wieder auf Original zurückgesetzt, so dass ich jedes mal wieder die Änderungen neu durchführen müsste.

Zweitens möchte ich verschiedene Unterseiten der Website für verschiedene Client-Zertifikate freigeben; deshalb kann ich die Client-Zertifikate nicht im vHost konfigurieren, da diese dann ja für alle Unterseiten Gültigkeit hätten.

Aus diesen Gründen würde ich eigentlich gerne die Lösung mit einer .htaccess Datei realisieren, da ich diese angepasst für jedes Unterverzeichnis verwenden könnte und diese nicht bei einem Update überschrieben wird.
Und laut Doku sollte das doch auch eigentlich funktionieren.

Wie hast du denn die Config mit deinen vHosts gemacht?

Wolfman_II
30.04.12, 11:36
Hallo Marce, so wie ich das Beispiel verstehe, wird der Zugriff aus dem Internet mit RewriteCond immer auf HTTPS umgelenkt und dann eine Auth mittels Passwort durchgeführt. Die RewriteCond kann ich mir bei mir sparen, da aus dem Internet eh nur der Port 443 geöffnet ist und somit ein Zugriff mittels HTTP auf Port 80 nicht möglich ist und somit auch nicht umgeschrieben werden muss. Und das Basic Auth kann man ja durch ein Client-Zert Auth ersetzen.
Der interne Zugriff aus dem LAN wird im Beispiel im vorletzten Absatz dann mit Order Deny,Allow geregelt. Die Kombinationsprüfung ist dann das Satisfy Any.

marce
30.04.12, 12:37
Deine Client-Cert-"Muss da sein-Konfig"-Einstellung ist nichts, was Satsfiy bearbeitet. Das ist nur dafür da, zwischen IP und PW-Zugriff zu unterscheiden.

Siehe Doku.

Ansonsten - wenn deine Apache-Config nach Updates überschrieben ist hast Du was falsch gemacht.

Wenn Du Dinge öfters verwenden willst - kannst Du sie auch in ded. Konfigfiles auslagern und an gewünschter Stelle includen - so musst Du es nur 1x pflegen.

Das was Du willst geht über die .htaccess nicht - sauber nur über ded. getrennte Hosts, die entsprechend eingerichtet sind.

Wolfman_II
30.04.12, 17:00
Hmmm, das ist ärgerlich. Es hätte so einfach sein können....

DrunkenFreak
30.04.12, 17:02
Möglich ist vieles mit PHP. Musst einfach nur die IP abfragen, welche die Anfrage stellt. Je nachdem welches es dann ist, leitest du entweder direkt weiter oder machst eine Überprüfung auf das Zertifikat (das wirst du wahrscheinlich auch wieder in PHP machen müssen).

Wolfman_II
30.04.12, 17:36
Ja, PHP war vorhin auch ein Gedanke von mir, hab ich aber schon wieder verworfen.
Ich denke ich werde das mit den vHosts realisieren. Ich mache mir eine Muster Konfiguration und kopiere die nach einem Firmwareupdate einfach wieder zurück. Ist zwar lästig, kommt ja aber auch nicht sooo häufig vor.

Danke für eure Gedanken.