Wie können wir die Passwortgenerierung nach einer Richtlinien-Änderung anpassen?
Um Anpassungen der Passwortgenerierung nach einer Richtlinien-Änderung zu verhindern, werden wir Ihnen nun zeigen, wie Sie Passwörter in Abhängigkeit der aktuellen Domain Password Policy erzeugen können.
Index
Wenn Sie Unterstützung zur Passwortgenerierung brauchen, können sie unseren Artikel Zufälliges Passwort nach eigenen Vorgaben generieren im ersten Schritt nachlesen.
Auslesen der Passwort-Richtlinien einer Domäne
Zuerst möchten wir die Passwort-Richtlinien der Domäne auslesen, über den Server Manager > Tools gibt es zwei Möglichkeiten, sich die Richtlinien anzuschauen:
Über das Tool „Group Policy Management“ lässt sich unter der Domäne und der Default Domain Policy sämtliche Richtlinien anzeigen, darunter auch die Password Policy.
Über „Local Security Policy“ lassen sich die Passwort-Richtlinien ebenfalls anzeigen, aber auch mit entsprechenden Berechtigungen ändern.
Eigenschaften der Password Policy
Die Password Policy besteht aus den folgenden Eigenschaften, welche wir konfigurieren können:
- PasswordHistoryCount
- MaxPasswordAge
- MinPasswordAge
- MinPasswordLength
- ComplexityEnabled
- ReversibleEncryptionEnabled
Für diesen Artikel sind die Eigenschaften ComplexityEnabled und MinPasswordLength relevant. Im Tool Local Security Policy werden folgende Erklärungen dazu geliefert:
ComplexityEnabled: wenn aktiviert,
- dürfen die Passwörter nicht den samAccountName oder displayName enthalten
- müssen die Passwörter mindestens 6 Zeichen lang sein
- müssen die Passwörter bestimmte Zeichen enthalten (jeweils mindestens ein Zeichen aus drei der vier Kategorien)
MinPasswordLength: Mindestläge von Passwörtern
Mehr Informationen dazu unter: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/hh994560(v=ws.10)
Der PasswordHistoryCount spielt ebenfalls eine Rolle, da bei der Generierung eines neuen Passwortes für einen Nutzer nicht überprüft werden kann, ob dieses Passwort schon einmal verwendet wurde (innerhalb der angegeben Anzahl von alten Passwörtern).
PasswordHistoryCount: Zahl der verwendeten Passwörter, die im AD gespeichert werden sollen. Sie dürfen vom Benutzer nicht wiederverwendet werden.)
Mehr Informationen dazu unter: https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/hh994571(v=ws.10)
Auslesen der Password Policy mit PowerShell
Mit dem CmdLet Get-ADDefaultDomainPasswordPolicy lässt sich die Passwort-Richtlinie der Domäne ganz einfach auslesen.
Hier werden weitere Attribute wie LockoutDuration, LockoutObservationWindow und LockoutThreshold aufgelistet, welche im Tool Local Security Policy unter Account Lockout Policy zu finden sind.
Mit dem CmdLet Set-ADDefaultDomainPasswordPolicy lassen sich die verschiedenen Eigenschaften mit PowerShell ändern.
Generieren von Passwörtern anhand der Password Policy
Zunächst werden die relevanten Parameter ausgelesen:
1 2 3 |
$policy = Get-ADDefaultDomainPasswordPolicy $complexity = $policy.ComplexityEnabled $minLength = $policy.MinPasswordLength |
Je nach eingestellter Komplexität werden die Generierungsalgorithmen angewandt, welche je nach Wunsch angepasst werden können. Wir zeigen hier ein mögliches Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if($complexity){ Write-Host("Komplexes Passwort wird generiert:") -ForegroundColor Yellow # Komplexe Passwort-Generierung $password = Get-RandomCharacters -length ($minLength - 3) -characters 'abcdefghijklmnopqrstuvwxyzß' $password += Get-RandomCharacters -length 1 -characters 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' $password += Get-RandomCharacters -length 1 -characters '1234567890' $password += Get-RandomCharacters -length 1 -characters '!?:;,."§$%&/|\()[]{}<>@#*-=+~^_' $password = Scramble-String $password }else{ Write-Host("Einfaches Passwort wird generiert:") -ForegroundColor Yellow # Einfach Passwort-Generierung $password = Get-RandomCharacters -length $minLength -characters 'abcdefghiklmnoprstuvwxyz' } |
Wie im Artikel „PowerShell – Zufälliges Passwort nach eigenen Vorgaben generieren“, werden folgende Funktionen dafür genutzt:
1 2 3 4 5 6 7 8 9 10 11 12 |
function Get-RandomCharacters($length, $characters) { $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length } $private:ofs="" return [String]$characters[$random] } function Scramble-String([string]$inputString){ $characterArray = $inputString.ToCharArray() $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length $outputString = -join $scrambledStringArray return $outputString } |
Da es sich bei uns um ein zufällig generiertes Passwort handelt, haben wir auf die Überprüfung, ob der samAccountName und displayName des Users im Passwort enthalten ist, verzichtet. Wird das Passwort allerdings manuell eingegeben, ist eine Überprüfung sinnvoll:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$samAccountName = "user.test" $displayName = "Test User" if (($samAccountName) -and ($password -match $samAccountName)) { Write-Host("Passwort enthält samAccountName des Users") -ForegroundColor Red } if ($displayName) { $parts = $displayName.Split(",.-,_ #`t") foreach ($part in $parts) { if (($part) -and ($password -match $part)) { Write-Host("Passwort enthält Teile des displayName des Users")</code> -ForegroundColor Red break } } } |
Da eine Überprüfung der Password History nicht möglich ist, sollten die Exceptions beim Setzen des Passwortes am User abgefangen werden. So können Sie gegebenenfalls ein neues Passwort generieren.
1 2 3 4 5 6 7 8 9 10 11 |
try{ # …Code… } catch [Microsoft.ActiveDirectory.Management.ADPasswordComplexityException]{ $strException = $_.Exception.Message Write-Host("Passwort entsprich nicht den Richtlinien; Fehler: " + $strException) -ForegroundColor Red } catch{ $strException = $_.Exception.Message Write-Host("Fehler: " + $strException) -ForegroundColor Red } |
Zum Schluss nun das komplette Skript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
function Get-RandomCharacters($length, $characters) { $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length } $private:ofs="" return [String]$characters[$random] } function Scramble-String([string]$inputString){ $characterArray = $inputString.ToCharArray() $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length $outputString = -join $scrambledStringArray return $outputString } $policy = Get-ADDefaultDomainPasswordPolicy $complexity = $policy.ComplexityEnabled $minLength = $policy.MinPasswordLength try{ if($complexity){ Write-Host("Komplexes Passwort wird generiert:") -ForegroundColor Yellow # Komplexe Passwort-Generierung $password = Get-RandomCharacters -length ($minLength - 3) </code>-characters 'abcdefghijklmnopqrstuvwxyzß' $password += Get-RandomCharacters -length 1 -characters 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' $password += Get-RandomCharacters -length 1 -characters '1234567890' <code> $password += Get-RandomCharacters -length 1</code> -characters '!?:;,."§$%&/|()[]{}<>@#*-=+~^_' <code> </code> <code>$password = Scramble-String $password }else{ Write-Host("Einfaches Passwort wird generiert:") -ForegroundColor Yellow # Einfach Passwort-Generierung $password = Get-RandomCharacters -length $minLength </code>-characters 'abcdefghiklmnoprstuvwxyz' } Set-ADAccountPassword -Identity $samAccountName -Reset -NewPassword (ConvertTo-SecureString -AsPlainText –String $password -Force) } catch [Microsoft.ActiveDirectory.Management.ADPasswordComplexityException]{ $strException = $_.Exception.Message Write-Host("Passwort entsprich nicht den Richtlinien; Fehler: " + $strException) -ForegroundColor Red } catch{ $strException = $_.Exception.Message Write-Host("Fehler: " + $strException) -ForegroundColor Red } |
Fazit
Im Artikel „PowerShell – Zufälliges Passwort nach eigenen Vorgaben generieren“ wurde eine Möglichkeit vorgestellt, Passwörter mit PowerShell zu erstellen. Dieses Skript kann, wie beschrieben, auch im IDM-Portal genutzt werden. Sollte sich nun die Passwort-Richtlinie im Unternehmen ändern, muss dieses Skript nicht unbedingt angepasst werden, wenn von vornherein die Password Policy der Domäne beachtet wird. Die Passwörter werden dann immer anhand der aktuellen Richtlinie generiert.
Für Nicht-IT Mitarbeiter die administrieren, bedeutet dies keine Veränderung. Erstellt die Personalabteilung beispielsweise einen neuen Benutzer im AD, so wird automatisch das geänderte Skript für die Passwortgenerierung geladen.
Unterstützung benötigt?
Gerne stellen wir Ihnen unsere Leistungen und Lösungen in einem persönlichen Gespräch vor und würden uns über Ihre Kontaktaufnahme sehr freuen!
Leave a Reply
<p>Danke für Ihre Anregungen, Fragen und Hinweise.<br/>Infos zum <a href="https://www.active-directory-faq.dekontakt/">Datenschutz</a></p>