Daniel1: Apache2 gemischte Autorisierung File/LDAP

Hallo Zusammen,

Ich habe die Aufgabe die Autorisierung auf einem Apache 2 umzustellen.

Momentan läuft die Autorisierung über generierte User und Gruppen Files.

Zukünftig sollen User über LDAP authentifiziert werden und anschließend in einem Gruppen File nach der Berechtigung gesehen werden.

Die ganze Geschichte geschieht in .htacces Files.

Bestes Ergebnis dass ich bisher erzielen konnte war folgendes:

User gibt richtigen Benutzernamen + Passwort ein und ist in der Gruppe -> Zugang
User gibt richtigen Benutzernamen + Passwort ein ist aber _nicht_ in der Gruppe -> 'Internal Server Error'
User gibt falschen Benutzernamen ein (Passwort egal) -> 'Internal Server Error'

Ich kann die Fehler alle nachvollziehen, doch erstmal die  .htaccess-Datei:

AuthLDAPEnabled On
AuthLDAPURL ldap://XXXXX
AuthLDAPBindDN "XXXXX"
AuthLDAPBindPassword XXXXX
AuthLDAPAuthoritative Off

AuthUserFile /XXXX/user-leer (<- leeres Userfile )
AuthGroupFile /XXXXX/groups.new
AuthAuthoritative Off

AuthName "XXXXXX"
AuthType Basic
<Limit GET POST PUT>
require group Group1
</Limit>

Der 'Internal Server Error' kommt wohl daher, dass bei beiden Modulen 'Authoritative Off' angegeben ist und er dann am Ende, falls User+Gruppe nicht korrekt sind, an ein weiteres Modul weitergeben will welches aber nicht existiert.

Soweit so gut.

Da aber 'mod_auth' anscheinend eine höhere Priorität als 'mod_auth_ldap' hat ist es nicht möglich eines der Authoritativen auf On zu stellen.
(Die Reihenfolge in der wir die Module laden, hatte keinen Einfluss)

Würde ich 'AuthAuthoritative On' stellen, so würde man den User nicht im leeren Userfile finden und hier beenden.

Stelle ich 'AuthLDAPAuthoritative On', so kann er zwar den User identifizieren aber es wird nicht weiter auf die Gruppe im File geprüft - Allerdings wird geprüft ob er in der Gruppe im LDAP ist.

Ich denke wenn man die Reihenfolge ändern würde, zuerst soll im LDAP gesucht werden dann im File, könnt man AuthAuthoritative On stellen:

User wird im LDAP gesucht,
falls vorhanden wird nach der Gruppezugehörigkeit in LDAP gesucht.
Kein Erfolg -> nächstes Modul: mod_auth
Nun wird im Gruppenfile gesucht.

Sollte nichts matchen, ist die Authentifizierung fehlgeschlagen.

Nach meinen Recherchen könnte man die Reihenfolge durch 'AuthBasicProvider' bestimmen, dazu braucht man allerdings ein extra Modul 'mod_auth_basic' welches wir nicht haben.

Die .htaccess-Datei würde dann in etwa so aussehen:

AuthBasicProvider ldap file
AuthLDAPEnabled On
AuthLDAPURL ldap://XXXXX
AuthLDAPBindDN "XXXXX"
AuthLDAPBindPassword XXXXX
AuthLDAPAuthoritative Off

AuthUserFile /XXXXX/user-leer (<- leeres Userfile )
AuthGroupFile /XXXXX/groups.new
AuthAuthoritative On

AuthName "XXXXXX"
AuthType Basic
<Limit GET POST PUT>
require group Group1
</Limit>

Also folgende Fragen habe ich:

1. Ist meine Vermutung richtig, dass ein Tauschen der Reihenfolge zum gewünschten Ergebnis führt?

2. Stimmt es, dass ich das Module 'mod_auth_basic' brauche und anschließend das Kommando 'AuthBasicProvider ldap file' verwenden kann um die Reihenfolge zu ändern?

PS: Um dieses Modul zu implementieren würde das über mehrere Instanzen laufen, daher will ich zuerst sicher gehen.

