Nach Upgrade auf LMN 7.3: Klassenarbeitsmodus ist nicht funktional

Hallo zusammen,

nach dem Upgrade von LMN 7.2 auf LMN 7.3 haben wir folgendes Problem:
Beim Aktivieren des Klassenarbeitsmodus für eine beliebige Klasse erscheint bei jedem Schüler ein rotes Rechteck mit der Aufschrift

Im Moment ist es nicht möglich, das Verzeichnis für das Teilen im Home-Verzeichnis eines anderen Lehrers zu erstellen oder ihre Verwaltungsgruppen zu verwalten.

und die Namen der SuS sind verschwunden.

Aus der Fehlermeldung werde ich zwar nicht ganz schlau, vermute jedoch, dass hier irgendein Berechtigungsproblem vorliegt.

Die Homeverzeichnisse der Examusers werden zwar in /srv/samba/schools/default-school/examusers erstellt, allerdings können sich die SuS weder mit ihrem regulären Usernamen schueleruser, noch mit dem Examusernamen schueleruser-exam am Client anmelden.

Ein sophomorix-user -iu schueleruser | grep -i exammode gibt folgendes aus

           sophomorixExamMode: lehreruser

Über die WebUi kann der Klassenarbeitsmodus nicht mehr beendet werden. Das geht nur noch mit sophomorix-exam-mode --unset --participants schueleruser. Danach kann man sich wieder am Client mit dem Benutzer schueleruser anmelden.

Woran könnte das liegen?
@Arnaud: Wie kann ich das Problem sinnvoll debuggen?

Vielen Dank fürs Mitdenken und viele Grüße
Jürgen

Hallo Jürgen,

Ich kann das Problem bei mir nicht reproduzieren, da läuft alles, selbst mit Fileserver (DFS).

Eigentlich gab zwischen 7.2 und 7.3 kaum Änderung im KA-Modus, das sollte weiterhin funktionieren, außer Problem mit smbclient.

Am Start von einem KA-Modus werden die Ordner gelegt so, dass alles funktionieren kann, vielleicht liegt da ein Wurm.

Um es zu testen kannst du die Webui in Dev-Mode starten:

systemctl stop linuxmuster-webui.service
/opt/linuxmuster/bin/python3 /opt/linuxmuster/bin/ajenti-panel --dev --stock-plugins --plugins /usr/lib/linuxmuster-webui/plugins

Es gibt manchmal am Start Kompilierungsfehler oder SSL-Meldungen, das sollte nicht relevant sein. Was wichtig ist, ist was passiert nach dem Start von KA-Modus.

Gruß

Arnaud

Hallo Arnaud,

vielen Dank für den Tipp mit dem Dev-Mode. Nachdem ich mir die Ausgaben angeschaut habe, war relativ schnell klar, dass es nicht an der Webui liegt, wie Du ja auch schon vermutet hast.
Also ging die Suche weiter.

In den letzten Wochen habe ich mehrere Anläufe genommen, den Fehler zu finden und bin nun endlich der Ursache auf die Schliche gekommen.

Dazu muss ich aber ein wenig ausholen.

Problem

Erste Analyse der Ausgaben von

sophomorix-exam-mode -vvv --set --supervisor lehreruser --participants schueleruser

zeigten, dass kein neuer Benutzer schueleruser-exam angelegt werden konnten:

##################################################################################
# Creating examuser for user: schueleruser (start)                                    #
##################################################################################
...
ERROR in Sophomorix::SophomorixSambaAD::AD_examuser_create:
   0000202F: lib/ldb/ldb_key_value/ldb_kv_index.c:3065: Failed to re-index objectSid in CN=schueleruser-exam,OU=Examusers,OU=default-school,OU=SCHOOLS,DC=DOMAIN,DC=TLD - lib/ldb/ldb_key_value/ldb_kv_index.c:2910: unique index violation on objectSid in CN=schueleruser-exam,OU=Examusers,OU=default-school,OU=SCHOOLS,DC=DOMAIN,DC=TLD
...

