Apache mit Ldap Authentifizierung

german

#1

Hallo,
kurze Info über mich, ich bin Azubi (Informatiker für Systemintergration) im 2ten Lehrjahr und Arbeite für eine Berufsbildendeschule.
Soweit ist alles Fertig nur ich habe ein kleine Problem bzw Verständnisproblem.
Also:
Abgesehen von der Univention-Management-Console habe Ich vor, für Lehrer bestimmte Scripte auf einer Webseite zur Verfügung zu stellen (Klassen anlegen, Benutzername, Passwort reset etc…)(Nein UCS-schools kann wegen geringer Finanzmittel nicht geholt werden)
dies funktioniert auch alles :slight_smile:
Nur ich möchte, dass man sich bevor man auf die genannten Webseiten (alles in einem Ordner und dann in Unterordner) authentifiziert.
Ich habe natürlich schon im Forum nachgeschaut bzw gegoogelt.(wiki.univention.de/index.php?tit … o_the_LDAP) <- das gefunden.
Ich habe es hinbekommen, dass man sich Authentifizieren muss, aber er nimmt kein Passwort an -> error.log sagt mismatch passowort
Daraus schließe ich ,ich habe die Ldap falsch eingebunden, weil ich möchte eine Ldap Authentifizierung nur für die Gruppe “Lehrer”, sodass Schüler nicht diese Scripte ausführen können.

Es wäre sehr nett, wenn mir jemand weiter helfen könnte.
Mit freundlichen Grüßen
Marc


#2

Moin,

LDAP-Authentifizierung für gewisse URLs machen wir auch mit Apache gegen unser UCS. Das ist kein Hexenwerk.

Zu bedenken ist, dass man immer einen User im LDAP benötigt, mit dem sich der Apache am LDAP anmelden kann, um erst einmal den Account herauszusuchen, dessen Anmeldung überprüft werden soll. Das funktioniert in Summe grob so:

[ol][li]Apache sagt: »hier nur mit Authentifizierung!«[/li]
[li]Benutzer*in gibt Loginnamen und Passwort ein[/li]
[li]Apache verbindet sich zum LDAP-Server entweder anonym oder mit einem fest konfigurierten Account+Passwort.[/li]
[li]Apache durchsucht das LDAP nach einem Account mit dem Namen, der in Schritt 2 eingegeben wurde.[/li]
[li]Apache beendet die LDAP-Verbindung.[/li]
[li]Apache verbindet sich erneut zum LDAP und versucht dabei eine Anmeldung mit dem in Schritt 4 gefundenen Account und dem Passwort aus Schritt 2. Abhängig vom Ergebnis wird der Zugriff auf die URL erlaubt oder halt nicht.[/li][/ol]

Das Problem in Schritt 3 ist, dass ein UCS-LDAP standardmäßig keine anonymen Anmeldungen zulässt.

Also legen Sie einen Account im UCS nur dafür an. Bei uns heißt dieser User »ldapsearch«.

Anschließend konfigurieren Sie die Authentifizierung z.B. wie folgt (das ist für Apache 2.4.x und neuer; bei Apache 2.2.x sieht’s etwas anders aus):

AuthType Basic AuthBasicProvider ldap AuthName "LINET Services Interner Bereich" AuthLDAPURL "ldap://ldap.bs.linet-services.de:7389/cn=users,dc=bs,dc=linet-services,dc=de?uid?sub?(&(univentionFreeAttribute5=1)(objectClass=posixAccount))" NONE AuthLDAPBindDN "uid=ldapsearch,cn=users,dc=bs,dc=linet-services,dc=de" AuthLDAPBindPassword "SuperGeheim!NichtVerraten!" AuthLDAPBindAuthoritative Off Require valid-user

Sie müssen natürlich mehrere Dinge anpassen: die URL, die BindDN (das ist der Account, der extra zum Durchsuchen angelegt wurde) und das BindPassword.

Bei der URL-Zeile können Sie einen LDAP-Filter mit angeben. Das ist bei uns der Teil »(&(univentionFreeAttribute5=1)(objectClass=posixAccount))«, der sagt: »liefere mir nur Objekte aus dem LDAP, bei denen das Attribut univentionFreeAttribute5 auf 1 gesetzt ist und die eine objectClass von posixAccount haben«. Wir nutzen das »univentionFreeAttribute5« für eine manuelles Festlegen, welcher User sich überhaupt extern authentifizieren darf.

