Tispal
Lösungen / Tools / Active Directory Gruppen

Lösungen

Berechtigungskonzept und Active Directory Sicherheitsgruppen


Für den sachgerechten Einsatz der IT-Systeme ist zu gewährleisten, dass die für eine Stelle, eine Gruppe bzw. einen Mitarbieter definierten Kompetenzen nicht durch Benutzerberechtigungen erweitert werden können.

Ein Berechtigungskonzept muss die organisatorisch definierten Kompetenzen, Aufgaben und Funktionen berücksichtigen und gewährleisten, dass diese

  • umgesetzt
  • aber nicht umgangen
werden können.

In Unternehmensnetzwerken ist das Active Directory (AD) des Softwareherstellers Microsoft als Verzeichnis- und Berechtigungssystem sehr häufig im Einsatz. Der Kern des AD ist, dem Namen folgend, ein Verzeichnisdienst, mit dem umfangreiche Daten bzw. Informationen zu Resourcen und Benutzern verwaltet werden können.

Ein Verzeichnis wie das Active Directory hat für die Verwaltung der Daten bei dem produktiven Einsatz, wie eine relationale Datenbank bzw. als Verzeichnis entsprechend einer hierarchisch organisierten Datenbank, umfangreiche Funktionen, um den Zugriff auf die Daten zu überwachen und zu kontrollieren.

Für die Berechtigungsverwaltung im Active Directory ist als Grundlage die sichere Identifikation von Benutern und Resourcen unabdinkbar. Mit dem Kerberos- bzw. ehemalig NTLM-Anmeldedienst wird gewährleistet, dass die Verwaltung wie auch die Abfrage der Daten nur durch entsprechend authentifizierte und berechtigte Benutzer erfolgen kann.

Für die eigene Berechtigungsverwaltung wie auch für die Berechtigungsverwaltung von weiteren angebundenen Systemen (z. B. Exchange E-Mail-Server) nutzt das AD eine hierarchische Datenverwaltung für die

  • organisatorische Konfiguration von Benutzern und Benutzergruppen in Form von organistorischen Einheiten (OU, organisational unit) wie auch für die
  • Verwaltung von Zugriffsrechten von Benutzern auf definierte Resourcen (Drucker, Laufwerke etc.) in Form von hierarchisch ineinander geschachtelter Sicherheitsgruppen,
um möglichst übersichtlich und zeitsparend Berechtigungen und die hinterlegte Konfiguration zu verwalten. Während ein Mitarbeiter nur einer organisatorischen Einheit zugeordnet ist, können Benutzer und Resourcen Teil einer Vielzahl von Sicherheitsgruppen sein.

Eine beispielhafte Konfiguration von Sicherheitsgruppen ist in der nachfolgenden Abbildung dargestellt.

Active Directory Sicherheitsgruppen


Mit der dargestellten Konfiguration soll unter anderem

  • jeder Mitarbeiter, ggf. über verschiedene Zwischenstufen (geschachtelte Gruppen) Zugriff E-Mails (Gruppe: "Sec-Mail"),
  • nur die Mitarbeiter der Personalverwaltung in der Gruppe "Sec-HR" Zugriff auf sensible datenschutzrelevante Daten (Gruppe: "Sec-Dat-GDPR") und
  • die Mitarbeiter der IT (Gruppe: "Sec-IT") direkten Zugriff auf Kommunikationseinrichtungen
erhalten. Weitere Zugriffsmöglichkeiten sind mit der Abbildung dargestellt, die nicht im einzelnen detailliert werden sollen.

Grundlage der dargestellten Konfiguration der Sicherheitsgruppen ist das Berechtigungskonzept der Organisation. Bei einer Analyse bzw. Prüfung der Berechtigungen ist für jeden Mitarbeiter seine Gruppenmitgliedschaft zu berücksichtigen.

Da bei einer unabhängigen Kontrolle angestrebt wird unabhängig von der IT die Konfiguration der Sicherheitsgruppen zu analysieren, hat sich die Nutzung von Powershell mit dem Acitve Directory Service Interface (ADSI) als sinnvoll erwiesen.

Der ADSI-Service ist eine zentrale Komponente für den Zugriff auf das Active Directory. Die Powershell-Umgebung ist aktuell nahezu überall verfügbar. Für die Abfrage die hierarchisch konfigurierten Sicherheitsgruppen kann das nachfolgend dargestellte Powershell-Script verwendet werden.