Ich freue mich auf Antworten, Vielen Dank schonmal.

  1. Hallo!

    Nunja, Du willst - wenn ich es richtig verstanden habe - folgendes machen:

    1. Die Authentifizierung (AuthN, Überprüfung der Zugangsdaten eines Users) vollständig über LDAP erledigen.
    2. Die Autorisierung (AuthZ, Überprüfung, ob ein bekannter User einen bestimmten Inhalt sehen darf) vollständig über die AuthGroupFile erledigen.

    Zuerst einmal: Apache 2. Das ist leider etwas unspezifisch. Es gibt Apache 2.0 und Apache 2.2 - und in 2.2 hat sich *einiges* getan bezüglich Authentifizierung - wenn man nicht gerade eine stinknormale .htpasswd-Datei hat, dann sind .htaccess-Dateien zwischen 2.0 und 2.2 bezüglich Authentifizierung nicht kompatibel zueinander. In der nächsten Apache-Version nach 2.2 wird sich außerdem noch was bezüglich Autorisierung tun.

    Dann: Vergiss die "Authoritative"-Einstellung. Die ist absolut nicht das, was Du hier willst (auch wenn es einleuchtet, warum Du meinst, dass die die richtige wäre). Außerdem ist die Authoritative-Einstellung ein Relikt. Mit der Version nach Apache 2.2 wird die völlig überflüssig werden, für die Authentifizierung ist sie schon für Apache 2.2 überflüssig. Nur in Apache 2.0 braucht man sie noch für beides (in bestimmten Fällen).

    Wozu braucht man nun die Authoritative-Einstellung? Wenn man mehrere Module haben will, die das *gleiche* tun - zum Beispiel wenn Usernamen + Passwörter *sowohl* im LDAP *als auch* in einer Datei liegen.

    Wenn Du aber Authentifizierung nur mit Modul A und Autorisierung nur mit Modul B machen willst, brauchst Du die Authoritative-Einstellung nicht, weil das völlig verschiedene Schritte sind.

    Im folgenden habe ich folgendes Testsetup verwendet:

    * Gentoo Linux
     * OpenLDAP 2.3.41
     * Apache 2.0.63, kompiliert mit --enable-ldap --enable-auth-ldap --with-ldap
     * Apache 2.2.8, kompiliert mit --enable-ldap --enable-authnz-ldap --with-ldap

    Folgendes Beispiel-LDAP-Verzeichnis habe ich benutzt:

    dn: dc=example,dc=com
    objectClass: dcObject
    objectClass: organization
    dc: example
    o: Example

    dn: ou=Users,dc=example,dc=com
    objectClass: organizationalUnit
    ou: Users

    dn: uid=user1,ou=Users,dc=example,dc=com
    objectClass: person
    objectClass: uidObject
    uid: user1
    cn: User 1
    sn: User 1
    userPassword: {SSHA}XSiIEWlDogK5azxrjW4sqzfVFsaGGiLX

    dn: uid=user2,ou=Users,dc=example,dc=com
    objectClass: person
    objectClass: uidObject
    uid: user2
    cn: User 2
    sn: User 2
    userPassword: {SSHA}XSiIEWlDogK5azxrjW4sqzfVFsaGGiLX

    (Passwort ist in beiden Fällen 'test')

    Folgende .htgroups-Datei habe ich verwendet (in beiden Apache-Fällen):

    admins: user1

    Folgende .htaccess-Datei habe ich für den Apache 2.0 verwendet:

    AuthType Basic  
    AuthName "Test area"  
      
    AuthLDAPEnabled On  
    AuthLDAPUrl "ldap://localhost/dc=example,dc=com??sub?(objectClass=person)"  
    AuthLDAPRemoteUserIsDN Off  
      
    AuthGroupFile /pfad/.htgroups  
      
    require group admins
    

    Folgende .htaccess-Datei habe ich für den Apache 2.2 verwendet:

    AuthType Basic  
    AuthName "Test area"  
      
    AuthBasicProvider ldap  
      
    AuthLDAPUrl "ldap://localhost/dc=example,dc=com??sub?(objectClass=person)"  
    AuthLDAPRemoteUserIsDN Off  
      
    AuthGroupFile /pfad/.htgroups  
      
    require group admins
    

    Ich hoffe, ich konnte Dir damit weiterhelfen. Wenn nicht, frage nochmal nach.

    Viele Grüße,
    Christian