Fragensteller
Powershell Script verschlüsseln

Frage
-
Hi Leute
In VBScript konnte ich mit dem "Windows Script Encoder" VBScript verschlüsseln, damit die darin enthaltenen Passwörter nicht mehr lesbar waren.
Nun bin ich zu Powershell gewechselt und schreibe alle neuen Scripts damit. Allerdings habe ich bisher nicht herausgefunden oder etwas im Internet gefunden, wie ich Powershell Script verschlüsseln kann, damit der Klartext (zB. Passwörter) nicht mehr lesbar sind.
EDIT:
Das Passwort ist in einem Script für die Softwareverteilung, welches silent ausgeführt werden muss.
Methoden um ein eingegebenes Passwort zu verschlüsseln wie hier (Link) sind daher nicht brauchbar. Auch die Lösung hier (Link) ist nicht brauchbar, da das Script auf verschiedenen Computer laufen muss.
Habt ihr da Ideen?
Liebe Grüsse
Ynickburk
- Bearbeitet ynickburk Donnerstag, 4. Januar 2018 17:06
Alle Antworten
-
Moin,
portable Verschlüsselung ist immer <EDIT>durch Jedermann</EDIT> entschlüsselbar. Wenn es also darum geht, das Passwort gegen ein gelegentliches Einsehen zu schützen, so ist die Methode mit SecureString, vorgegebenem Key und CLIXML-Datei "gut genug" (Teil 2 von Deinem ersten Link).
Du kannst auch eine kompliziertere Methode entwickeln, um die Kennwörter zu schützen. Portabilität und Sicherheit werden sich aber immer beißen, in jeder Sprache. Ein Paar Anregungen:
- Du führst remote auf jedem Rechner ein kleines Skript aus, das einen (Dir) bekannten String im Kontext dieses Rechners verschlüsselt und in Datei speichert, auf die nur der Maschinenkontext zugriff hat. Deine PowerShell-Skripte, die im Maschinenkontext laufen, entschlüsseln diesen String und nutzen ihn als statischen Key, um die Kennwörter zu entschlüsseln. Ist auch ein ganzes Stück "security by obscurity", aber zumindest muss jemand die Identität der Maschine annehmen, um an die Credentials zu kommen.
- (Abwandlung des vorherigen): Du verschlüsselst remote auf jeder Maschine das bekannte Kennwort und legst es lokal ab, statt es in Skripten zu verwenden.
- Du fragst das Kennwort über einen HTTPS-Aufruf ab. Der Webservice, mit dem Du dann sprichst, macht folgendes: Deinen Maschinennamen (aus der Kerberos-Authentifizierung) und IP (aus dem Aufruf) gegeneinander im DNS auflösen. Klappt die Auflösung, dann entweder Kennwort im Klartext übermitteln oder mit einem Key verschlüsselt, der sich aus der IP ableiten lässt. Oder das Skript generiert vor dem Aufruf einen zufälligen Key und übergibt ihn mit dem Aufruf.
Ansonsten musst Du - und das ist m.E. die beste oder zumindest die sicherste Methode - Dein Script halt im SYSTEM-Kontext ausführen und das Maschinenkonto befähigen, auf die benötigten Ressourcen zuzugreifen. Dann musst Du gar kein Kennwort hinterlegen.
Willst Du Deinen Quelltext schützen, so hilft nur Kompilieren (und auch das nur bedingt, siehe https://www.jetbrains.com/decompiler/).
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com- Bearbeitet Evgenij Smirnov Donnerstag, 4. Januar 2018 19:14
- Als Antwort vorgeschlagen tonibert Freitag, 2. März 2018 02:34
-
Hallo,
Vor einiger Zeit hatte ich mal etwas mit Verschlüsselungen in PowerShell rumgespielt. Eine wirklich Sicherheit erreichst Du damit nicht aber allenfalls hilft es Dir weiter.
#----------------------------------------------- # CSP & RSA Provider $csp = New-Object System.Security.Cryptography.CspParameters $csp.KeyContainerName = "VZDKeyStore" $csp.Flags = $csp.Flags -bor [System.Security.Cryptography.CspProviderFlags]::UseMachineKeyStore $rsa = New-Object System.Security.Cryptography.RSACryptoServiceProvider -ArgumentList @(5120, $csp) $rsa.PersistKeyInCsp = $true #----------------------------------------------- # Encrypt # Input => keep secure! $password = 'This!Is$MySuper3cretPass@w0rd$' $key = @(1..32) Write-Host("Password:") $password Write-Host(" ") Write-Host("Key:") $key -join " " # Encrypt $passwordEncrypted = (($password | ConvertTo-SecureString -AsPlainText -Force) | ConvertFrom-SecureString -Key $key).ToString() $keyRSA = $rsa.Encrypt($key, $true) $keyEncrypted = "" $keyRSA | foreach { $keyEncrypted += $_.ToString("X2") } Write-Host(" ") Write-Host("Password Secure String:") $passwordEncrypted Write-Host(" ") Write-Host("Key Encrypted:") $keyEncrypted Write-Host(" ") Write-Host("-----------------------------------------------") Write-Host(" ") #----------------------------------------------- # Decrypt $keyDecrypted = $rsa.Decrypt([byte[]][char[]]$keyRSA, $true) Write-Host("Key Decrypted:") $keyDecrypted -join " " $passwordDecrypted = ConvertTo-SecureString $passwordEncrypted -Key $keyDecrypted $passwordDecrypted = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($passwordDecrypted) $passwordDecrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($passwordDecrypted) Write-Host(" ") Write-Host("Password PlainText:") $passwordDecrypted