Windows-AD temporäre Gruppenmitgliedschaft

Seit Windows Server 2016 gibt es das optionale Feature “Privileged Access Management” (PAM). Dieses erlaubt AD-Administratoren, Benutzer für einen vorher festgelegten Zeitraum einer Gruppe hinzuzufügen. Das kann beispielsweise nützlich sein, um einem externen Berater zeitbegrenzt Berechtigungen zu geben, die automatisch nach Ablauf der vorgegebenen Zeit entzogen werden.

Vorraussetzung für die Nutzung der temporären Gruppenmitgliedschaften ist eine Gesamtstrukturfunktionsebene und das Domain Level von 2016 sowie die Aktivierung des o.g. Features PAM. Ob die Gesamtstrukturfunktionsebene und das Domain Level bereits auf 2016 angehoben sind, kann man mit folgendem Befehlen prüfen:

(Get-ADForest).ForestMode
(Get-ADForest).DomainMode

Mit dem folgenden Codeschnipsel kann PAM aktiviert werden. Die Aktivierung ist allerdings nicht reversibel. Einmal aktiviert, lässt sich das PAM-Feature nicht mehr abschalten.

If((Get-ADOptionalFeature -Identity 'Privileged Access Management Feature').EnabledScopes.Count -eq 0){
    Write-Host "Privileged Access Management ist nicht aktiviert und wird nun aktiviert."
    Enable-ADOptionalFeature "Privileged Access Management Feature" -Scope ForestConfigurationSet -Target mydomain.tld
} else {
    Write-Host "Privileged Access Management ist bereits aktiviert."
}

Nun, da PAM aktiviert ist, können wir mit der eigentlichen Vorbereitung beginnen. Zuerst müssen wir eine Zeitspanne bestimmen, für wie lange der Benutzer Mitglied der Zielgruppe sein soll. Dabei können auch Zeiten in der Zukunft angegeben werden. Das kann nützlich sein, wenn man weiß, dass man bspw. für den gesamten November einen Berater im Haus hat, der entsprechende Berechtigungen benötigen wird:

# Bis Heute um 18 Uhr
$ttl = New-TimeSpan -End '18:00:00'

# Für 8 Stunden
$ttl = New-TimeSpan -Hours 8

# Bis zum 31.10.2023 um 00:00 Uhr
$ttl = New-TimeSpan -End '31.10.2023'

# Den gesamten November lang
$ttl = New-TimeSpan -Start '01.11.2023' -End '01.12.2023'

Jetzt können wir den Benutzer MustermannM zur Gruppe Domain-Admins hinzufügen. Die Gruppenmitgliedschaft wird ihm nach Ablauf der vorher definierten Zeitspanne automatisch entzogen:

Get-ADGroup 'Domain-Admins' | Add-ADGroupMember -Members 'Max-Mustermann' -MemberTimeToLive $ttl

Mit folgendem Befehl kann man die zeitbegrenzten Gruppenmitgliedschaften anzeigen und somit überprüfen, ob die vorherigen Schritte auch funktioniert haben:

Get-ADGroup 'Domain-Admins' -Properties Member -ShowMemberTimeToLive

Last but not least: Die Angabe bei TTL ist in Sekunden, muss also ggf. zur besseren Lesbarkeit noch umgerechnet werden.

Ganze Codeblöcke in der PowerShell ISE ein- und auskommentieren

Wenn man umfangreichere Skripte in der Powershell ISE erstellt, kann es z.B. zur Fehlerbehebung hilfreich sein, ganze Blöcke aus zu kommentieren. Das ist unter anderem möglich, indem man vor den aus zu kommentierenden Teil “<#” schreibt und dahinter den Kommentarblock mit einem “#>” beendet.

Auskommentieren mittels “<#” und “#>”

Noch einfacher geht es aber, wenn den Cursor an den Anfang der ersten zu kommentierenden Zeile bewegt und dann mit “ALT+SHIFT und Pfeiltasten hoch/runter” alle Zeilen auswählt. Ob eine Zeile ausgewählt ist oder nicht, erkennt man an einem dünnen Strich zwischen Zeilennummerierung und Codebeginn. Um die ausgewählten Zeilen letztendlich aus zu kommentieren muss man nur noch auf das Kommentarzeichen “#” drücken. Das funktioniert übrigens für jedes Zeichen, nicht nur für “#”. Um die Kommentarzeichen wieder alle auf einmal zu entfernen, wiederholt man die Schritte einfach und drückt am Ende statt auf “#” auf “ENTF“.