Dokumentation:
,
#=#########################################
# Beschreibung der Ein- und Ausgabe.
# Eingabe:
#    In der Variable $usr (siehe beispielsweise:
#     $usr = "CN=Siegfried Thoma,OU=Revision,OU=Benu,OU=Orga," +
#                              "DC=TISPAL,DC=de";
#    ) ist der Name des Benutzerkontos, aber in Domänenschreib-
#    weise, d.h. als FQDN (FQDN: Fully Qualified Domain Name) 
#    anzugeben (siehe hierzu das obige Beispiel).
#    Im Code unten ist mit der Angabe von
#          $usr = whoami /fqdn
#    gewährleistet, dass immer der Name bzw. der FQDN des
#    aktuell angemeldeten Benuters ermittelt, angegeben und
#    analysiert wird.
#
# Ausgabe:
#    Im aktuellen Verzeichnis, in dem das Script gestartet wird
#    müssen Schreibrechte existieren. bei der Ausführung werden
#    die folgenden Dateien erstellt (yyMMdd_hhmmss:
#            yy: Jahr, 2-stellig,
#            MM: Monat, numerisch, zweistellig,
#            dd: Tag, numerisch, zweistelig,
#            hh: Stunde, zweistellig,
#            mm: Minute, zweistellig,
#            ss: Sekunde, zweistellig):
#       - Datei: "grpList_yyMMdd_hhmmss.txt"
#           Enthält alle über die Active Directory Hierarchie
#           konfigurierten Gruppen für das jeweilige
#           Benutzerkonto (CSV-Datei mit Name der Spalte
#           in der ersten Zeile)
#       - Datei: "grpListZirkelBez_yyMMdd_hhmmss.txt"
#           Enthält alle Zirkelbezüge in der 
#           Active Directory Gruppenhierarchie
#           für das jeweilige Benutzerkonto.
#     
#    Anmerkung:
#      Die Liste der Gruppen enthält nicht, d.h. NICHT, alle
#      Gruppen, die für ein Benutzerkonto mit dem Befehl
#          whoami /groups
#      oder
#          whoami /all
#      angezeigt werden, weil Active Directory für ein Benutzer-
#      konto auch Standardgruppen vorsieht, die nicht durch den
#      Administrator als Teil der Gruppenhierarchie konfiguriert
#      werden (z.B. die Gruppen Jeder/Everyone, Authentifizierte
#      Benutzer/Authenticated Users).
#
#=
$usr = whoami /fqdn;

#=#########################################
# Initialisierung
#=
if ( [ADSI]::Exists( "LDAP://$usr" ) ) 
  {
   $usrObj=[ADSI]"LDAP://$usr";

#=#########################################
# Leere bzw. vordefinierte Datenstrukturen
# bzw. Arrays definieren.
#=
   $grList = [System.Collections.ArrayList]::new()
   $grHash = @{}
   $grHashNPath = @{}

#=#########################################
# Aktuelles Datum mit Uhrzeit für Ausgabedateien
# ermitteln und Definition der Namen der
# Ausgabedateien. Ausgabedateien leeren
# bzw. löschen.
#=
   $d = ( Get-Date ).ToString( "yyMMdd_HHmmss" )
   $outFN = "grpList_$d.txt";
   if ( Test-Path $outFN ) { 
         remove-item $outFN; }
   write-output "Gruppe;Tiefe;Pfad" >> $outFN
   $outFNNestCycle = "grpListZirkelBez_$d.txt";
   if ( Test-Path $outFNNestCycle ) { 
         remove-item $outFNNestCycle; }

#=#########################################
# Direkt zugeordnete Sicherheitsgruppen
# sind im ersten Schritt für ein Benuterkonto
# zu ermitteln und in der Liste $grList zu 
# speichern. Die Liste $grList wird durch 
# Anhängen am Ende erweitert und für die 
# Analyse weiterer Sicherheitsgruppen 
# vom Start beginnend abgearbeitet.
#=
   $usrObj.memberof | foreach { 
      write-host "Start mit Gruppe $_, die direkt dem" `
                      " Benutzer zugeordnet ist."; 
      $cnt = $grList.Add( "$_" ); 
      $grHash["$_"] = 1; 
      $grHashNPath[$_] = "";
      }

#=#########################################
# Alle relevante Sicherheitsgruppen
# werden nun schrittweise und kontrolliert
# durch Abarbeiten aller Elemente der Liste $grList
# ermittelt.
#=
   $i = 0;
   while ( $i -lt $grList.count )
      {
#=#########################################
# Analyse einer weiteren Sicherheitsgruppe, 
# mit Ermittlung relevanter Werte (Tiefe 
# in der Gruppenhierarchie und dem Zuordnungspfad
# vom Benutzerkonto zur Gruppe).
#=
       $curGrp = $grList[ $i ];
       $curGrpDepth = $grHash[$curGrp];
       $curGrpNestPath = $grHashNPath[$curGrp];

#=#########################################
# Indirekt zugeordnete Sicherheitsgruppen,
# d. h. über die Gruppenhierarchie und den 
# Pfad vom Benutzerkonto, zugeordnete weitere
# Sicherheitsgruppen werden nun analysiert.
#=
       $grObj = [ADSI]"LDAP://$curGrp"; 
       $grObj.memberof | foreach { 
           $curPath = $curGrpNestPath + "|$curGrp";

#=#########################################
# Kontrolle auf Zirkel bzw. Zyklen.
# Wenn eine neue Gruppe schon im Pfad vom 
# Benutzerkonto zur aktuellen Gruppe enthalten ist, 
# ergibt sich ein Zirkelbezug. Für diesen Fall wird 
# die aktuelle Gruppe und der Pfad in eine separate 
# Datei geschrieben.
#=
           if ( $curPath.indexof( $_, 0, 
                     [System.StringComparison]::
                     CurrentCultureIgnoreCase ) -lt 0  )
             {

#=#########################################
# Mehrfach vorkommende Gruppen,
# die in unterschiedlichen Pfaden enthalten
# sind, sollen nicht erneut analysiert werden. Dies 
# hat zur Folge, dass zwar alle über die Gruppen-
# hierarchie konfigurierten Gruppen identifiziert 
# werden, aber zum Teil Pfade vom Benutzerkonto zur
# jeweiligen Gruppe abgeschnitten werden.
#=
              if ( -not ( $grHash.contains( "$_" ) ) ) 
                {

#=#########################################
# Aktualisierung der benutzten Datenstrukturen, 
# insbesondere des Pfads vom Benutzerkonto zur
# aktuellen Sicherheitsgruppe und Fortschreibung
# bzw. Erweiterung der Tiefe im Gruppenbaum.
#=
                 $grHash["$_"] = $curGrpDepth + 1;
                 $grHashNPath[$_] = $curGrpNestPath + `
                                     "|$curGrp";

#=#########################################
# Weitere identifizierte Gruppen
# werden der Liste mit den zu analysierenden
# Gruppen hinzugefügt. Damit wird gewährleistet, dass 
# auch rekursiv alle Gruppen bis zur vorgesehenen Anzahl 
# (siehe unten: Abbruchkriterium) analysiert werden.
#=
                 $cnt = $grList.Add( "$_" );
                 }
              }
           else
             {

#=#########################################
# Zirkelbezüge in der Gruppenhierarchie,
# die identifiziert werden, werden in die
# dafür vorgesehene Datei ausgegeben.
#=
              write-output ("Warnung: Zirkelbezug für " + `
                    "Gruppe $($_) mit Pfad bzw. Schleifen" + `
                    "bezug $($curGrpNestPath)|$($curGrp)") `
                    >> $outFNNestCycle;
              }
           };


#=#########################################
# Direkt bzw. indirekt zugeordnete Sicherheitsgruppen 
# werden in die dafür vorgesehene Datei ausgegeben.
#=
       write-output "$curGrp;$curGrpDepth;$curGrpNestPath" >> $outFN;

#=#########################################
# Der Zähler für die Auswahl von Sicherheitsgruppen
# wird fortgeschrieben.
#=
       ++$i;

#=#########################################
# Abbruchkriterium, 
# um eine Endlosausführung zu verhindern. Dieser
# Wert sollte je nach Größe der Organisation ange-
# passt werden. Er sollte größer wie die Anzahl der
# für ein Benutzerkonto zu erwartenden Gruppen sein.
#=
       if ( $i -gt 200 ) { break; }
       }
   }
else
  {
   write-host "Benutzer mit FQDN $usr nicht gefunden";
   }

Die erstellte Gruppenliste ist als CSV-Datei mit Spaltenüberschriften und dem Semikolon als Feldtrenner formatiert. Mit Excel ist die Datei einfach auszuwerten.

Die Nutzung von Powershell ermöglicht es einzelne Mitgliedschaften in Gruppen auszuwerten, um hierbei den Zugriff auf die verwalteten Resourcen zu analysieren.

Es gibt viele weitere Möglichkeiten (insbesondere für die Mitarbeiter der IT bzw. Serveradministration) die Mitgliedschaft in Acitve Directory Gruppen auszuwerten. Die beste Wahl bei einer Analyse ist mit den Verantwortlichen abzustimmen.