Dennis: Apache Zugriffsschutz mit Systemusern

Hi liebes Forum,

derzeit suche ich verzweifelt nach einer Möglichkeit bzw. nach einem Modul eines Drittanbieters, welches mir es mir erlaubt für eine HTTP Authentifizierung die Systemuser als Basis zu verwenden.

Folgendes Szenario - auf einer Subdomain auf dem V-Server meiner Schule befinden sich Tools zum Verwalten von MySQL und PgSQL Datenbanken, der Zugriff darauf soll über eine HTTP Authentification geschützt sein.
Zugriff sollen alle haben, die auch Zugriff auf das System haben, sich also über die Shell (bzw. über SSH) anmelden können - dabei sollen Benutzername/Passwort identisch sein.

Aus diesem Grund wäre es unpraktisch, wenn man das mit einer normalen .htusers Datei machen würde, weil dann diese Datei immer von Hand aktualisiert werden müsste, wenn ein User sein Passwort ändert.

Was ich bräuchte wäre also ein Modul, welches als Basis die /etc/passwd und (optimal) /etc/group Dateien verwenden würde, per Require müsste es dann auch möglich sein, dass auf bestimmte User einzuschränken, weil sich natürlich keiner über apache oder so anmelden soll. Ideal wäre es natürlich, wenn man per Require group dbadminusers das auf Benutzer die der Gruppe dbadminusers angehören einschränken könnte.

Kennt jemand von euch ein Modul oder eine im Apache vorhandene Möglichkeit, wie sich das realisieren ließe? Oder hat es vielleicht sogar schon mal jemand gemacht?

Als Apache ist derzeit 2.2.0 im Einsatz, der bietet ja schon Einiges an Auth-Modulen, allerdings habe ich da in der (noch etwas spärlichen) Dokumentation nichts gefunden, was mir oben geanntes Vorgehen ermöglichen würde. Ich würde auch gerne bei Apache 2.2.x bleiben.