Die betreffenden Zeilen 7-9 wurden mittels “ALT+SHIFT und Pfeiltasten hoch/runter” markiert
Mit der “#”-Taste wurden alle Zeilen auf einen Schlag auskommentiert

Ausführungsrichtlinien

Mithilfe von Ausführungsrichtlinien können Administratoren die Ausführung von PowerShell Scripten einschränken. Einzelne Befehle sind hiervon jedoch nicht betroffen und können unabhängig von der Konfiguration der Ausführungsrichtlinie ausgeführt werden. Die Konfiguration der Ausführungsrichtlinie kann nützlich sein, um Nutzer vor der Ausführung von nicht vertrauenswürdigem Code zu schützen. Insgesamt gibt es fünf verschiedene Konfigurationen:

  • Restricted: Dies ist die Standardeinstellung für frisch installierte Windowsclients. Diese Einstellung bewirkt, dass KEIN PowerShell Script ausgeführt werden kann.
  • AllSigned: Nur Scripte mit einem signierten Zertifikat können ausgeführt werden. Diese Einstellung gilt auch für lokale Scripte. Wenn ein bisher unbekanntes Zertifikat für die Signierung benutzt wird, muss man die Ausführung gesondert bestätigen.
  • RemoteSigned: Scripte aus dem Internet oder auf UNC-Pfaden müssen signiert sein, sofern diese nicht mit dem Befehl “Unblock-File” entsperrt werden. Lokale Scripte können unabhängig von ihrer Signierung ausgeführt werden. Dies ist die Standardeinstellung für Windows Server.
  • Unrestricted: Deaktivierung aller Beschränkungen. Alle Scripte können ausgeführt werden. Wenn ein Script aus dem Internet ausgeführt wird, muss die Ausführung bestätigt werden.
  • Bypass: Ähnlich wie “Unrestricted”, jedoch werden auch Scripte aus dem Internet ohne Rückfrage ausgeführt.
  • Undefined: Die aktuell zugewiesene Richtlinie wird entfernt.

Die Ausführungsrichtlinien können unabhängig voneinander für verschiedene Bereiche konfiguriert werden. ACHTUNG: Dies kann zur Folge haben, dass die EFFEKTIVE Ausführungsrichtlinie unverändert bleibt, da die Bereiche ihre Konfiguration vererben können!:

  • MachinePolicy: Die Ausführungsrichtlinie wird per GPO gesetzt und gilt für alle Benutzer.
  • UserPolicy: Die Ausführungsrichtlinie wird per GPO gesetzt und gilt für den aktuellen Benutzer.
  • Process: Die Ausführungsrichtlinie gilt nur für die aktuelle PowerShell Sitzung. Diese Einstellung wird nicht in der Registrierung gespeichert, sondern in der Variable $env:PSExecutionPolicyPreference gespeichert. Sobald die aktuelle PowerShell Sitzung beendet wird, werden Variable und Wert gelöscht.
  • CurrentUser: Die Ausführungsrichtlinie gilt wie die UserPolicy nur für den aktuellen Nutzer. Die Einstellung wird in der Registrierung unterhalb von HKEY_CURRENT_USER gespeichert.
  • LocalMachine: Die Ausführungsrichtlinie gilt wie die MachinePolicy für alle Benutzer des Systems. Die Einstellung wird in der Registrierung unterhalb von HKEY_LOCAL_MACHINE gespeichert.

Beispiele

Folgendermaßen kann die Ausführungsrichtlinie ausgelesen und konfiguriert werden:

Get-ExecutionPolicy
Get-ExecutionPolicy -List
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       AllSigned

In diesem Fall ist die effektive Ausführungsrichtlinie RemoteSigned, da die Ausführungsrichtlinie für den aktuellen Benutzer Vorrang vor der für den lokalen Computer festgelegten Ausführungsrichtlinie hat.

Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
Set-ExecutionPolicy -ExecutionPolicy <PolicyName> -Scope <scope>
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine