Sven (κ): Dynamische Benutzerauthentifizierung anhand URL

Hallo,

ich habe etwa folgende Verzeichnisstruktur:

/
   /peter
   /ingrid
   /adolf
   /pianola

Nun möchte ich gerne alle diese Verzeichnisse durch eine einfache Authentifikation schützen, die zugehörige .htpasswd möge nun so aussehen:

peter:peterspasswort
ingrid:ingridspasswort
adolf:adolfspasswort
pianola:pianolaspasswort

Würde ich einen ganz simplen Passwortschutz à la (Apache 2.2)

AuthType Basic
AuthName "Nur mit Passwort."
AuthUserFile /pfad/zur/passwort-datei
Require valid-users

verwenden, dann hätte das zur Folge, dass ingrid mit ihrem Passwort auch Zugriff zu peter erhält. Ich möchte allerdings mit nicht wesentlich mehr Administrationsaufwand erreichen, dass nur die gleichnamigen Benutzer in der Passwortdatei Zugriff auf die entsprechenden Verzeichnisse erlangen, ohne für jedes Verzeichnis einzeln Konfigurationen zu erstellen.

Hat jemand eine Idee?

Grüße,

Sven

--
ich hatte mal meterlange signs, die sind alle weg
  1. Hallo,

    Ich möchte allerdings mit nicht wesentlich mehr Administrationsaufwand erreichen, dass nur die gleichnamigen Benutzer in der Passwortdatei Zugriff auf die entsprechenden Verzeichnisse erlangen, ohne für jedes Verzeichnis einzeln Konfigurationen zu erstellen.

    vom letzten Teilsatz wirst du dich vermutlich verabschieden müssen. Warum nicht in jedes der Benutzerverzeichnisse eine separate .htaccess packen, die z.B. die Direktive

    require user ingrid

    enthält? Eine Vorlage für diese .htaccess kannst du ja irgendwo ablegen, so dass du sie nur noch in das jeweilige Verzeichnis kopieren und den Benutzernamen anpassen musst.

    So long,
     Martin

    --
    Wichtig ist, was hinten rauskommt.
      (Helmut Kohl, 16 Jahre deutsche Bundesbirne)
    1. Hallo,

      Ich möchte allerdings mit nicht wesentlich mehr Administrationsaufwand erreichen, dass nur die gleichnamigen Benutzer in der Passwortdatei Zugriff auf die entsprechenden Verzeichnisse erlangen, ohne für jedes Verzeichnis einzeln Konfigurationen zu erstellen.

      vom letzten Teilsatz wirst du dich vermutlich verabschieden müssen. Warum nicht in jedes der Benutzerverzeichnisse eine separate .htaccess packen, die z.B. die Direktive

      require user ingrid

      enthält? Eine Vorlage für diese .htaccess kannst du ja irgendwo ablegen, so dass du sie nur noch in das jeweilige Verzeichnis kopieren und den Benutzernamen anpassen musst.

      Jain, das ist gar nicht mal nötig. Es reicht vollkommen aus, wenn Du folgende Verzeichnisstruktur hast:

      /hauptverzeichnis
            .htaccess
                    AuthName ...
                    AuthType Basic
                    AuthUserFile /.../.htusers
                    # KEIN require (oder require valid-user oder sowas)
            verzeichnis1/
                  .htaccess
                            require user ingrid
            verzeichnis2/
                  .htaccess
                            require user martin
            verzeichnis3/
                  .htaccess
                            require user christian

      Die Auth-Einstellungen werden dann automatisch von der höherliegenden .htaccess "geerbt", die Authentifizierung wird aber nur in den einzelnen Verzeichnissen per require forciert.

      Dann hat man eine zentrale Konfigurationsdatei für die Authentifizierung und lauter einzelne Dateien für die Autorisierung.

      Viele Grüße,
      Christian

      1. Hallo Christian,

        vom letzten Teilsatz wirst du dich vermutlich verabschieden müssen. Warum nicht in jedes der Benutzerverzeichnisse eine separate .htaccess packen, die z.B. die Direktive
        require user ingrid
        enthält? Eine Vorlage für diese .htaccess kannst du ja irgendwo ablegen, so dass du sie nur noch in das jeweilige Verzeichnis kopieren und den Benutzernamen anpassen musst.
        Jain, das ist gar nicht mal nötig. Es reicht vollkommen aus, wenn Du folgende Verzeichnisstruktur hast:
        [..]
        Die Auth-Einstellungen werden dann automatisch von der höherliegenden .htaccess "geerbt", die Authentifizierung wird aber nur in den einzelnen Verzeichnissen per require forciert.

        ja gut, das ist klar (und außerdem hat Der Martin das so gemeint, wenn ich ihn richtig verstehe). So eine Lösung ist allerdings recht unpraktisch, wenn z.B. die Verzeichnisse von einem Benutzer über FTP erstellt werden - ich müsste dann z.B. einen Daemon im Hintergrund laufen lassen, der das Hauptverzeichnis überwacht und bei einem neuen Verzeichnis automatisch einen Befehl à la

        $ echo "Require dirname" > .htaccess

        absetzt. Und das ist leider nicht so vollautomatisch, wie ich es gerne hätte.

        Nach einigen Stunden grübeln bin ich zu der Lösung gekommen, dass ich meine Idee vermutlich am ehesten verwirklichen kann, in dem ich den ganzen Verzeichnisinhalt über Web unerreichbar mache (deny from all) und schließlich die URLs per mod_rewrite auf ein kleines CGI-Script weiterleite. Und das kann ja dann ganz einfach in einer Passwortdatei mit dem vorher extrahierten Verzeichnisnamen eine HTTP-Authentifikation durchführen. Allerdings hat das ganze den fahlen Nachgeschmack, dass alle Dateien dann über das CGI-Script laufen (dies bringt einen nicht unerheblichen Perfomance-Nachteil, vom CGI-Script selbst mal abgesehen) und - das ist gerade in meinem Fall blöd - ich die automatischen Verzeichnislistings von mod_autoindex nicht nutzen kann, sondern mir eigene basteln muss ;-)

        Na gut, es waren ein paar Minuten Programmierung, aber jetzt habe ich so eine Lösung in PHP. Schade, dass die seit Apache 2.2. umstrukturierten Authentifikationsmechanismen so etwas nicht unterstützen. Im Endeffekt würde es ja reichen, wenn man sowas wie

        Require ${REQUEST_URI}

        schreiben könnte und in der htpasswd anschließend die Verzeichnisse quasi per Globbing auflöst:

        /verzeichnis*:passwort
        /anderesverzeichnis*:passwort

        Bei einer Integration des ganzen in mod_rewrite (das klingt etwas abenteuerlich ;) ) würde man sicher einiges an Flexibilität hinzugewinnen.

        Wo wir gerade bei Apaches neu strukturiertem Authentifikationsmodell sind: Ich finde es recht traurig, dass Apache nicht einfach PAM benutzt, anstelle für alle möglichen Authentifikations-Backends eigene Implementierungen zu schreiben (flat files, shadow, MySQL, Ldap - das gibts alles, und noch mehr, schon über PAM).

        Viele Grüße,

        Sven

        1. Hi,

          Im Endeffekt würde es ja reichen, wenn man sowas wie

          Require ${REQUEST_URI}

          schreiben könnte und in der htpasswd anschließend die Verzeichnisse quasi per Globbing auflöst:

          /verzeichnis*:passwort
          /anderesverzeichnis*:passwort

          Bei einer Integration des ganzen in mod_rewrite (das klingt etwas abenteuerlich ;) ) würde man sicher einiges an Flexibilität hinzugewinnen.

          Du hast per RewriteCond doch Zugriff auf die Umgebungsvariablen REMOTE_USER und REQUEST_URI.
          Dann koenntest du ja verlangen, dass der REMOTE_USER an spezifischer Position im REQUEST_URI vorkommen muss - wenn nicht, gibt's per RewriteRule einen 403 Forbidden.

          Muss man dann nur schauen, dass sich die Responses auf "richtiges Verzeichnis/Username und falsches Passwort" und "falscher Username / richtiges Passwort" gleichen - andernfalls koennte man von ausserhalb ggf. unerwuenschte Rueckschluesse ziehen.

          Hab's jetzt nicht ausprobiert, aber denke schon, dass das so in etwa realisierbar sein sollte.

          MfG ChrisB

          1. Hallo ChrisB,

            Du hast per RewriteCond doch Zugriff auf die Umgebungsvariablen REMOTE_USER und REQUEST_URI.
            Dann koenntest du ja verlangen, dass der REMOTE_USER an spezifischer Position im REQUEST_URI vorkommen muss - wenn nicht, gibt's per RewriteRule einen 403 Forbidden.

            okay, damit könnte ich aber nur den Benutzer überprüfen, nicht das Passwort. Oder soll das etwa in der URL stehen? ;-)

            Muss man dann nur schauen, dass sich die Responses auf "richtiges Verzeichnis/Username und falsches Passwort" und "falscher Username / richtiges Passwort" gleichen - andernfalls koennte man von ausserhalb ggf. unerwuenschte Rueckschluesse ziehen.

            ich verstehe nicht ganz, was du meinst. Wie soll ich von mod_rewrite auf eine Textdatei, wo die Passwörter stehen, zugreifen?

            Grüeß,

            Sven

            --
            ich hatte mal meterlange signs, die sind alle weg
            1. Hi,

              Du hast per RewriteCond doch Zugriff auf die Umgebungsvariablen REMOTE_USER und REQUEST_URI.
              Dann koenntest du ja verlangen, dass der REMOTE_USER an spezifischer Position im REQUEST_URI vorkommen muss - wenn nicht, gibt's per RewriteRule einen 403 Forbidden.

              okay, damit könnte ich aber nur den Benutzer überprüfen, nicht das Passwort. Oder soll das etwa in der URL stehen? ;-)

              Natuerlich nich'.

              Die Authentifizierung laesst du nach wie vor mod_auth machen - zentral, fuer alle User-Verzeichnisse mit einer .htpasswd.
              Damit sind wir wieder beim dem Szenario, dass man darueber mit einem Zugang eigentlich in alle User-Verzeichnisse rein kaeme, auch in "fremde".
              Dem schiebst du mittels mod_rewrite einen Riegel vor - wenn der REMOTE_USER nicht zum angeforderten Verzeichnisnamen (wie gesagt, aus REQUEST_URI o.ae. "extrahieren") passt (RewriteCond), dann verbietest du per RewriteRule den Zugriff.

              Muss man dann nur schauen, dass sich die Responses auf "richtiges Verzeichnis/Username und falsches Passwort" und "falscher Username / richtiges Passwort" gleichen - andernfalls koennte man von ausserhalb ggf. unerwuenschte Rueckschluesse ziehen.

              ich verstehe nicht ganz, was du meinst. Wie soll ich von mod_rewrite auf eine Textdatei, wo die Passwörter stehen, zugreifen?

              Gar nicht, s.o.
              mod_rewrite soll nur ueberpruefen, ob bei mod_auth verwendeter Username == Verzeichnisname.
              Wenn nicht, dann mit 403 Forbidden reagieren (oder erneutem 401, fuer erneute Aufforderung zur Eingabe der Zugangsdaten).

              Nur eben die sichtbare (und unsichtbare, sprich HTTP Response Header) Antwort des Servers sollte dann in beiden Faellen (richtiger Nutzername fuer's angeforderte Verzeichnis, aber falsches Passwort - falscher Nutzername, der nicht zum angeforderten Verzeichnis passt) identisch sein - damit sich keine Rueckschluesse aus abweichenden Antworten ziehen lassen.

              MfG ChrisB

      2. Hallo noch mal,

        In Anbetracht der besseren Flexibilität, Perfomance und Wartbarkeit einer solchen halbautomatischen Lösung habe ich mein PHP-Script jetzt zugunsten einer Lösung, die deiner etwa nahekommt, verworfen. Dank einem administrations-CGI-Script lassen sich jetzt Passwörter für neue Verzeichnisse komfortabel verwalten. Wie immer wollte ich aber natürlich die "perfekte" Lösung schreiben, mit unangemessen viel Aufwand für ein solch simples Problem.

        Die Auth-Einstellungen werden dann automatisch von der höherliegenden .htaccess "geerbt", die Authentifizierung wird aber nur in den einzelnen Verzeichnissen per require forciert.

        Mal so eine Frage: Wie wär's denn, wenn ich

        /.htaccess:
          Require user admin

        /verzeichnis1/.htaccess
          Require user verzeichnis1

        schreiben würde - würde dort /verzeichnis1/.htaccess den Zuschlag bekommen oder das drübergelegene? Ich hätte nämlich gerne so eine Art "Fallback"-Lösung - bis jetzt muss ich immer

        /verzeichnis1/.htaccess
           Require user verzeichnis1 admin

        schreiben, was mir nicht wirklich gefällt.

        Grüße,

        Sven