Passwörter in PowerShell
Bei verschiedenen Gelegenheiten kann es vorkommen, dass man Passwörter in Powershell verwenden muss. Soll z.B. ein anderer Rechner heruntergefahren und für die Authentifizierung ein anderer als der aktuell angemeldete Benutzer verwendet werden, müssen Benutzername und Passwort angegeben werden. Diese können mit Get-Credential zur Laufzeit abgefragt werden:
|
|
Der Benutzername kann auch vorbelegt werden, so dass statt Benutzernamen und Passwort nur noch das Passwort eingegeben werden muss:
|
|
Erstellt man ein Script das ohne Benutzereingaben laufen muss (z.B. ein Nagios Plugin oder Scheduled Task), kann das Passwort auch direkt im Script angegeben werden. Dort muss es allerdings in einen SecureString umgewandelt werden.
|
|
Diese Variante ist jedoch ziemlich unsicher und sollte unbedingt vermieden werden. Jeder der Zugriff auf das Script hat kann auch das Passwort auslesen. Ein solches Script in öffentlichen oder halb-öffentlichen Code Repositories (z.B. GitHub) zu verwalten ist ein hohes Sicherheitsrisiko. Eine einfache Suche könnte so die Passwörter zurückgeben.
Man könnte das Passwort als Parameter übergeben. Aber auch so wird evtl. das Passwort im Klartext in einer Datei gespeichert (z.B. bei der Definition eines Nagios Checks) oder ist in der Konfiguration eines Scheduled Tasks zu sehen:
|
|
Das Passwort kann auch als verschlüsselter String in einer Datei gespeichert werden. Dafür wird das Passwort einmalig eingelesen, verschlüsselt und z.B. in der Datei password.txt abgespeichert.
|
|
Danach kann das Passwort immer wieder aus dieser Datei eingelesen werden:
|
|
Für die Verschlüsselung des Passwortes wird die Windows Data Protection API (DPAPI) verwendet. Aus diesem Grund ist das verschlüsselte Passwort immer nur für den bei der Erstellung verwendeten Benutzer und Host gültig. Außerdem ist das abgespeicherte Passwort ungültig sobald sich das Passwort des Windows-Benutzers ändert. Um das Passwort unabhängig vom angemeldeten Benutzer und verwendeten Host zu machen, kann der Parameter Key oder SecureKey beim Erstellen des Passworts verwendet werden. Bei Key wird ein Schlüssel als ByteArray angegeben, bei SecureKey als SecureString. In beiden Fällen wird zusätzlich zur Datei mit dem verschlüsselten Passwort ein weitere Datei, die den verwendeten Key (im Beispiel key.txt) enthält, abgelegt.
Einmaliges Erstellen eines zufälligen Keys (ByteArray):
|
|
Einlesen des Passwortes und Keys:
|
|
Einmaliges Erstellen eines zufälligen Keys (SecureString):
|
|
Einlesen des Passwortes und Keys:
|
|
Nach Möglichkeit sollte das Passwort zur Laufzeit mit Get-Credential oder Read-Host eingelesen werden. Muss das Script automatisiert werden und wird immer von dem selben Benutzer auf dem selben Host gestartet, kann das Passwort als SecureString in einer Datei abgelegt werden. Ist dies nicht möglich muss der Key zum Verschlüsseln des Passworts ebenfalls entweder mit -Key oder -SecureKey in einer zusätzlichen Datei abgelegt werden.
Auch wenn das Passwort bei den beschriebenen Verfahren nicht in Klartext gespeichert wird ist es für einen erfahrenen Benutzer unter Umständen möglich das eigentliche Passwort auszulesen. Die Dateie(en) mit den verschlüsselten Daten sollte also zusätzlich durch weitere Maßnahmen (z.B. NTFS Berechtigungen) geschützt werden.