Dieser Fehler tauchte beim Upgradevorgang bei der der Installation vom Paket linuxmuster-tools7 ebenfalls auf und zwar an der Stelle, wenn die Klassen auf die neuen Gruppen klassenname-parents und klassenname-students geprüft werden:

...
Checking students groups from schoolclass klassenname
{'msgtype': 105, 'msgid': 2, 'result': 19, 'desc': 'Constraint violation', 'ctrls': [], 'info': '0000202F: lib/ldb/ldb_key_value/ldb_kv_index.c:3065: Failed to re-index objectSid in CN=klassenname-parents,OU=klassenname,OU=Students,OU=default-school,OU=SCHOOLS,DC=DOMAIN,DC=TLD - lib/ldb/ldb_key_value/ldb_kv_index.c:2910: unique index violation on objectSid in CN=klassenname-parents,OU=klassenname,OU=Students,OU=default-school,OU=SCHOOLS,DC=DOMAIN,DC=TLD'}
...

Der gleiche Fehler tauchte bei uns auch schon einmal im September 2024 auf

und konnte damals nur durch das Zurückspielen eines Backups behoben werden.

Analyse

Komisch dabei war jedoch, dass wohl für einige der Klassen die neuen Gruppen angelegt werden konnten und ab irgendeiner Klasse eben nicht mehr.
Da ich mehrere Upgradeversuche mit unterschiedlichen Ausgangszuständen der LMN 7.2 unternommen habe, konnte ich die Constraint violation leider nicht auf eine bestimmte Klasse eingrenzen.

Bei der Recherche dieses Fehlers und dessen Ursache im Netz las ich immer wieder, dass die Constraint violation immer dann auftritt, wenn versucht wird, ein Objekt im AD mit einer objectSid anzulegen, die bereits an ein anderes Objekt im AD vergeben wurde. Da ich ein absoluter DAU bin, konnte ich mir darauf aber keinen Reim machen.

Wie um alles in der Welt kann ich herausfinden, welche objectSid des neu anzulegenden Objekts verwendet wird?

Dann stieß ich endlich auf ein Wiki, das nicht nur exakt das selbe Problem beschreibt, sondern auch die Lösung des Problems:
https://deepdoc.at/dokuwiki/doku.php?id=prebuilt_systems:ucs:failed_to_re-index_objectsid_sambadb

Jede objectSid (Object Security Identifier) ist wie folgt aufgebaut:

S-1-5-21-<DomainID>-<RID>

Die DomainID ist für alle objectSid gleich, die RID (Relative Identifier) ist eine fortlaufende Nummer. Mit dem Anlegen eines neuen AD-Objekts wird die RID jeweils um 1 inkrementiert. Somit wird sichergestellt, dass jede objectSid im AD eindeutig ist.
Damit das AD immer weiß, welche RID für das zuletzt im AD angelegte objectSid erfolgreich vergeben wurde, wird dieser Wert im RID Set des Domänen Controllers im Attribut rIDNextRID gespeichert und kann wie folgt abgefragt werden:

# ldbsearch -H /var/lib/samba/private/sam.ldb CN="RID Set" -b CN="SERVER,OU=Domain Controllers,DC=DOMAIN,DC=TLD" rIDNextRID
# record 1
dn: CN=RID Set,CN=SERVER,OU=Domain Controllers,DC=DOMAIN,DC=TLD
rIDNextRID: 15496
...

Bleibt nur noch zu überprüfen, ob die rIDNextRID mit der höchsten RID übereinstimmt, die an ein im AD existierenden Objekt vergeben wurde. Dazu lässt man sich alle objectSid im AD auflisten, filtert die RID heraus, sortiert diese numerisch nach der Größe und gibt nur die letzte RID aus:

# ldbsearch --cross-ncs -H /var/lib/samba/private/sam.ldb objectSid | grep objectSid | cut -d '-' -f8 | sort -n | tail -n 1
15496

Passt doch!
Aber warum kommt es dann trotzdem zu einer Constraint violation?