Jetzt zum schwierigen Teil: Gruppenmitgliedschaft. Leider wird in einem OpenLDAP die Gruppenmitgliedschaft nicht am User-Objekt, sondern am Gruppen-Objekt gespeichert. Das bedeutet, dass man nicht einfach einen LDAP-Filter nutzen kann, um zu sagen: »nur Accounts aus Gruppe XYZ«.

Aber auch dafür gibt es bei UCS eine Lösung: wir verbinden uns einfach nicht mit dem OpenLDAP auf Port 7389, sondern mit dem Samba4-LDAP auf Port 389. Warum hilft das? Weil in einem ActiveDirectory-LDAP-Schema die Gruppenmitgliedschaft genau an den User-Objekten gespeichert wird und damit über einen LDAP-Filter greifbar wird.

Hier ein Beispiel, wie die entsprechende Apache-Konfiguration aussehen könnte (Achtung: das ist jetzt nicht getestet):

AuthType Basic AuthBasicProvider ldap AuthName "LINET Services Interner Bereich" AuthLDAPURL "ldap://ldap.bs.linet-services.de:389/cn=users,dc=bs,dc=linet-services,dc=de?samAccountName?sub?(&(memberOf=CN=Lehrer,CN=Groups,DC=bs,DC=linet-services,DC=de)(objectClass=user))" NONE AuthLDAPBindDN "ldapsearch@bs.linet-services.de" AuthLDAPBindPassword "SuperGeheim!NichtVerraten!" AuthLDAPBindAuthoritative Off Require valid-user

Wichtige Änderungen gegenüber der OpenLDAP-Variante:

[ol][li]Die Portnummer ist 389 anstelle von 7389.[/li]
[li]Das ausuzwertende Attribut, in dem der Accountname steht, ist »samAccountName« anstelle von »uid«.[/li]
[li]Der Filter enthält zum Einen einen Eintrag für die Gruppe, zum Anderen ist die Objektlasse eine andere.[/li]
[li]Die BindDN hat eine andere Syntax: »username@domainname«. Sollte das nicht klappen, können Sie’s auch mit »domain\username« (bei uns »LINET\ldapsearch«) oder mit der DN des Objektes im Samba4-LDAP (bei uns: »cn=ldapsearch,cn=users,dc=bs,dc=linet-services,dc=de«) probieren.[/li][/ol]

Viel Erfolg.

Gruß,
mosu


#3

hey,
Danke für die schnelle Antwort, habe meine .htaccess so angepasst :

AuthType Basic
AuthBasicProvider ldap
AuthName "schulverwaltung"
AuthLDAPURL "ldap://ucs-unetz.ucsunterricht.bbsii:389/cn=users,dc=ucsunterricht,dc=bbsii?samAccountName?sub?(&(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii)(objectClass=user))" NONE
AuthLDAPGroupAttribute groups
AuthLDAPBindDN "ucsunterricht.bbsii\ucsadmin"
AuthLDAPBindPassword "XXXXXX"
AuthLDAPBindAuthoritative Off
Require valid-user

leider sagt mir der Error.log : user testuser not found: /ucs/bbsii/home/

habe ich iwo ein Fehler?
ucsadmin hat domain Rechte also er müsste zu 100% in die Domäne reinschaun können


#4

Auf welchen System sollen die Daten denn liegen? Sofern es sich um ein UCS-System handelt, kannst du die Authentifizierung auch via PAM erledigen. Dabei könntest du dich an der Konfiguration für Nagios orientieren.


#5

Huhu,

Führen Sie doch auf dem UCS DC Master mal folgenden Befehl aus:

univention-s4search '(&(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii)(objectClass=user)(samAccountName=testuser))'

Wird dabei ein Eintrag gefunden?

Falls nicht: dann bitte mal die etwas kleinere Variante:

univention-s4search 'samAccountName=testuser'

Bitte die Ausgabe beider Befehle hier pasten.

Ach ja:

AuthLDAPBindPassword "…"

Echte Passwörter sollten Sie nie in Foren pasten :slight_smile: Und jetzt sinnvollerweise auch gleich das Passwort vom ucsadmin bei Ihnen und in der .htaccess ändern.

Gruß,
mosu


#6

univention-s4search ‘(&(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii)(objectClass=user)(samAccountName=testuser))’
ergab:

# Referral
ref: ldap://ucsunterricht.bbsii/CN=Configuration,DC=ucsunterricht,DC=bbsii

# Referral
ref: ldap://ucsunterricht.bbsii/DC=DomainDnsZones,DC=ucsunterricht,DC=bbsii

# Referral
ref: ldap://ucsunterricht.bbsii/DC=ForestDnsZones,DC=ucsunterricht,DC=bbsii

# returned 3 records
# 0 entries
# 3 referrals

und

univention-s4search ‘samAccountName=testuser’:

# record 1
dn: CN=testuser,CN=Users,DC=ucsunterricht,DC=bbsii
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: testuser
sn: test
instanceType: 4
whenCreated: 20161011093131.0Z
whenChanged: 20161011093131.0Z
displayName: test
uSNCreated: 3919
name: testuser
objectGUID: b86db014-9cbc-413f-94b0-e3d51ce017d6
badPwdCount: 0
codePage: 0
countryCode: 0
badPasswordTime: 0
lastLogoff: 0
lastLogon: 0
primaryGroupID: 1115
objectSid: S-1-5-21-262270217-3285101087-2438229513-1118
accountExpires: 9223372036854775807
logonCount: 0
sAMAccountName: testuser
sAMAccountType: 805306368
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=ucsunterricht,DC=bbsii
userAccountControl: 512
userPrincipalName: testuser@UCSUNTERRICHT.BBSII
pwdLastSet: 131206518880000000
lockoutTime: 0
uSNChanged: 3921
distinguishedName: CN=testuser,CN=Users,DC=ucsunterricht,DC=bbsii

# Referral
ref: ldap://ucsunterricht.bbsii/CN=Configuration,DC=ucsunterricht,DC=bbsii

# Referral
ref: ldap://ucsunterricht.bbsii/DC=DomainDnsZones,DC=ucsunterricht,DC=bbsii

# Referral
ref: ldap://ucsunterricht.bbsii/DC=ForestDnsZones,DC=ucsunterricht,DC=bbsii

# returned 4 records
# 1 entries
# 3 referrals

ohja habs geändert. anfängerfehler :confused:


#7

testuser ist nicht in der Gruppe »Lehrer« :slight_smile:


#8

Guten morgen,

groups testuser
testuser : lehrer

sagt mir aber das der User nur in der Gruppe lehrer ist & auf der Weboberfläche steht es auch
wo könnte der Fehler noch liegen haben Sie noch eine Idee?
MfG
marc


#9

Moin,

Ist die ID der Gruppe »Lehrer« zufällig 1115? Falls ja, so ändern Sie den LDAP-Filter wie folgt:

(&(|(primaryGroupId=1115)(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii))(objectClass=user))

Warum? Weil die primäre Gruppe nicht zu einem »memberOf«-Eintrag führt, sondern nur die erweiterten Gruppen. Da »groups testuser« nur eine Gruppe zeigt, gehe ich also davon aus, dass »Lehrer« die primäre Gruppe ist.

Gruß,
mosu


#10

habe in Univention geschaut die ID der Gruppe lerher ist einemal 5074 und unter Windows 1115 wie Sie schon erwähnt haben:
.htaccess datei sie so aus:

AuthType Basic
AuthBasicProvider ldap
AuthName "schulverwaltung"
AuthLDAPURL "ldap://ucs-unetz.ucsunterricht.bbsii:389/cn=users,dc=ucsunterricht,dc=bbsii?samAccountName?sub?(&(|(primaryGroupId=1115)(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii))(objectClass=user))" NONE
AuthLDAPGroupAttribute groups
AuthLDAPBindDN "ucsunterricht.bbsii\ucsadmin"
AuthLDAPBindPassword "XXXXXXXXXXXXXXX"
AuthLDAPBindAuthoritative Off
Require valid-user

dennoch im Error.log

[client 172.18.0.33] user testuser not found: /ucs/bbsii/home/

ich verstehe den Sinn was Sie mir ganz Zeit zeigen aber wiederrum sehe ich keinen Fehler andem es liegen könnte :confused:


#11

Moin,

Es kann weiterhin gut sein, dass die LDAP-Suche vom Apache momentan nicht klappt, weil keine Verschlüsselung benutzt wird. Aber bevor wir uns das anschauen, müssen wir sicherstellen, dass alle anderen Parameter richtig sind. Daher bitte erst mal die folgenden Checks.

Was ergibt denn der folgende Aufruf?

ldapsearch -ZZ -H ldap://ucs-unetz.ucsunterricht.bbsii:389/ -b cn=users,dc=ucsunterricht,dc=bbsii -D 'ucsunterricht.bbsii\ucsadmin' -W '(&(|(primaryGroupId=1115)(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii))(objectClass=user))' dn

