Tags:
create new tag
, view all tags

Export von Ngroups nach AD, LDAPS und NETng

Verschachtelte vs. flache Gruppen

Exchange - Gruppen

Exchange-Gruppen können verschachtelt werden. Sie sind sozusagen ein 1:1 Abbild der Ngroups mit der Ausnahme, dass (zur Zeit mindestens) nur Mitglieder in den Gruppen vorhanden sind, die auch einen Mailbox-Account aufweisen.

Posix-Gruppen auf LDAPS

Die nach LDAPS exportierten Gruppen sind von der objectClass=posixGroup. Sie enthalten das Attribut memberUID, welches eine Liste aller nethz-Usernamen enthält, die in dieser Gruppe als Member registriert sind. Das bedeutet, die Gruppen sind flach (im Gegensatz zu Exchange-Gruppen). Es gibt keine Möglichkeit der Verschachtelung, Posix-Gruppen können keine weiteren Gruppen enthalten.

OU-Attribut auf LDAPS

Das OU-Attribut auf den Userobjekten im LDAPS stellt auch eine Gruppen-Mitgliedschaft dar. Die Mitglieder einer Gruppe sind nicht direkt ersichtlich, sie müssen «errechnet» werden. OpenLDAP (wie auch das Active Directory) bietet allerdings die Möglichkeit, sog. dynamische Gruppen zu erstellen, welche eine LDAP-Filterregel enthalten. Diese Art von Gruppen sind sehr sinnvoll, da es viele Ressourcen einspart.

NETng - Realms

Realms stellen ebenfalls flache Gruppen dar.

Flache Gruppen synchronisieren

Die grosse Herausforderung besteht nun, Hierarchisch strukturierte Gruppen in flache überzuführen, und diese bei Änderungen möglichst schnell zu synchronisieren. Wir betrachten im Folgenden die einzelnen Operationen, die bei Ngroups möglich sind.

Hinzufügen von Mitgliedern zu einer Gruppe

Jedes einzelne neue Mitglied wird in einer Zwischentabelle gespeichert. Danach werden alle hierarchisch darüberliegenden Gruppen betrachtet, ob sie als flache Gruppe exportiert werden. Für jedes neue Mitglied wird geprüft, ob es bereits schon vor dem Insert in einer solchen Gruppe war oder nicht. Falls nicht, wird es hinzugefügt.

Löschen von Mitgliedern von einer Gruppe

Jedes einzelne zu Löschende Mitglied wird in einer Zwischentabelle gespeichert. Danach werden diese und alle hierarchisch darüberliegenden Gruppen betrachtet, ob sie als flache Gruppe exportiert werden. Für jedes gelöschte Mitglied wird geprüft, ob es nachher immer noch in einer solchen Gruppe ist oder nicht. Falls nicht, wird es als «zu löschen» markiert.

HInzufügen von Untergruppen

Alle Mitglieder der neuen Untergruppe werden in einer Zwischentabelle gespeichert. Danach werden alle hierarchisch darüberliegenden Gruppen betrachtet, ob sie als flache Gruppe exportiert werden. Für jedes neue Mitglied wird geprüft, ob es bereits schon vor dem Insert in einer solchen Gruppe war oder nicht. Falls nicht, wird es hinzugefügt.

Löschen von Untergruppen

Alle Mitglieder der zu löschenden Untergruppe werden in einer Zwischentabelle gespeichert. Danach werden alle hierarchisch darüberliegenden Gruppen betrachtet, ob sie als flache Gruppe exportiert werden. Für jedes zu löschende Mitglied wird geprüft, ob es nachher immer noch in einer solchen Gruppe ist oder nicht. Falls nicht, wird es als «zu löschen» markiert.

Hinzufügen von Gruppen

Wenn diese Gruppe als flache Gruppe exportiert werden soll: Hinzufügen.

Aktualisieren von Gruppen

Wenn diese Gruppe neu als flache Gruppe exportiert werden soll: Gruppe hinzufügen, alle Mitglieder (auch in Untergruppen) auflisten und als Mitglieder hinzufügen.