Um das zu verstehen, muss man folgendes wissen: Werden Objekte im AD gelöscht (z. B. beim Beenden einer Püfung in der Webui), werden diese nicht sofort restlos aus dem AD entfernt, sondern landen als sogenannte Tombstones im versteckten AD-Zweig „Gelöschte Objekte“. Durch Hinzufügen des Schalters --show-deleted in obigem ldbsearch-Kommando kann man sich zusätzlich die objectSid der gelöschten Objekte ausgeben lassen:

# ldbsearch --cross-ncs --show-deleted -H /var/lib/samba/private/sam.ldb objectSid | grep objectSid | cut -d '-' -f8 | sort -n | tail -n 1
15500

Hoppla! Offenbar gibt es in meinem Fall vier Objekte im AD, die eine größere RID haben als im Zähler rIDNextRID abgespeichert. Will man nun ein neues Objekt im AD anlegen, dann würde dieses die objectSid mit der RID 15497 bekommen. Weil im AD jedoch bereits ein Objekt mit genau dieser objectSid existiert, schlägt das Anlegen des neuen Objekts mit einer Constraint violation fehl.

Lösung

Um im AD wieder neue Objekte anlegen zu können, müssen wir die rIDNextRID im RID Set anpassen, und zwar auf die höchste im AD vorkommende RID, in diesem Fall auf die Nummer 15500. Dazu muss man das Attribut rIDNextRID im RID Set direkt in der Datei sam.ldb mittels ldbedit verändern (Editierung erfolgt mittels Editor vi).
Achtung: Mit ldbedit kann man sich unter Umständen das komplette AD zerschießen.
→ Vorher ein Backup der Datei /var/lib/samba/private/sam.ldb oder einen Snapshot erstellen. You have been warned!

  1. Samba-AD-DC Dienst stoppen:

    # systemctl stop samba-ad-dc.service
    
  2. RID Set editieren

    # ldbedit -H /var/lib/samba/private/sam.ldb CN="RID Set" -b CN="SERVER,OU=Domain Controllers,DC=DOMAIN,DC=TLD"
    
  3. Samba-AD-DC Dienst starten:

    # systemctl start samba-ad-dc.service
    

Et voilà! Das Anlegen von Prüfungen über die Webui ist wieder möglich.

Ursachenforschung

Bleibt noch die Frage zu klären, wie es überhaupt dazu kommen konnte, dass im AD Objekte existieren, die eine höhere RID haben, als im Attribut rIDNextRID des RID Set hinterlegt ist. Dazu ließ ich mir mit

# ldbsearch --cross-ncs --show-deleted -H /var/lib/samba/private/sam.ldb "(objectSid=$(net getdomainsid | cut -d ' ' -f6)-15497)" dn

den DN der kollidierenden Objekte ausgeben.

Diese Objekte stammten nachweislich von einem Upgrade-Versuch auf LMN 7.3, der in den Herbstferien stattfand. Neben dem AD als Primary-DC (server) läuft in unserem Netz noch ein zweiter Full DC (dc2). Aus irgendwelchen Gründen kam es wohl zu einem Replikationsfehler.

Eine mögliche Erklärung dafür ist, dass beim Zurückspielen eines Snapshots der server-VM versehentlich nicht berücksichtigt wurde, dass die dc2-VM auf gleichen Zeitpunkt zurückgesetzt werden muss. Dann nämlich repliziert dc2 seinen aktuelleren Stand Richtung server. Allerdings werden dabei nur die Objekte repliziert, die einen neueren Stand haben, als im Primary DC. Da das Attribut rIDNextRID des RID Set ausschließlich auf dem Primary DC existiert, wird der RID-Zähler mit dem Zurückspielen des Snapshots auf einen früheren Stand zurückgesetzt, der natürlich kleiner ist als die höchste im AD existierende RID.

Viele Grüße
Jürgen

4 „Gefällt mir“

Hallo Jürgen,

… was für eine Geschichte.
Ich hab das jetzt gelesen, wie damals die Hackergeschichten in der ct … so spannend war das.
Mein größten Respect für deine Ausdauer!

LG
Holger

Hammer!
Was eine Analyse :nerd_face:

