Andrzej Tokarski - stock.adobe.c

So verwenden Sie Ihre Passwörter in PowerShell sicher

Passwörter im Klartext sollten Sie in jeder Situation vermeiden. Wir erklären, wie Sie in PowerShell sichere Zeichenketten oder das SecretManagement Modul zum Verschlüsseln nutzen.

Die Verwaltung von Passwörtern sollte in den meisten Unternehmen Standard sein, aber es ist leider immernoch ein komplexes Unterfangen. So komplex, dass es mehrere -Tools, Plattformen und Methoden gibt, die Passwörter für Sie verwalten.

Glücklicherweise sind die Probleme, die wir in PowerShell lösen müssen, einfach, aber ebenso wichtig: Wir müssen Kennwörter so speichern und handhaben, dass sie am Ende so sicher wie möglich sind.

Die Gefahren von Kennwörtern im Klartext

Alle IT-Profis wissen, dass sie Kennwörter nicht im Klartext speichern dürfen. Das gilt insbesondere für Passwörter in einem versionskontrollierten Repository. Sobald Sie ein Kennwort übertragen und an Git übergeben, wird es Teil des Versionsverlaufs von Git. Wenn Sie es dann löschen möchten, wird das schnell kompliziert.

Leider passiert es beinahe unbemerkt und schnell, dass man versehentlich ein Kennwort als lesbare Zeichenfolge in PowerShell speichert. Das fühlt sich vielleicht erst einmal nicht weiter schlimm an, weil es schwierig ist, den Speicher der PowerShell indirekt zu lesen, doch PowerShell speichert String-Variablen als Klartext. Das bedeutet, dass jedes Programm, das auf Ihrem System läuft, potenziell auf alle String-Variablen in Ihrer PowerShell-Sitzung zugreifen könnte. Die Wahrscheinlichkeit ist zwar gering, doch die Privilegien, die einem Dienstkonto zugewiesen sind, das ein automatisiertes Skript ausführt, sind in den falschen Händen verheerend.

Sehen wir uns ein Beispiel für ein PowerShell-Skript an, das die folgenden Befehle ausführt:

$str = 'Passwort1!'

$str2 = ConvertTo-SecureString 'Passwort2!' -AsPlainText -Force

$pw = Read-Host -AsSecureString

Mit dem Windows Debugger analysieren wir entweder den Speicher des Prozesses live oder mit einem Speicherauszugs-Tool wie ProcDump. Durch diese Analyse finden wir die String-Variablen und den Wert von $str sehen, wie in Abbildung 1.

Ausgabe von ProcDump-Analyse in der PowerShell
Abbildung 1: Die ProcDump-Analyse gibt den Wert von $str aus.

Wenn wir den Debugger verwenden, um das HistoryInfo-Objekt der PowerShell zu durchsuchen, erhalten wir ebenfalls den Wert von $str2, wie in Abbildung 2 zu sehen ist.

Ausgabe von ProcDump-Analyse in der PowerShell
Abbildung 2: Die ProcDump-Analyse gibt den Wert von $str aus.

Das sind nur einige Beispiele dafür, wie das Durchsuchen des PowerShell-Speichers Informationen im Klartext aufspürt.

Wenn Sie eine sichere Zeichenfolge verwenden, wie in Zeile 3 von Abbildung 2 zu sehen, verhindern Sie, dass der Text aus dem Speicher gelesen wird. Sie sollten sichergehen, dass Sie das Passwort so behandeln, dass der Klartext nicht auslesbar ist, bevor oder nachdem es zu einer sicheren Zeichenfolge wird.

Verwenden Sie sichere Zeichenketten

Sichere Zeichenketten werden aufgrund ihrer Komplexität oft übersehen, also lassen Sie uns kurz darauf eingehen, wie man sie verwendet.

Das Skript aus dem ersten Beispiel enthält zwei verschiedene Zeilen mit sicheren Zeichenfolgen. Die erste beschreibt, wie Sie eine normale Zeichenkette mit ConvertTo-SecureString in eine sichere Zeichenkette umwandeln:

$str2 = ConvertTo-SecureString 'Passwort2!' -AsPlainText -Force

Der zweite zeigt, wie Sie Read-Host verwenden, um Eingaben automatisch in eine sichere Zeichenkette umzuwandeln:

US-Dollarpw = Read-Host -AsSecureString

Auch diese Zeichenkette macht den Text bei der Eingabe unkenntlich, wie Abbildung 3 zeigt.