MfG, Dennis.

  1. Moin!

    http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html

    Ab einem bestimmten Komplikationsgrad ist es eine gute Idee, die Authentifizierung generell durch einen "dritten" Server durchführen zu lassen. Wie wäre es mit LDAP?

    http://search.cpan.org/~speeves/Apache-AuthzNIS-0.11/AuthzNIS.pm

    Ähnlich: Benutze einen aufzusetzenden NIS-Server für die Authentifizierung, auch damit lassen sich Benutzerinformationen verteilen und Passwörter gegenprüfen. LDAP ist aber moderner.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. Hi fastix®,

      http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html

      Ab einem bestimmten Komplikationsgrad ist es eine gute Idee, die Authentifizierung generell durch einen "dritten" Server durchführen zu lassen. Wie wäre es mit LDAP?

      Über LDAP habe ich natürlich auch schon nachgedacht, allerdings kenne ich mich damit nicht so wirklich aus, soll heißen ich kenne es zwar als Anwender, nicht allerdings als Betreiber. Ich scheue mich aus diesem Grund etwas, das zu verwenden, zumal LDAP ja nur dann etwas bringt, wenn man es auch überall zur Authentifizierung nutzt, d.h. für die Anmeldung am System (SSH), MySQL, PgSQL und so weiter.

      Aber Sven hat ja mit PAM noch eine weitere Möglichkeit genannt, ich werde mir also zuerst mal PAM anschauen und wenn ich wirklich gar keine Lösung finde eventuell auf LDAP zurück greifen.

      MfG, Dennis.

  2. Moin!

    Was ich bräuchte wäre also ein Modul, welches als Basis die /etc/passwd und (optimal) /etc/group Dateien verwenden würde, per Require müsste es dann auch möglich sein, dass auf bestimmte User einzuschränken, weil sich natürlich keiner über apache oder so anmelden soll.

    Dein Wunsch ist in deiner Gedankenwelt leider undurchführbar. Die Passworte der User stehen nicht in /etc/passwd, sondern in /etc/shadow - diese Datei ist aber aus Sicherheitsgründen nur für root lesbar, der Apache hat darauf keinerlei Zugriff.

    Was du suchst, ist eine Möglichkeit, mit einem Modul die Systemauthentifikation anzuzapfen. Da moderne Linuxe PAM als Authentifizierung benutzen, auch um diverse Passwortspeicher (/etc/shadow, MySQL, LDAP,...) mit einer einheitlichen Schnittstelle anzusprechen, suchst du also eher etwas wie "mod_auth_pam" - und genau das wird bei Google auch gefunden.

    Als Apache ist derzeit 2.2.0 im Einsatz, der bietet ja schon Einiges an Auth-Modulen, allerdings habe ich da in der (noch etwas spärlichen) Dokumentation nichts gefunden, was mir oben geanntes Vorgehen ermöglichen würde. Ich würde auch gerne bei Apache 2.2.x bleiben.

    Version 2.2 könnte etwas zu neu sein für deinen Wunsch. Modulhersteller sind da der Entwicklung immer etwas hinterher. Das Modul hier ist jedenfalls nur für Apache 1.3 und 2.0 erhältlich - ich erwarte größere Probleme beim Versuch, es für 2.2 zu benutzen. Aber wenn du die notwendigen Anpassungen gleich als Patch anbietest - warum nicht? :)

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!
    1. Hi Sven,

      Dein Wunsch ist in deiner Gedankenwelt leider undurchführbar. Die Passworte der User stehen nicht in /etc/passwd, sondern in /etc/shadow - diese Datei ist aber aus Sicherheitsgründen nur für root lesbar, der Apache hat darauf keinerlei Zugriff.

      Stimmt, daran hatte ich gar nicht gedacht.

      Was du suchst, ist eine Möglichkeit, mit einem Modul die Systemauthentifikation anzuzapfen. Da moderne Linuxe PAM als Authentifizierung benutzen, auch um diverse Passwortspeicher (/etc/shadow, MySQL, LDAP,...) mit einer einheitlichen Schnittstelle anzusprechen, suchst du also eher etwas wie "mod_auth_pam" - und genau das wird bei Google auch gefunden.

      Ich habe mich jetzt mal etwas in das Thema eingelesen - ich fand den Wikipedia-Artikel, sowie die dort verlinkte PDF-Datei ganz hilfreich als Einstieg.

      Auch das unten von dir genannte Modul habe ich mir mal was näher angeschaut, eine Sache ist mir allerdings aufgefallen: Auch dieses Modul kommt nicht um die Problematik herum, dass /etc/shadow für nicht-roots nicht zu lesen ist! Hier wird einfach gesagt, dass man über die Gruppenzugehörigkeit dem Apache Lese-Rechte auf die Datei geben soll.

      Als Apache ist derzeit 2.2.0 im Einsatz, der bietet ja schon Einiges an Auth-Modulen, allerdings habe ich da in der (noch etwas spärlichen) Dokumentation nichts gefunden, was mir oben geanntes Vorgehen ermöglichen würde. Ich würde auch gerne bei Apache 2.2.x bleiben.

      Version 2.2 könnte etwas zu neu sein für deinen Wunsch. Modulhersteller sind da der Entwicklung immer etwas hinterher. Das Modul hier ist jedenfalls nur für Apache 1.3 und 2.0 erhältlich - ich erwarte größere Probleme beim Versuch, es für 2.2 zu benutzen. Aber wenn du die notwendigen Anpassungen gleich als Patch anbietest - warum nicht? :)

      Hm, ich fürchte auch, dass Apache 2.2.x etwas zu neu sein könnte :-( Nun ja, ein patchen würde daran scheitern, dass ich nicht wirklich Ahnung von C geschweige den von der Apache Plugin API habe ;-)

      Ich werde mich da allerdings mal noch etwas vertiefen bzw. jetzt erst mal probieren, die Version von mod_auth_pam für 2.0.x unter 2.2.x zu verwenden, auch wenn ich mir da so gut wie keine Hoffnungen mache. Auf jeden Fall hast du mich jetzt auf die richtige Spur gebracht, Danke. :-)

      MfG, Dennis.

      1. Hi,

        Ich werde mich da allerdings mal noch etwas vertiefen bzw. jetzt erst mal probieren, die Version von mod_auth_pam für 2.0.x unter 2.2.x zu verwenden, auch wenn ich mir da so gut wie keine Hoffnungen mache.

        Nun, das scheint nicht zu klappen, ich habe:

        • das mod_auth_pam heruntergeladen,
        • installiert, die .so Datei existiert,
        • per LoadModule die .so Datei eingebunden,
        • Apache neu gestartet,
        • versucht einen Schutz zu definieren laut dem hier

        Bis dahin klappt auch alles, allerdings gibt mir der Apache bei einer entsprechenden .htaccess Datei (auch wenn um AuthPAM_Enabled on ergänzt) in der error.log zu lesen:

        (9)Bad file descriptor: Could not open password file: (null)

        Er erwartet also immer noch eine Datei von AuthUserFile, es scheint also, als ob sich mod_auth_pam nicht korrekt einklinken könnte um das zu deaktivieren. Eigentlich nicht verwunderlich, von 2.0 zu 2.2 haben sich sicherlich eine Hook-Names verändert oder so.

        Kurz um - es scheint also nicht zu funktionieren.

        MfG, Dennis.

        1. Moin!

          Nun, das scheint nicht zu klappen, ich habe:

          • das mod_auth_pam heruntergeladen,
          • installiert, die .so Datei existiert,
          • per LoadModule die .so Datei eingebunden,
          • Apache neu gestartet,
          • versucht einen Schutz zu definieren laut dem hier

          Es fehlt, dass du PAM konfiguriert hast.

          Apache greift als Service "httpd" auf PAM zu - das muß irgendwie dort in geordnete Bahnen geleitet werden. Steht in der Modul-Doku drin - eventuell aber nicht sonderlich verständlich.

          Bis dahin klappt auch alles, allerdings gibt mir der Apache bei einer entsprechenden .htaccess Datei (auch wenn um AuthPAM_Enabled on ergänzt) in der error.log zu lesen:

          (9)Bad file descriptor: Could not open password file: (null)

          Eine Beispiel-.htaccess ist beim Modul dabei. Was passiert bei der?

          - Sven Rautenberg

          --
          My sssignature, my preciousssss!
          1. Hi Sven,

            • per LoadModule die .so Datei eingebunden,

            Das habe ich übrigens so gemacht:

            LoadModule  auth_pam_module  libexec/mod_auth_pam.so

            Der Pfad stimmt schon, sonst würde Apache ja auch nicht starten bzw. eine Fehlermeldung ausgeben, aber das auth_pam_module hab ich mir mal aus den Fingern gesaugt, weil es ja auch auth_digest_module heißt usw. Keine Ahnung, ob das richtig ist.

            Es fehlt, dass du PAM konfiguriert hast.

            Apache greift als Service "httpd" auf PAM zu - das muß irgendwie dort in geordnete Bahnen geleitet werden. Steht in der Modul-Doku drin - eventuell aber nicht sonderlich verständlich.

            Nun, dazu hat das Programm mir bei der Installation eine Datei nach /etc/pam.d/ geschoben names "httpd" - die habe ich erst mal in "apache2" umbenannt, weil ich Apache mit --with-programm-name=apache2 kompiliert und installiert habe.

            Jetzt habe ich aber mal eine Kopie der Datei als "httpd" abgelegt, es existieren also beide Dateien.

            Dann nun mal die Beispiel .htaccess Datei verwendet, es kommt zu einer Benutzername-/Passwort-Abfrage im Browser, ich gebe etwas ein und bekomme danach einen Internal Server Error zu sehen, der error.log sagt dazu:

            [error] (9)Bad file descriptor: Could not open password file: (null)

            Also immer noch das gleiche wie vorher.

            MfG, Dennis.

            1. Hallo Dennis,

              [error] (9)Bad file descriptor: Could not open password file: (null)

              Aus irgend einem Grund will der open(NULL) machen (oder fopen(NULL)) - das kann natürlich nicht gehen. Warum der das machen will, weiß ich so auf Anhieb auch nicht, Du könntest aber mal den ganzen Apache stracen [1]. Das gibt natürlich ne Menge Ausgabe, deswegen würde ich

              strace -s 128 -o httpd.strace -ff BEFEHL

              wobei BEFEHL der Befehl zum Starten des Apaches ist. Das Produziert natürlich ne RIESEN-Menge an Ausgabe in die Dateien httpd.strace.* (und Du solltest den Apache sofort nach der Logmeldung wieder abschießen). Dann kannst Du mittels

              grep "Bad file descriptor: Could not open password file: (null)" httpd.strace.*

              herausfinden, in welcher Datei der Trace für den Prozess liegt, der den Fehler produziert hat, diese Datei angucken und kurz vor der Ausgabe dieser Meldung nach verdächtigen System-Calls Ausschau halten. Wenn Dir das alles nix sagt kannst Du ja mal die 100 Zeilen vor der Ausgabe dieses Fehlers in irgend einen Nopaste-Dienst kopieren und Dich hier nochmal melden - vielleicht kann hier jemand etwas mehr damit anfangen.

              Viele Grüße,
              Christian

              [1] strace zeichnet alle System Calls auf, die ein Befehl durchführt. -s 128 heißt, dass Strings erst nach 128 Zeichen gekürzt werden sollen, -o httpd.strace heißt, die Ausgabe soll in Dateien namnes httpd.strace.zahl gespeichert werden, -ff heißt, dass fork()-Aufrufen (d.h. Aufrufe, die neue Prozesse erzeugen) gefolgt werden soll und die Kindprozesse auch getracet werden sollen.

              1. Hi Christian,

                Aus irgend einem Grund will der open(NULL) machen (oder fopen(NULL)) - das kann natürlich nicht gehen.

                Meine Idee war ja, dass der Apache für AuthUserFile einfach NULL verwendet, sofern nichts anderes gesetzt ist.

                Ich habe gerade mal folgenden Test gemacht: Das LoadModule für mod_auth_pam auskommentiert und Apache neu gestartet. Bei der gleichen .htaccess Datei gibt es dann die gleiche Fehlermeldung.

                Warum der das machen will, weiß ich so auf Anhieb auch nicht, Du könntest aber mal den ganzen Apache stracen.

                Ok, ich habe es einfach mal getan - hier ist die Ausgabe von strace: http://nopaste.php-q.net/195319.
                Ich hoffe das reicht, das ist der Inhalt der Datei, in der grep die Fehlermeldung gefunden hat - selbige steht dort in Zeile 67.

                MfG, Dennis.

                1. Hallo Dennis,

                  Warum der das machen will, weiß ich so auf Anhieb auch nicht, Du könntest aber mal den ganzen Apache stracen.

                  Ok, ich habe es einfach mal getan - hier ist die Ausgabe von strace: http://nopaste.php-q.net/195319.
                  Ich hoffe das reicht, das ist der Inhalt der Datei, in der grep die Fehlermeldung gefunden hat - selbige steht dort in Zeile 67.

                  Hmm, er öffnet gar nicht erst ne Datei (versucht es gar nicht), sondern bricht gleich direkt nach dem Lesen der .htaccess ab. Nachdem strace() nur Systemaufrufe aufzeichnet, und kein richtiger Debugger ist, weiß ich auch nicht, was er anstellen will - aus der Ausgabe geht das leider nicht hervor. Sorry, ich bin da überfragt.

                  Viele Grüße,
                  Christian

                  1. Hi Christian,

                    Sorry, ich bin da überfragt.

                    Macht nichts, ich danke dir auf jeden Fall für dein Engagement! :-)

                    MfG, Dennis.

      2. Moin!

        Auch das unten von dir genannte Modul habe ich mir mal was näher angeschaut, eine Sache ist mir allerdings aufgefallen: Auch dieses Modul kommt nicht um die Problematik herum, dass /etc/shadow für nicht-roots nicht zu lesen ist! Hier wird einfach gesagt, dass man über die Gruppenzugehörigkeit dem Apache Lese-Rechte auf die Datei geben soll.

        Kann ich mir gar nicht vorstellen - aber in der FAQ wird davon tatsächlich gesprochen. Sollte aber nicht notwendig sein, wäre ansonsten ein herbes Problem mit dem Modul.

        - Sven Rautenberg

        --
        My sssignature, my preciousssss!