Hallo Jürgen,

Danke für die vollständige Analyse :+1:
Es gibt 2 Sachen, die ich nicht ganz verstehe:

  • warum braucht ihr einen Full Sync zwischen beide DC ? Würde nicht eine Master → Slave Beziehung nicht ausreichen ? (und auch weniger Risiko haben)
  • was bedeutet „DAU“ ?

Gruß

Arnaud

Hallo Arnaud,

diese Frage kann ich dir leider nicht beantworten, das hat wohl historische Gründe. Aber ja, ich gebe Dir recht, ein RODC würde für den aktuellen Anwendungsfall absolut ausreichen und es ist bereits geplant, den Full DC gegen einen RODC auszutauschen.

DAU → siehe Wikipedia-Artikel :wink:

Viele Grüße
Jürgen

Ok, danke !

Hallo Jürgen,

der zweite beschreibbare AD-DC war damals mit der SAMBA Version 4.7.6 von Ubuntu 18.04 LTS die empfohlene Lösung. Zwar sollte ab SAMBA 4.7.6 RODC nicht mehr experimentell sondern secure sein, in der Praxis gab es aber immer wieder Probleme damit und ein Einsatz eines RODC wurde erst nach dem Upgrade auf lmn7.2 empfohlen Externer LDAP/AD Mirror lmn 7.x - #44 von Maurice

Viele Grüße
Thomas

Zweiter LDAP-Server als Backup und Entlastung - #12 von dorian Dorian hat das hier auch nochmal explizit festgenagelt, das RODC damals halt noch nicht ging.

Hallo zusammen,

nochmal was zum Thema RODC:

Das SAMBA-Projekt führt RODC weiterhin als offenes/weiterzuentwickelndes Feature im Roadmap-Bereich „Active Directory Server“. Roadmap - SambaWiki

In der Praxis heißt das:

RODC kann funktionieren (v.a. Branch-Office/“schlechte Physische Security”, wo man bewusst keinen RW-DC hinstellen will), aber für “wir wollen einfach Redundanz/Failover und Ruhe” ist ein zweiter vollwertiger RW-DC in Samba-land meistens die robustere, weniger „kantenreiche“ Wahl – genau weil manche Windows-RODC-Mechaniken in Samba bis heute nicht 1:1 so umgesetzt sind. Samba Security Documentation - SambaWiki

Viele Grüße

Thomas

Hallo nochmal um das Thema rund zu machen:

Ein SAMBA 4 RODC ist eben im Moment noch kein AD-Light den man mal eben mit dazu stopfen kann.

Ein Beispiel:

Client wählt einen DC (DC Locator / Site / DNS SRV / Caches). Mal landet der Client bei einem writable DC, mal bei einem RODC.
Passwort ändern (STRG+ALT+ENTF → Kennwort ändern) ist eigentlich ein Use-Case, der bei Windows-RODCs funktioniert, weil der RODC die Änderung an einen RW-DC weiterleiten (proxy) soll. Microsoft Learn
Samba-RODC macht dieses Proxying aber nicht: Samba lehnt Passwortänderungen am RODC schlicht ab („proxying behaviour is not implemented“). SambaWiki

Ergebnis in der Praxis:

Trifft der Client beim Kennwortwechsel einen RW-DC → klappt.
Trifft er einen Samba-RODC → schlägt fehl.
Aus Sicht der Anwender: „mal geht’s, mal nicht“ – abhängig davon, welcher DC gerade erwischt wird.

Ergebnis: IT direkt aus der Hölle

Wenn RODC, dann sollte man den auch als solchen betrachten und z.B. in die DMZ stopfen, wo er z.B. externe LDAP-Anfragen (Moodle, Webuntis etc.) bedient (sofern man hier nicht bereits andere IAM-Methoden einsetzt).

Ansonsten gilt nach wie vor die ausdrückliche Empfehlung des SAMBA-Projekts mindestens zwei ADDC Setting up Samba as an Active Directory Domain Controller - SambaWiki und nicht ADDC + RODC.

Viele Grüße
Thomas