PowerShell-Ausgabe von read-Host
Abbildung 3: Read-Host wandelt den Text in einen sicheren String um.

Mit einem sicheren String verwenden wir ein Kennwort sicher, aber das funktioniert nur mit Cmdlets und Funktionen, die sichere Zeichenfolgen unterstützen. Gelegentlich müssen Sie die sichere Zeichenfolge wieder in Klartext umwandeln, was Sie mit dem Typ pscredential erreichen:

[pscredential]::new('user',$pw).GetNetworkCredential().Password

Kennwörter sicher auf einem Windows-Datenträger speichern

Verwenden Sie in der Windows PowerShell das Cmdlet ConvertFrom-SecureString, um eine sichere Zeichenfolge in eine verschlüsselte Klartextzeichenfolge zu konvertieren, die Sie auf die Festplatte schreiben und später verwenden:

US-Dollarpw | ConvertFrom-SecureString

Die Ausgabe sieht ungefähr so aus wie in Abbildung 4.

Screenshot der PowerShellausgabe von ConvertFrom-Secure-String
Abbildung 4: Das ConvertFrom-SecureString-Cmdlet verschlüsselt einen sicheren String.

Sie können diese Ausgabe direkt in eine Datei leiten, in dem Wissen, dass sie verschlüsselt ist. Wenn der Parameter -Key nicht angegeben wird, wird die Zeichenfolge von der Windows Data Protection API gesichert. Diese Zeichenfolge kann nur von demselben Benutzer auf demselben Rechner entschlüsselt werden.

Mit dem Parameter -Key geben Sie einen benutzerdefinierten Schlüssel an:

$key = 0..255 | Get-Random -Count 32 | %{[byte]$_}
$pw | ConvertFrom-SecureString -Key $key

Sie sollten den Schlüssel getrennt von dem im Klartext verschlüsselten Passwort speichern.

Um die Zeichenkette zu lesen, verwenden Sie den Schlüssel ConvertFrom-SecureString:

$encStr = Get-Content .\password.txt
$encStr | ConvertFrom-SecureString -Key $key

Passwörter sicher auf einem plattformübergreifenden Datenträger speichern

Da die im letzten Abschnitt beschriebene Methode zum Speichern von Kennwörtern von der Windows Data Protection API abhängig ist, funktioniert sie nur auf Windows. Microsoft hat jedoch ein Modul zum Verwalten von Kennwörtern entwickelt, das sowohl mit Windows PowerShell als auch mit PowerShell 6+ auf allen Plattformen kompatibel ist: das SecretManagement-Modul.

Mit dem SecretManagement-Modul speichern Sie auf standardisierte Geheimnisse verschlüsselt. Das SecretManagement-Modul speichert keine Geheimnisse; es bietet lediglich eine Schnittstelle zu einem Geheimnistresor.

Für das Speichern von Geheimnissen stellt Microsoft SecretStore zur Verfügung – eine einfache, aber effektive Speicheroption – oder stellt eine Verbindung zu Ihrem bevorzugten Geheimnistresor her, zum Beispiel KeePass, LastPass oder 1Password. Beachten Sie, dass es sich hierbei um von der Community entwickelte Module handelt und nicht um offizielle Versionen von Microsoft oder den jeweiligen Unternehmen.

Um einen Tresor mit dem SecretManagement-Modul zu initialisieren, verwenden Sie das Cmdlet Register-SecretVault:

Register-SecretVault -Name FirstVault -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault

Geben Sie an, welches Modul als Tresor dienen soll. In diesem Fall verwende ich das von Microsoft entwickelte Modul SecretStore

Wenn Sie einen Tresor erstellen, werden Sie erst nach einem Kennwort gefragt, um den Tresor zu sichern, wenn Sie mit dem Cmdlet Set-Secret ein Geheimnis erstellt haben:

Set-Secret -Name ErstesPasswort -Secret "Passwort1!"

Dann werden Sie aufgefordert, den Tresor mit einem Kennwort zu sichern.

Um das Passwort abzurufen, verwenden Sie das Cmdlet Get-Secret:

Get-Secret -Name ErstesPasswort

Standardmäßig wird das Kennwort als sichere Zeichenfolge zurückgegeben. Wenn Sie das Kennwort jedoch im Klartext benötigen, verwenden Sie den Parameter -AsPlainText.

Erfahren Sie mehr über Serverbetriebssysteme