Disclaimer: Ich entschuldige mich bereits im Vorfeld für die Länge dieses Posts. Aber ich weiß nicht, an welcher der vielen Stellen es hakt …
Hallo Holger und alle anderen,
aaaahhhhh, dann habe ich das in der Tat falsch verstanden. Nein, bei uns ist ganz viel IT-Infrastruktur an die EDV des Rathauses ausgelagert, dort ist der Server gehostet und dort haben wir unseren Internet-Anschluss. Die haben in ihrem Router den Port aber schon freigeschaltet. Das erklärt, weswegen die Anfragen anscheinen auch am Server ankommen. Schade, das wäre eine einfache Problemquelle gewesen. Dann muss wohl jetzt eine detaillierte Beschreibung her. Aber vielleicht hilft sie anderen ja in Zukunft.
Ich bin der Anleitung hier gefolgt:
https://www.linuxmuster.net/wiki/anwenderwiki:moodle:moodle3_automatische_einschreibung?s[]=moodle&s[]=ldap
Einige optionale Aspekte erwähne ich jetzt hier nicht, wird eh schon viel zu viel …
Zur Erinnerung: Wir nutzen Moodle Version 3.1.13 (gehostet bei Belwü) und LMN 6.2.
Vorbereitung
Plugins
Die Plugins zur manuellen Einschreibung
und Einschreibung globaler Gruppen
sind aktiviert. Danach habe ich unter Website-Administration → Plugins → Authentifizierung → Übersicht
den LDAP-Server
aktiviert.
LDAP auf dem LMN-Server
Auf dem Server habe ich ldapsearch -x -H ldaps://localhost
ausgeführt und erhalte folgenden Beginn:
# extended LDIF
#
# LDAPv3
# base <dc=linuxmuster-net,dc=lokal> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# linuxmuster-net.lokal
dn: dc=linuxmuster-net,dc=lokal
objectClass: dcObject
objectClass: organization
o: linuxmuster
dc: linuxmuster-net
# accounts, linuxmuster-net.lokal
dn: ou=accounts,dc=linuxmuster-net,dc=lokal
objectClass: organizationalUnit
ou: accounts
# groups, linuxmuster-net.lokal
dn: ou=groups,dc=linuxmuster-net,dc=lokal
objectClass: organizationalUnit
ou: groups
# machines, linuxmuster-net.lokal
dn: ou=machines,dc=linuxmuster-net,dc=lokal
objectClass: organizationalUnit
ou: machines
Wenn ich das richtig sehe, muss bei mir also nicht wie im Tutorial dc=linuxmuster,dc=lokal
, sondern dc=linuxmuster-net,dc=lokal
heißen.
Gleichzeitig habe im Zusammenhang mit Nextcloud und LDAP im Wiki gelesen, dass man in der LDAP-Konfiguration auf dem LMN-Server noch die Verbindung zum anderen Server (hier dann nicht Nextcloud sondern Moodle) zulassen muss. Also habe ich in /etc/ldap/slapd.conf
im folgenden Abschnitt die IP des Moodle-Server ergänzt:
# Limits Access
access to attrs=sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaPwdMustChange,sambaAcctFlags,userPassword
by anonymous peername.ip=10.16.1.254 auth
by anonymous peername.ip=10.16.1.1 auth
by anonymous peername.ip=127.0.0.1 auth
by anonymous peername.ip=<öffentliche IP unseres Moodles bei Belwü> auth
by anonymous ssf=56 auth
by self peername.ip=127.0.0.1 write
by self ssf=56 write
by * none
LDAP-Authentifizierung
Zur Konfiguration der LDAP-Authentifizerung unter Website-Administration → Plugins → Authentifizierung → LDAP-Server
habe ich (außer dem Link oben) nichts mehr gefunden. Folgende Einstellungen habe ich vorgenommen:
LDAP-Server-Einstellungen
- Host URL:
ldaps://<öffentliche IP des Routers unserer EDV>/
- Version:
3
- TLS benutzen:
Nein
- LDAP-Codierung:
utf-8
Hier die erste Frage: Muss ich wirklich nur diese Einstellungen vornehmen? Ich habe auch irgendwo gelesen, dass ich unter Nutzersuche → Kontexte etwas (ou=accounts,dc=lokal,dc=linuxmuster-net,dc=de
?) ergänzen muss.
Datenzuordnung
- Vorname:
givenName
, Bei jedem Login
, Nie
, Bearbeitbar
- Nachname:
sn
, Bei jedem Login
, Nie
, Bearbeitbar
- E-Mail-Adresse:
mail
, Beim Anlegen
, Nie
, Bearbeitbar
- ID-Nummer:
uid
, Bei jedem Login
, Nie
, Gesperrt
OpenLML-Einschreibung
Dann habe ich das OpenLML-Plugin unter Website-Administration → Plugins → Einschreibung → Open LML Einschreibung
konfiguriert.
Allgemeine LDAP-Einstellungen
- Kontexte:
ou=groups,dc=linuxmuster-net,dc=lokal
- Object Class:
posixGroup
- Gruppenattribut:
cn
- Mitgliedsattribut:
memberuid
An den restlichen Standardeinstellungen habe ich meines Wissens hier nichts mehr verändert.
Tests und Fragen
Ich habe dann einfach mal ganz naiv versucht, mich als Lehrer einzuloggen – das klappte nicht.
Zuerst einmal ist mir das Zusammespiel zwischen dem Plugin der LDAP-Authentifizierung und dem OpenLML-Plugin nicht ganz klar und ich habe hierzu auch nicht so viel gefunden. Mir scheint es so, als wäre letzteres hauptsächlich dazu da, dass die Benutzer in die korrekten Gruppen eingeteilt werden, wobei die LDAP-Authentifizierung die grundsätzliche Erstellung der Accounts vornimmt. Stimmt das?
Ich habe dann mal mit aktivierten Debug-Mitteilungen (Website-Administration → Entwicklung → Debugging
) den Webcron via cron.php
gestartet. OpenLML erzeugt eine ganze Menge an Mitteilungen. Hier mal ein Ausschnitt:
Execute scheduled task: openlml enrolment sync (enrol_openlml\task\openlml_sync_task)
... started 11:28:05. Current memory use 3.3MB.
++ [ENROL OPENLML] sync_enrolments... started 11:28:05 ++
* line 206 of /enrol/openlml/lib.php: call to debugging()
* line 420 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->sync_enrolments()
* line 73 of /enrol/openlml/classes/task/openlml_sync_task.php: call to enrol_openlml_plugin->enrol_openlml_sync()
* line 75 of /lib/cronlib.php: call to enrol_openlml\task\openlml_sync_task->execute()
* line 81 of /admin/cron.php: call to cron_run()
++ [ENROL OPENLML] ldap_get_grouplist... started 11:28:05 ++
* line 493 of /enrol/openlml/lib.php: call to debugging()
* line 207 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->ldap_get_grouplist()
* line 420 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->sync_enrolments()
* line 73 of /enrol/openlml/classes/task/openlml_sync_task.php: call to enrol_openlml_plugin->enrol_openlml_sync()
* line 75 of /lib/cronlib.php: call to enrol_openlml\task\openlml_sync_task->execute()
* line 81 of /admin/cron.php: call to cron_run()
[…]
++ [ENROL OPENLML] ldap_get_group_members... ('lehrer1','lehrer2', … ) 11:28:05 ++
[…]
++ [ENROL OPENLML] ldap_get_group_members... ('schueler1','schueler2' …) 11:28:07 ++
[…]
Notice: Trying to get property of non-object in <moodle-server>/moodle/enrol/openlml/lib.php on line 1022
Notice: Trying to get property of non-object in <moodle-server>/moodle/enrol/openlml/lib.php on line 1022
Notice: Trying to get property of non-object in <moodle-server>/moodle/enrol/openlml/lib.php on line 1022
++ [ENROL OPENLML] teacher_add_category: data missing(userid:|firstname:|lastname:) ++
* line 1022 of /enrol/openlml/lib.php: call to debugging()
* line 301 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->teacher_add_category()
* line 420 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->sync_enrolments()
* line 73 of /enrol/openlml/classes/task/openlml_sync_task.php: call to enrol_openlml_plugin->enrol_openlml_sync()
* line 75 of /lib/cronlib.php: call to enrol_openlml\task\openlml_sync_task->execute()
* line 81 of /admin/cron.php: call to cron_run()
++ [ENROL OPENLML] autocreate teacher category failed: lehrer4 ++
* line 303 of /enrol/openlml/lib.php: call to debugging()
* line 420 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->sync_enrolments()
* line 73 of /enrol/openlml/classes/task/openlml_sync_task.php: call to enrol_openlml_plugin->enrol_openlml_sync()
* line 75 of /lib/cronlib.php: call to enrol_openlml\task\openlml_sync_task->execute()
* line 81 of /admin/cron.php: call to cron_run()
++ [ENROL OPENLML] sync_cohort_enrolments... started 11:28:07 ++
* line 366 of /enrol/openlml/lib.php: call to debugging()
* line 324 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->sync_cohort_enrolments()
* line 420 of /enrol/openlml/lib.php: call to enrol_openlml_plugin->sync_enrolments()
* line 73 of /enrol/openlml/classes/task/openlml_sync_task.php: call to enrol_openlml_plugin->enrol_openlml_sync()
* line 75 of /lib/cronlib.php: call to enrol_openlml\task\openlml_sync_task->execute()
* line 81 of /admin/cron.php: call to cron_run()
... used 67 dbqueries
... used 2.0387599468231 seconds
Scheduled task complete: openlml enrolment sync (enrol_openlml\task\openlml_sync_task)
Execute scheduled task: Alte Sessions bereinigen (core\task\session_cleanup_task)
... started 11:28:07. Current memory use 4.4MB.
... used 7 dbqueries
... used 0.027628898620605 seconds
Interessant und positiv ist, dass der Zugriff auf den LDAP-Server ja zu funktionieren scheint, die Accounts von Lehrern und auch die Zuteilung in Klassen wird korrekt angezeigt (hier anonymisiert). Aber auch danach kann ich mich nicht als lehrer1 etc. einloggen.
Ich habe dann mal unter Website-Administration → Server → Geplante Vorgänge
die Synchronisierung von LDAP-Nutzerkonten
aktiviert (ich weiß nicht, ob das nötig oder sinnvoll ist?). Hier erhalte ich bei der Ausführung der cron.php
immer folgende Fehlermeldung:
Execute scheduled task: Synchronisierung von LDAP-Nutzerkonten (auth_ldap\task\sync_task)
... started 11:50:55. Current memory use 3.5MB.
Verbindung zum LDAP-Server aufbauen...Temporäre Tabelle tmp_extuser erstellen
Warning: ldap_list(): Search: No such object in <moodle-server>/moodle/auth/ldap/auth.php on line 715
Kein Nutzerkonto über LDAP einlesbar! Fehler?
Fatal error: Uncaught exception 'coding_exception' with message 'Fehler in der Kodierung gefunden, den nur ein Programmierer korrigieren kann: A lock was created but not released at:
<moodle-server>/moodle/lib/classes/task/manager.php on line 483
Code should look like:
$factory = \core\lock\lock_config::get_lock_factory('type');
$lock = $factory->get_lock(Resource id #626);
$lock->release(); // Locks must ALWAYS be released like this.
' in <moodle-server>/moodle/lib/classes/lock/lock.php:117
Stack trace:
#0 [internal function]: core\lock\lock->__destruct()
#1 {main}
thrown in <moodle-server>/moodle/lib/classes/lock/lock.php on line 117
Ich bin für jede Hilfe dankbar, im Moment habe ich zig Fragezeichen und keine Ahnung, wo ich weitersuchen soll.
Liebe Grüße
Daniel