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
- ASP.NET 1
- Active Directory 41
- Administration Tools 1
- Allgemein 60
- Backup 4
- ChatBots 5
- Configuration Manager 3
- DNS 1
- Data Protection Manager 1
- Deployment 24
- Endpoint Protection 1
- Exchange Server 62
- Gruppenrichtlinien 4
- Hyper-V 18
- Intune 1
- Konferenz 1
- Künstliche Intelligenz 7
- Linux 3
- Microsoft Office 11
- Microsoft Teams 1
- Office 365 11
- Office Web App Server 1
- Powershell 21
- Remote Desktop Server 1
- Remote Server 1
- SQL Server 8
- Sharepoint Server 12
- Sicherheit 1
- System Center 10
- Training 1
- Verschlüsselung 2
- Virtual Machine Manager 1
- Visual Studio 1
- WSUS 7
- Windows 10 12
- Windows 8 9
- Windows Azure 4
- Windows Client 1
- Windows Server 24
- Windows Server 2012 7
- Windows Server 2012R2 15
- Windows Server 2016 7
- Windows Server 2019 2
- Windows Server 2022 1
- Zertifikate 4