Passwörter sind immer Diskussionsthema in der IT-Sicherheit. Wie sind die Richtlinien? Welche Zeichen müssen enthalten sein? Wie oft muss es gewechselt werden? Wie sieht der Prozess bei vergessenem Passwort aus?
PowerShell eignet sich hervorragend, wenn es darum geht, ein zufälliges Passwort zu generieren.
Ein solches Skript kann z.B. für die AD Benutzerverwaltung genutzt werden.
Index
Warum Passwörter generieren?
Fast immer benötigt man ein Initial-Passwort. Ob nun für neue Benutzer im Netzwerk oder für das Zurücksetzen eines vergessenen Passworts muss dem Nutzer ein zufällig generiertes Passwort gegeben werden, mit dem dieser sich temporär einloggen kann.
Das ist oft leichter gesagt als getan, denn es kann meistens nicht einfach irgendein Passwort sein, sondern muss den festgelegten Richtlinien der Domäne entsprechen. Hat man dafür keine entsprechende Anwendung, die nach den Regeln ein Passwort generiert, sieht es schlecht aus. Es geht aber auch einfach selbst zu lösen: Nämlich mit PowerShell. Mit einem entsprechenden Skript lassen sich Passwörter einfach und vor allem sicher automatisiert erzeugen.
In diesem Beitrag möchte ich Ihnen ein Skript zeigen, mit dem Sie nicht nur entsprechend Ihren Sicherheitsrichtlinien einfach Passwörter erzeugen können, sondern das die Art der Erzeugung bei Änderung dieser Richtlinien auch ganz einfach anpassen können.
Das Passwort generieren wir in zwei Schritten.
Schritt 1: Zufällige Zeichen
Zuerst generieren wird einen String, in dem die nach unserer Definition benötigten Zeichen enthalten sind – natürlich zufällig ausgewählt. Um das so generisch wie möglich zu halten, brauchen wir dafür nur eine Funktion, der wir sagen, wie viele Zeichen wir benötigen und aus welchem Satz an Zeichen diese zufällig ausgewählt werden soll.
Diese Funktion sieht folgendermaßen aus:
1 2 3 4 5 |
function Get-RandomCharacters($length, $characters) { $random = 1..$length | ForEach-Object { Get-Random -Maximum $characters.length } $private:ofs="" return [String]$characters[$random] } |
Die Funktion wählt solange zufällig einen Index aus dem übergebenen String, bis die festgelegte Anzahl erreicht ist. Anschließend werden die Zeichen des Eingabe-Strings an diesen Indizes als Gesamt-String wieder zurückgegeben (ohne Leerzeichen dazwischen).
Jetzt können wir uns mit dieser Funktion einen zufälligen Passwort-String zusammenbauen. Je nachdem, wie unsere Regeln lauten, rufen wir die Funktion mit einem bestimmten Zeichensatz und einer bestimmten Länge auf und fügen das Ergebnis zu einem Gesamt-String zusammen.
Unsere Passwort-Richtlinie könnte bspw. so lauten:
- Min. 8 Zeichen
- Davon min. 1 Großbuchstabe
- Davon min. 1 Zahl
- Davon min. 1 Sonderzeichen
- Rest Kleinbuchstaben
Dementsprechend bauen wir unseren String auf:
1 2 3 4 |
$password = Get-RandomCharacters -length 5 -characters 'abcdefghiklmnoprstuvwxyz' $password += Get-RandomCharacters -length 1 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ' $password += Get-RandomCharacters -length 1 -characters '1234567890' $password += Get-RandomCharacters -length 1 -characters '!"§$%&/()=?}][{@#*+' |
Schritt 2: Zufällige Reihenfolge
Nun könnte man dies bereits als Passwort verwenden. Das Problem ist natürlich, dass jedes so generierte Password zwar zufällige Zeichen hat, jedoch die Zeichen immer an derselben Stelle des Strings stehen. In diesem Fall wären es also immer 5 Kleinbuchstaben, 1 Großbuchstabe, 1 Zahl und schließlich 1 Sonderzeichen. Erkennt ein potentieller Angreifer dieses Muster, würde ihm das einen Brute-Force-Angriff erleichtern. Deswegen sollten wir noch dafür sorgen, dass wir die Zeichen des Passworts noch einmal „durchmischen“.
Dafür brauchen wir eine weitere Funktion.
Diese nimmt unser Passwort entgegen und vertauscht die Reihenfolge der Zeichen:
1 2 3 4 5 6 |
function Scramble-String([string]$inputString){ $characterArray = $inputString.ToCharArray() $scrambledStringArray = $characterArray | Get-Random -Count $characterArray.Length $outputString = -join $scrambledStringArray return $outputString } |
Die Funktion macht nichts weiter, als das Passwort in CharacterArray umzuwandeln, die Zeichen auszulesen und sie in einer zufälligen Reihenfolge in ein neues CharacterArray zu schreiben. Mit einem einfachen Join wird das Array schließlich wieder in einen String verwandelt und schon haben wir unser zufällig generiertes Passwort. Lässt man sich die Strings jeweils nach dem Ausführen der Funktionen ausgeben, kann man gut sehen, wie das Skript arbeitet:
Standard AD Benutzerverwaltung: Das Skript im IDM-Portal
Das Skript findet in dieser oder ähnlicher Form oft Einsatz in unserem FirstWare IDM-Portal. Mit dieser Software können Sie nicht nur einfach und schnell Identitäten in Ihrem Active Directory verwalten, sondern auch viele Prozesse automatisieren.
Benutzerverwaltung mit Skript anpassen
Dazu stellt das IDM-Portal mit dem PowerShell-Provider eine Schnittstelle zu PS-Skripten wie diesem bereit. So lassen sich individuell angepasste Skripte in das Portal einbringen, um zum Beispiel eine Nutzer-Eigenschaft wie das Passwort generieren zu lassen.
Skriptänderung und delegierte Administration
Sollte sich einmal die Passwort-Sicherheitsrichtlinie ändern, kann einfach und schnell reagiert werden.
Mit einer kleinen Änderung im Skript funktioniert dies sofort und ohne weiteren Konfigurationsaufwand für alle Benutzer, die das IDM-Portal verwenden.
Wie verhält es sich mit Kollegen, die mit dem IDM-Portal arbeiten und delegierte Active Directory Aufgaben durchführen?
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.
Vollständiges Skript: Zufälliges Passwort mit PowerShell
Zum Schluss gibt es noch das gesamte Skript zum Kopieren und selbst ausprobieren:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 } $password = Get-RandomCharacters -length 5 -characters 'abcdefghiklmnoprstuvwxyz' $password += Get-RandomCharacters -length 1 -characters 'ABCDEFGHKLMNOPRSTUVWXYZ' $password += Get-RandomCharacters -length 1 -characters '1234567890' $password += Get-RandomCharacters -length 1 -characters '!"§$%&/()=?}][{@#*+' Write-Host $password $password = Scramble-String $password Write-Host $password |
Fragen zu Passwort-Richtlinien oder AD-Konzepten? Wir freuen uns auf Ihre Nachricht.
2 Comments
Leave your reply.