Die digitale Welt wird überzogen von Hacker Angriffen. Früher hatte man über die abstrake Gefahr eines Cyber Angriffs diskutiert - inzwischen trifft es leider immer häufiger deutsche Firmen. Egal, wieviele Sicherheitsvorkehrungen getroffen wurden - ein Rest-Risiko bleibt immer.
Bei der komplexen Wiederinbetriebnahme der IT Infrastruktur kommt auch immer das Thema Kennwörter hoch.
Jedes Passwort eines AD-Objekts (egal ob Benutzer oder Computer) muss als potentiell kompromittiert gelten und neu gesetzt werden.
Die Aufgabe lautet also: Wie kann ich automatisiert mit der PowerShell starke, sichere und zufällige Kennwörter erzeugen?
Starke und sichere Kennwörter
Eine starkes und sicheres Kennwort sollte alle Möglichkeiten der Zeichensätze nutzen
- kleine Buchstaben
- große Buchstaben
- Zahlen
- Sonderzeichen
Außerdem muss das Kennwort eine Mindestlänge haben, sodass eine Brut-Force Attacke erfolglos ist. Als hinreichend sicher gelten mindestens 13 Zeichen.
Beliebige Sonderzeichen quälen aber den Endanwender. Wer schon einmal den kleinen runden Kreis (das Symbol für Grad Celsius) in seinem Kennwort hatte, der weiß wovon ich spreche. Und die Kollegen neigen dann dazu, kleine Post-It Zettel an den Monitor zu kleben.
Deswegen kann es sinnvoll sein, nur eine kleinere Untermenge von Sonderzeichen zu nehmen - und dafür das Kennwort selber ein Zeichen länger zu wählen
Anzahl der Möglichkeiten
Das Ganze mathematisch ausgerechnet:
Wir nehmen
26 Großbuchstaben
26 Kleine Buchstaben
10 Zahlen
20 Sonderzeichen
Das sind sind in der Summe 82 mögliche Zeichen
Bei einem 13 Zeichen Kennwort wären das (82*82*82*82*82*82*82*82*82*82*82*82*82) = 8213 = ca. 7,6 * 1024 Möglichkeiten
Wir nehmen
26 Großbuchstabem
26 Kleine Buchstaben
10 Zahlen
und nur 6 leicht tippbare Sonderzeichen
Das sind sind in der Summe nur 68 mögliche Zeichen
Bei einem 14 Zeichen Kennwort wären das trotzdem (68*68*68*68*68*68*68*68*68*68*68*68*68*68) = 6814 = ca. 4,6 * 1025 Möglichkeiten
Ergo: trotz der reduzierten Anzahl von Sonderzeichen ist das Kennwort schwerer zu knacken
Die Funktion RandomPasswords
Nun zum Script: Aus einer ASCII-Tabelle (ist tausendfach im Netz auffindbar) holen wir uns die Dezimal-Werte zu den Zeichen
Große Buchstaben: 65 - 90
Kleine Buchstaben: 97 - 122
Zahlen: 48 - 57
einfache Sonderzeichen: 33,35,43,44,45,46 (! # + , - .)
Zeichen in der PowerShell sind vom Dateityp CHAR
So erzeuge ich ein einzelnes Zeichen, z.B. den Buchstaben A (=ASCII Wert 65)
[CHAR]65
So erzeuge ich eine Liste von Zeichen, z.B. alle großen Buchstaben (=ASCII Werte 65 bis 90)
[char[]](65..90)
So wähle ich zufällig ein Zeichen aus der Zeichenliste aus, z.B. ein Zeichen aus allen großen Buchstaben
Get-Random -inputObject ([char[]](65..90)) -count 1
Und jetzt zum Script bzw. zur Funktion.
Ohne extra Parameter wird ein 14 Zeichen Kennwort erzeugt
RandomPasswords
njnfSoU.j+,4pS
Mit dem Parameter -Characters können Kennwörter zwischen 5 und 64 Zeichen Länge erzeugt werden
RandomPasswords -Characters 20
y8XhqedYz8C.L9EcL+H4
Damit jede Zeichenart sicher mindestens einmal vorkommt, wird am Anfang ($pwstart) von jeder Art ein Zeichen zufällig ausgewählt.
Danach werden die restlichen Zeichen zufällig aus allen möglichen Zeichen erzeugt ($pwrest)
Und am Ende werden noch einmal alle bisher erzeugten Zeichen zufällig durchgemixt ($passwordmixed)
Der Code
Hier die fertige Funktion. Sie kann in beliebige Powershell Skripte eingefügt werden.
function RandomPasswords { # Zwischen 6 und 64 Zeichen, Standard sind 14 Zeichen param ( [ValidateRange(5, 64)][int] [INT]$Characters = 14 ) # Mögliche Zeichen $digitcapital = [char[]](65..90) $digitsmall = [char[]](97..122) $numbers = [char[]](48..57) $special = [char[]](33,35,43,44,45,46) $pwstart = (Get-Random -inputObject $digitcapital -count 1) + (Get-Random -inputObject $digitsmall -count 1) + (Get-Random -inputObject $numbers -count 1) + (Get-Random -inputObject $special -count 1) $pwrest = Foreach ($i in (0..($characters-5))) {Get-Random -inputObject ($digitcapital + $digitsmall + $numbers + $special) -count 1} $pwrest = $pwrest -join "" $passwordmixed = Get-Random -inputobject ([char[]]($pwstart + $pwrest)) -count $characters $password = $passwordmixed -join "" Return $password }
Toller Artikel und guter Code. Ich hatte noch eine Optimierung für mich vorgenommen, so dass ich mit einem Befehl direkt alle Zeichen vor belegen kann, ohne die Ordnungszahlen zu definieren. Das geht mit dem Befehl join(„ABCDabcd&@#$%1234“.tochararray().
Hallo Ray. Danke für deinen Beitrag. Die einzelnen Zeichenblöcke nutze ich, damit sicher jede Zeichenart mindestens 1x vorkommt. Und hier noch der Link zu Rays Blogeintrag: https://www.derwaldmeister.com/powershell/powershell-komplexes-passwort-per-zufall-erzeugen
Hi Boris,
danke für die Rückmeldung. Jetzt hab ichs auch verstanden ;-).
Wobei ich von vornherein alle gleich aussehenden Zeichen rausgenommen habe, da ich immer vor der Tastatur sonst verzweifele.
VG
Ray