Tags: PowerShell, Passwort, Verschlüsselung, Authentifizierung
Wenn ein Script unter einem bestimmten User ausgeführt werden soll, dann ist es oft nicht praktikabel, die dafür benötigten Anmeldedaten interaktiv einzugeben. Daher bietet PowerShell die Möglichkeit, Passwörter in einer Datei zu speichern und bei Bedarf in ein PSCredential-Objekt zu importieren. Als Speicher bietet sich alternativ ein Secret Store an.
Eine Reihe von Cmdlets, die häufig erhöhte Berechtigungen erfordern, unterstützt den Parameter Credential. Dieser erwartet jedoch als Wert keinen String für den Benutzernamen und das Passwort, sondern ein PSCredential-Objekt.
Die bei anderen Script-Sprachen gängige Praxis, ein Kommando nach dem Muster Get-ADUser -Credential "user:passwort" in einem Script zu speichern, scheidet daher aus. Die dadurch erzielte Sicherheit erfordert indes einen etwas höheren Aufwand, wenn man die Ausführung von Scripts unter einem anderen Konto automatisieren möchte.
Anmeldedaten einlesen
Im einfachsten Fall übergibt man dem Parameter Credential den Benutzernamen, und PowerShell öffnet daraufhin einen Dialog zur Eingabe des Kennworts.
Soll ein Script jedoch zeitgesteuert laufen oder von einem Standardbenutzer ausgeführt werden, dem man nicht die Zugangsdaten eines privilegierten Kontos mitteilen möchte, dann kann man Passwörter verschlüsselt in einer Datei speichern und bei Bedarf von dort wieder auslesen.
Credential-Objekt in Variablen speichern
Diesem Zweck dient das Cmdlet Get-Credential. Ruft man es ohne Parameter auf, dann zeigt es den gleichen Dialog wie oben bei Verwendung des Parameters Credential. Es liefert dann ein PSCredential-Objekt, das man in einer Variablen speichern und an den Credential-Parameter übergeben kann:
$cred = Get-Credential
Enter-PSSession -ComputerName win11PC -Credential $cred
Das Cmdlet akzeptiert als Parameter unter anderem UserName und Message, um das Feld für den Benutzernamen vorzubelegen und eine Nachricht in dem Dialog anzuzeigen:
$cred = Get-Credential -Message "Bitte Kennwort eingeben:" `
-UserName contoso\admin
Passwort in Datei ablegen
Das Passwort ist als Eigenschaft des PSCredential-Objekts verfügbar und kann daher extrahiert sowie in einer Datei gespeichert werden:
$cred = Get-Credential -Message "Bitte Kennwort eingeben:" `
-UserName contoso\admin
$cred.Password | ConvertFrom-SecureString |
Out-File -FilePath passwd.pwd
Zu diesem Zweck muss man das Passwort, das als SecureString vorliegt, mit ConvertFrom-SecureString in eine verschlüsselte Zeichenkette umwandeln. Diese legt Out-File dann in einer Datei ab.
Kennwort in PSCredential-Objekt übernehmen
Wenn man nun in einem Script wieder das gesamte PSCredential-Objekt benötigt, dann liest man das Passwort aus der Datei aus und konvertiert es zurück in einen SecureString:
$pw = Get-Content passwd.pwd | ConvertTo-SecureString
Anschließend erzeugt man damit ein Credential-Objekt:
$cred = New-Object System.Management.Automation.PSCredential "contoso\admin", $pw
Dieses kann man nun an den Credential-Parameter eines Cmdlets übergeben.
Absichern von Klartextkennwörtern
Nicht alle Cmdlets erwarten ein PSCredential-Objekt, vielmehr sehen einige die Verwendung von Passwörtern im Klartext vor. Ein Beispiel dafür ist New-SmbMapping für die Zuordnung eines Netzlaufwerks:
New-SmbMapping -LocalPath x: -RemotePath \\ds\share1 `
-user contoso\admin -password P@ssw0rd -SaveCredentials
Verwendet man einen solchen Aufruf in einem Script, dann sollte man das Passwort nach Möglichkeit dort nicht speichern. Vielmehr kann man es ebenfalls als SecureString einlesen, verschlüsselt in einer Datei ablegen und zur Laufzeit zurückholen:
Unter PowerShell 7.x fällt diese Aufgabe leichter, weil dort auch ConvertFrom-SecureString den Parameter AsPlainText unterstützt:
$pw = Get-Content passwd.pwd | ConvertTo-SecureString |
ConvertFrom-SecureString -AsPlainText
Passwörter in Secret Vault speichern
Anstatt die Kennwörter in einer Datei abzulegen, bietet das PowerShell-Modul SecretManagement für diesen Zweck einen Tresor an. Von dort kann man es mit dem Cmdlet Get-Secret als Secure String oder auch als Plain Text auslesen.
In der Regel wird der Vault jedoch über ein Passwort geschützt sein, so dass dies einer Automatisierung im Weg steht. Hier kann man sich behelfen, indem man den Passwortspeicher für einen bestimmten Zeitraum entsperrt.
Unlock-SecretStore -Password $SecStr -PasswordTimeout 600
In diesem Beispiel wäre der Tresor für 10 Minuten ohne Eingabe eines Passworts zugänglich.
Alternativ kann man das Passwort für den Vault als einziges nach der oben beschriebenen Methode in einer Datei speichern und dann im Script für das Entsperren des Secret Store verwenden.
Zusammenfassung
Wenn PowerShell-Befehle zu ihrer Ausführung erhöhte Rechte benötigen, dann bieten viele Cmdlets dafür den Parameter Credential. Diesem übergibt man ein Objekt vom Typ PSCredential.
Während man im interaktiven Betrieb einfach das Passwort für den jeweiligen User in den angezeigten Dialog eintippt, erfordert die unbeaufsichtigte Ausführung eines Scripts hier etwas mehr Aufwand. Für diesen Zweck konvertiert man das Passwort in einen verschlüsselten String und legt diesen in einer Datei ab.
Umgekehrt wandelt man das aus der Datei eingelesene Passwort in einen Secure String um und nutzt diesen zur Erzeugung eines neuen PSCredential-Objekts. Dieses übergibt man dann dem betreffenden Cmdlet innerhalb des Scripts.
Als alternativer Speicherort für Kennwörter bietet sich ein Secret Vault an. Allerdings muss man diesen für die Automatisierung der Anmeldung vorab entsperren.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- PowerShell SecretManagement: Passwörter in KeePass oder SecretStore verwalten
- SecretsManagement: PowerShell erhält Modul für Passwort-Manager
- Ablaufdatum von AD-Passwörtern in PowerShell auslesen
- BitLocker aktivieren mit manage-bde, PowerShell oder WMI
- Exchange 2019 CU14 aktiviert Extended Protection, HSTS-Support für 2016 und 2019 ab sofort
Weitere Links