Dann das zum Account »ucsadmin« gehörende Passwort eintippen.

Sollte das »invalid credentials« liefern, so ist der Anmeldename falsch (ist der mit ziemlicher Sicherheit). Probieren Sie dann als nächstes diese leicht modifizierte Form (Anmeldename nur mit kurzer Domäne):

ldapsearch -ZZ -H ldap://ucs-unetz.ucsunterricht.bbsii:389/ -b cn=users,dc=ucsunterricht,dc=bbsii -D 'ucsunterricht\ucsadmin' -W '(&(|(primaryGroupId=1115)(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii))(objectClass=user))' dn

Gruß,
mosu


#12

habe ich getan und es kommt : Invalid credentials
meine Frage hat euer LDAPsearch bestimmte rechte?
Den unser ucsadmin ist in der Primären Gruppen Domain Admins.
Kann es sein das ihm noch Rechte fehlen wenn ja welche?

Ah bevor ich es vergesse, jetzt schon mal vielen Dank für Ihre hilfe!!


#13

Huhu,

Auch beim zweiten Befehl? Also mit »ucsunterricht\ucsadmin« als Anmeldename? Der Benutzer braucht definitiv keine speziellen Rechte, du musst nur seinen Domänen- und Accountnamen richtig angeben.

Gruß,
mosu


#14

nein beim 2ten kam diese ausgabe:

# extended LDIF
#
# LDAPv3
# base <cn=users,dc=ucsunterricht,dc=bbsii> with scope subtree
# filter: (&(|(primaryGroupId=1115)(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii))(objectClass=user))
# requesting: dn
#

# testuser, Users, ucsunterricht.bbsii
dn: CN=testuser,CN=Users,DC=ucsunterricht,DC=bbsii

# search result
search: 3
result: 0 Success

# numResponses: 2
# numEntries: 1


#15

Moin,

OK, dann ist zumindest die BindDN in Ihrer .htaccess von oben falsch. Ändern Sie diese also wie folgt:

AuthLDAPBindDN "ucsunterricht\ucsadmin"

Dann probieren Sie’s erneut.

Falls es weiterhin nicht klappt, kann es gut an (fehlernder) Verschlüsselung in der Kommunikation liegen. Welche Apache-Version setzen Sie ein? 2.4.x oder noch 2.2.x?

Gruß,
mosu


#16

habe es geändert geht immer noch nicht.
aso weder der 1 Befehl bzw habe es mal mit ‘@’ versucht geht auch nicht
Auf meinem Server läuft Apache/2.2.22


#17

Hey,

OK, dann testen wir als nächstes, ob es was ändert, wenn der Zwang zur Verschlüsselung ausgeschaltet wird. Dazu bitte auf dem UCS DC Master folgendes ausführen:

ucr set samba/ldap/server/require/strong/auth=no service samba restart

Anschließend bitte auf dem Server, auf dem der Apache läuft, den folgenden Befehl testen:

ldapsearch -H ldap://ucs-unetz.ucsunterricht.bbsii:389/ -b cn=users,dc=ucsunterricht,dc=bbsii -D 'ucsunterricht\ucsadmin' -W '(&(|(primaryGroupId=1115)(memberOf=CN=lehrer,CN=Groups,DC=ucsunterricht,DC=bbsii))(objectClass=user))' dn

Falls der Befehl wieder den Eintrag für »testuser« liefert, so als nächstes wieder die Authentifizierung am Apache testen.

Gruß,
mosu


#18

Leider immer noch keine Veräanderung :confused:
mit auf dem Apache testen meinten Sie im Browser?


#19

Moin,

jo. Wenn’s weiterhin nicht klappt, dann wird’s mit Hilfe aus der Ferne echt schwierig. Es wird nur irgend eine Kleinigkeit sein, aber das ist halt für mich extrem schwer zu beurteilen, ohne es selbst mal ausprobieren zu können.

Sie könnten evtl. noch mal mit tcpdump den LDAP-Verkehr mitschneiden und dann in Wireshark genau schauen, was dort passiert. Klappt die initiale Authentifizierung vom Apache? Was genau wird also Suche geschickt? Was kommt als Ergebnis? etc.

Gruß,
mosu


#20

also mit Htpasswd funktioniert alles wie es soll, nur ist das ja schlecht wenn mal ein pw geändert wird,dafür möchte ich ja die Ldap verwenden.
ja ich denke auch das es nur eine Kleinigkeit ist, aber dafür fehlt mir noch die Erfahrung