Wenn diese Gruppe nicht mehr als flache Gruppe exportiert werden soll: Gruppe löschen, alle Mitglieder (auch in Untergruppen) auflisten und als «zu löschen» markieren.

Löschen von Gruppen

Weil wir kein «cascading delete» haben, müssen wir bei dieser Operation lediglich die Gruppe als «zu löschen» markieren.

Allgemeines

Die NGROUPs sind im Wesentlichen in den folgenden Tabellen definiert:

  • NGROUP (die Gruppe selbst)
  • NGROUP_INCLUDES (Hierarchie, Untergruppen)
  • NGROUP_MEMBER (Gruppenmitglieder)

Die Tabellen NGROUP_INCLUDES und NGROUP_MEMBER haben Fremdschlüssel von NGROUP. Es wurde auf sog. cascading delete bei Fremdschlüsseln verzichtet, weil wir bei diesen Tabellen eine Menge Trigger haben und diese cascading delete sich eigentlich wie Trigger verhalten. Das schlechte daran ist vor allem, dass bei einem Trigger-Fehler unter Umständen nicht mehr nachvollzogen werden kann, was die Fehlerursache war. In der Fehlerkette tauchen die cascading deletes nämlich nicht auf!

Änderungen an der Gruppe, den Gruppenmitgliedern und den Untergruppen müssen in die Zielsysteme AD, LDAPS und NETng synchronisiert werden. Dies geschieht über verschiedene Zwischentabellen, welche dann von weiteren Prozessen (z.B. in Form von Cronjobs) abgearbeitet werden:

  • UPDATE_EXCHANGE_GROUP aktualisiert die Gruppen im Active Directory (AD)
  • UPDATE_GROUP aktualisiert die Posix-Gruppen auf LDAPS
  • UPDATE_NGROUP und UPDATE_NGROUP_MEMBER synchronsieren die Gruppen für NETng
  • UPDATE_NETNG_MEMBER_CHECK ist eine Hilfstabelle zur Synchronisation der Gruppen nach NETng

  • SYNC_NGROUP_TO_EXCHANGE
  • SYNC_NGROUP_TO_LDAPS
  • SYNC_NGROUP_MEMBERS_TO_LDAPS
  • SYNC_NGROUP_TO_NETNG
  • SYNC_NGROUP_MEMBERS_TO_NETNG
Alle diese Tabellen enthalten die folgenden Felder:

  • GRID (ID der Ngroup)
  • ZEITSTEMPEL (Zeitpunkt der Änderung)
  • GROUP_INSERT (Flag, ob Gruppe neu hinzugefügt wurde)
  • GROUP_UPDATE (Flag, ob Gruppe aktualisiert wurde)
  • GROUP_DELETE (Flag, ob Gruppe gelöscht wurde)
  • MEMBERS_CHANGED (Flag, ob Mitglieder geändert wurden, nur bei SYNC_NGROUP_TO_EXCHANGE)

Die Änderungen an den NGROUP-Tabelen selbst werden von diversen Triggern registriert. Diese Trigger werden in den folgenden Abschnitten beschrieben.

Trigger auf NGROUP-Tabellen

Trigger sollten grundsätzlich
  • möglichst keine Logik beinhalten
  • möglichst schnell ablaufen
  • für jedes einzelne DML-Ereignis erstellt werden

Die Logik selber soll in eine eigene stored procedure verpackt werden. Bei den Ngroups-Triggern werden Datensatzänderungen zunächst in Hilfstabellen geschrieben. Anschliessend (nach Abschluss des DML-Statements) werden diese Hilfstabellen von einer stored procedure abgearbeitet. Sollte dies zuviel Zeit in Anspruch nehmen, kann diese stored procedure wahlweise auch durch einen DBMS-Job (eine Art cronjob unter Oracle) angestossen werden.

