Best Practice Passwort in Powershell Skript nicht anzeigen zu lassen
Hallo zusammen,
ich habe ein Skript, welches eine Text Datei erstellt und mit Daten füllt, danach mit 7zip4Powershell zippt. Ich will jetzt aber noch das die Zip-Datei mit einem Passwort geschützt ist. Wie kann ich das machen ohne das ich das Passwort mit Parameter -Password <string> im Klartext in das Skript schreibe?
Danke schonmal im Voraus und viele Grüße
ich habe ein Skript, welches eine Text Datei erstellt und mit Daten füllt, danach mit 7zip4Powershell zippt. Ich will jetzt aber noch das die Zip-Datei mit einem Passwort geschützt ist. Wie kann ich das machen ohne das ich das Passwort mit Parameter -Password <string> im Klartext in das Skript schreibe?
Danke schonmal im Voraus und viele Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3883201064
Url: https://administrator.de/contentid/3883201064
Ausgedruckt am: 24.11.2024 um 14:11 Uhr
8 Kommentare
Neuester Kommentar
Hi,
mal abgesehen davon, dass dieses Verfahren generell unsicher ist.
Wenn da ein Netzwerk ist:
Oder man legt das Passwort im HKCU eines dedizierten Benutzers ab, auf dem Rechner, wo das Skript laufen soll.
Der Haken hier: Ein Admin des Rechners kann sich Zugriff auf das HKCU dieses Benutzers verschaffen und dann das Passwort lesen.
Oder wie oben mit der Freigabe. Nur in der Freigabe eine VHDX erstellen. Diese mit Bitlocker verschlüsseln und als Protektor den ausführenden (dedizierten) Benutzer angeben. Dann kann dieser Benutzer die VHDX mounten (wenn er die lokalen Rechte hat) und diese wird automatisch entsperrt. Passwortdatei aus diesem Laufwerk einlesen und VHDX wieder abhängen.
Haken hier: Während die VHDX verbunden ist, kann ein lokaler Admin parallel das Laufwerk lesen.
So oder so: "Sicher" bekommst Du das auf diese Weise nicht hin.
E.
mal abgesehen davon, dass dieses Verfahren generell unsicher ist.
Wenn da ein Netzwerk ist:
- Skript unter einem dedizierten Konto laufen lassen
- dieses dedizierte Konto hat Zurgiff auf eine Netzwerkfreigabe bzw. einen Ordner darunter, wo wirklich nur dieses Konto zugreifen darf
- dort eine Datei mit dem Passwort ablegen
- Datei im Skript einlesen und in Variable schreiben
Oder man legt das Passwort im HKCU eines dedizierten Benutzers ab, auf dem Rechner, wo das Skript laufen soll.
Der Haken hier: Ein Admin des Rechners kann sich Zugriff auf das HKCU dieses Benutzers verschaffen und dann das Passwort lesen.
Oder wie oben mit der Freigabe. Nur in der Freigabe eine VHDX erstellen. Diese mit Bitlocker verschlüsseln und als Protektor den ausführenden (dedizierten) Benutzer angeben. Dann kann dieser Benutzer die VHDX mounten (wenn er die lokalen Rechte hat) und diese wird automatisch entsperrt. Passwortdatei aus diesem Laufwerk einlesen und VHDX wieder abhängen.
Haken hier: Während die VHDX verbunden ist, kann ein lokaler Admin parallel das Laufwerk lesen.
So oder so: "Sicher" bekommst Du das auf diese Weise nicht hin.
E.
ConvertTo-SecureString
ConvertFrom-SecureString
Das Kennwort kann dann nur der Account entschlüsseln welcher es verschlüsselt hat, unter diesem muss dann auch der Task bzw. Prozess laufen der es wieder entschlüsselt denn das Salt ist im Profil dieses User gespeichert welches wiederum durch das Kennwort des User-Accounts verschlüsselt ist.
Sid.
ConvertFrom-SecureString
Das Kennwort kann dann nur der Account entschlüsseln welcher es verschlüsselt hat, unter diesem muss dann auch der Task bzw. Prozess laufen der es wieder entschlüsselt denn das Salt ist im Profil dieses User gespeichert welches wiederum durch das Kennwort des User-Accounts verschlüsselt ist.
# zum Verschlüsseln in eine Datei speichern
read-host -prompt "Passwort eingeben" -AsSecureString | ConvertFrom-SecureString | out-file .\securepassword.txt
# zum Entschlüsseln
$decrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR((gc ".\securepassword.txt"| ConvertTo-SecureString)))
write-host "Decrypte das Password aus dem Inhalt der Datei,das Passwort lautet: '$decrypted'"
Sid.
dort eine Datei mit dem Passwort ablegen
Selbst diese lässt sich dort auslesen. Wenn man das Script auf der eigenen Platte hat und verändern kann, kann man nach dem Auslesen ganz einfach ein Echo der Variable machen.Der richtige Weg wäre also das Script dort abzulegen und auszuführen, wo kein anderer Zugang dazu hat, z.B. auf einem Server.
Zitat von @WaloscheffHellau:
Okay und jetzt habe ich eine Text Datei die ein kryptisches Passwort hat. Das binde ich jetzt mit $password in mein main skript ein?
Den ersten Teil führt man nur einmalig aus um die Textdatei mit dem verschlüsselten Passwort zu erzeugen, der zweite Teil kommt dann tatsächlich ins Skript um das Passwort aus der Textdatei wieder in Plaintext zu wandeln um dieses dann deiner ZIP-Routine zu übergeben.Okay und jetzt habe ich eine Text Datei die ein kryptisches Passwort hat. Das binde ich jetzt mit $password in mein main skript ein?
https://www.pdq.com/blog/secure-password-with-powershell-encrypting-cred ...
Habe ich doch oben eigentlich ausreichend erklärt wie die Routine im Userprofil abläuft, einfach nochmal in dich gehen dann checkst auch du es ...
Verstehe ich richtig? Es geht darum, dass das Passwort nicht lesbar im Script, welches die Prozedur aufruft, lesbar ist.
Also wer auch immer Zugriff auf die Datei/das Script hat, soll das Kennwort selbst nicht in die Hände bekommen
Ich dachte da grad dran, dass man das Powershell Script ja in eine Exe konvertieren kann (die man hoffentlich nicht so einfach entschlüsseln kann)
PS2EXE wäre da der Weg
Invoke-PS2EXE .\myscript.ps1 .\myscript.exe
Also wer auch immer Zugriff auf die Datei/das Script hat, soll das Kennwort selbst nicht in die Hände bekommen
Ich dachte da grad dran, dass man das Powershell Script ja in eine Exe konvertieren kann (die man hoffentlich nicht so einfach entschlüsseln kann)
PS2EXE wäre da der Weg
Invoke-PS2EXE .\myscript.ps1 .\myscript.exe
"Security-by-Obscurity" war noch nie eine gute Idee ...