Passwörter sicher speichern - für mehrere Benutzer

In meinem Blogeintrag "Passwörter sicher speichern – die PowerShell, dein Freund und Helfer" habe ich mich damit befasst, wie man Passwörter mit Hilfe des SecureStrings speichern kann. Der SecureString verwendet normalerweise eine Mischung aus dem lokalen Computer-Passwort und dem Benutzer-Passwort. Will also ein anderer Benutzer auf dem selben Computer oder der selbe Benutzer auf einem anderen Computer das Passwort auslesen, geht das nicht. Wie man, mit einigen Einbußen in der Sicherheit, dieses Problem umgehen kann, zeige ich im Folgenden.

Das Szenario

Um ein harmloses Skript ausführen zu können benötigen Benutzer bestimmte Rechte, die Sie allerdings nur auf einem Computer haben sollen. Da die Verwaltung der Rechte kompliziert ist und man nicht bei jeder Erstellung eines Benutzers diese Rechte wieder ändern möchte hat man sich dazu entschlossen einen eigenen Account zum Ausführen des Skripts zu erstellen.

Da das Skript ein PowerShell-Skript ist und man hierfür die Anmeldedaten des Accounts hinterlegen muss, will man das Passwort halbwegs sicher auf dem lokalen Computer speichern.

Wie unter [1] gezeigt, kann man dies mit dem SecureString tun. Allerdings kann dann immer nur 1 Benutzer das Passwort verwenden. Wenn wir dies ändern müssen, müssen wir den Befehl ConvertTo-SecureString mit dem Parameter -Key aufrufen. Hier muss man einen 24-Bit Key übergeben.

Der Einfachheit halber, verwenden wir den in der Registry abgelegten Key DigitalProductID. Diesen findet man unter HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion

Man liest ihn über folgende Befehle in die Variable $key aus:

$key = Get-ItemProperty "HKlm:SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name DigitalProductID $secureKey = $key.DigitalProductID

Die Lösung

Um jetzt ein Passwort in der Datei pass.txt zu speichern, führen wir folgenden Befehl aus:

Read-Host -AsSecureString | ConvertFrom-SecureString -Key ($secureKey[0..23]) | Out-File pass.txt

Das Auslesen funktioniert nun wie folgt:

$adminPass = ConvertTo-SecureString $pass -Key ($secureKey[0..23])

Nun kann man sich die Credentials zum Aufrufen des Skripts wie folgt bauen:

$Credentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminUser, $adminPass

Wie man nun mit diesen Credentials ein Skript aufruft, habe ich unter [2] genauer erklärt.

[1] https://www.escde.net/blog/passwoerter-sicher-speichern-die-powershell-dein-freund-und-helfer?rq=die%20powershell%20dein%20freund%20und%20helfer
[2] https://www.escde.net/blog/powershell-quick-tip-skriptteile-als-anderer-benutzer-ausfuehren?rq=als%20anderer%20benutzer%20ausf%C3%BChren