NGROUP - Trigger

  • NGROUP_INS_BEF weist jeder neuen Ngroup eine eindeutige GID zu, sofern diese nicht bereits definiert ist
  • NGROUP_INS_AFT schreibt Datensätze in die Tabellen SYNC_NGROUP_TO_EXCHANGE, SYNC_NGROUP_TO_LDAPS und SYNC_NGROUP_TO_NETNG (sofern ein entsprechendes =EXPORT_=* - Flag gesetzt worden ist)
  • NGROUP_UP_AFT
    • schreibt in diesselben Tabellen wie NGROUP_INS_AFT
    • falls die Gruppe selbst geändert wurde (Name, Beschreibung) dann wird das Flag GROUP_UPDATE gesetzt
    • falls eines der EXPORT_* - Flags geändert wurde, werden die GROUP_INSERT und GROUP_DELETE - Flags der Synchronisationstabellen entsprechend gesetzt
    • prüft alle darüberliegenden Gruppen, ob sie nach LDAPS oder NETng exportiert werden
  • NGROUP_DEL_AFT
    • schreibt in diesselben Tabellen wie NGROUP_INS_AFT
    • setzt das Flag GROUP_DELETE auf 1, sofern entsprechende =EXPORT_=* - Flags vorhanden waren
    • prüft alle darüberliegenden Gruppen, ob sie nach LDAPS oder NETng exportiert werden
    • falls dem so ist, müssen die Mitglieder der betroffenen Gruppen neu «errechnet» werden.

NGROUP_MEMBER - Trigger

  • NGROUP_MEMBER_INS_AFT schreibt neue Datensätze in SYNC_NGROUP_MEMBERS_TMP
  • NGROUP_MEMBER_INS_AFT_STMT ruft die Prozedur SYNC_NGROUP_MEMBERS auf
  • NGROUP_MEMBER_DEL_AFT schreibt gelöschte Datensätze in SYNC_NGROUP_MEMBERS_TMP
  • NGROUP_MEMBER_DEL_AFT_STMT ruft die Prozedur SYNC_NGROUP_MEMBERS auf

NGROUP_INCLUDES - Trigger

  • NGROUP_INCLUDES_INS_AFT schreibt neue Datensätze in SYNC_NGROUP_INCLUDES_TMP
  • NGROUP_INCLUDES_INS_AFT_STMT ruft die Prozedur SYNC_NGROUP_INCLUDES auf
  • NGROUP_INCLUDES_DEL_AFT schreibt gelöschte Datensätze in SYNC_NGROUP_INCLUDES_TMP
  • NGROUP_INCLUDES_DEL_AFT_STMT ruft die Prozedur SYNC_NGROUP_INCLUDES auf

Die Procedure SYNC_NGROUP_MEMBERS

  • Mutationen an NGROUP_MEMBER werden in die Temporärtabelle SYNC_NGROUP_MEMBERS_TMP geschrieben
  • nach der Mutation wird durch die Trigger NGROUP_MEMBER_INS/DEL_AFT_STMT die Procedure SYNC_NGROUP_MEMBERS gestartet
  • SYNC_NGROUP_MEMBERS arbeitet die Tabelle SYNC_NGROUP_MEMBERS_TMP ab
  • DELETE
    • prüfen ob User immer noch Mitglied dieser Gruppe ist
    • ev. in anderer Rolle oder via Untergruppe
    • falls LDAPS-Export: Eintrag in SYNC_NGROUP_MEMBERS_TO_LDAPS
    • falls NETNG/Realm-Export: Eintrag in UPDATE_NGROUP_MEMBER
  • INSERT
    • prüfen, ob User vorher bereits Mitglied dieser Gruppe war
    • ev. via Untergruppe
    • dazu wird der Zeitstempel verwendet
    • falls LDAPS-Export: Eintrag in SYNC_NGROUP_MEMBERS_TO_LDAPS
    • falls NETNG/Realm-Export: Eintrag in UPDATE_NGROUP_MEMBER

-- SwenVermeul - 2010-03-10

Topic revision: r6 - 2010-03-10 - vermeul
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback