Passwörter in PowerShell speichern


    Tags: , , ,

    Authentifizierung über Username und PasswortWenn ein Script unter einem bestimmten User ausge­führt werden soll, dann ist es oft nicht prak­ti­kabel, die dafür benö­tigten Anmelde­­daten inter­aktiv einzu­geben. Daher bietet Power­Shell die Möglich­keit, Pass­wörter in einer Datei zu speichern und bei Bedarf in ein PSCredential-Objekt zu impor­tieren. Als Speicher bietet sich alter­nativ 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.

    Abfrage des Kennworts nach Angabe eines Benutzernamens über den Credential-Parameter

    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

    Benutzernamen über den Parameter UserName vorgeben

    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 Automa­tisierung 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

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links