waloscheffhellau
Goto Top

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

Content-ID: 3883201064

Url: https://administrator.de/contentid/3883201064

Printed on: September 1, 2024 at 06:09 o'clock

emeriks
emeriks Sep 26, 2023 at 07:02:32 (UTC)
Goto Top
Hi,
mal abgesehen davon, dass dieses Verfahren generell unsicher ist.

Wenn da ein Netzwerk ist:
  1. Skript unter einem dedizierten Konto laufen lassen
  2. dieses dedizierte Konto hat Zurgiff auf eine Netzwerkfreigabe bzw. einen Ordner darunter, wo wirklich nur dieses Konto zugreifen darf
  3. dort eine Datei mit dem Passwort ablegen
  4. Datei im Skript einlesen und in Variable schreiben
Der Haken hier: Ein Admin des Fileservers kann sich Zugriff auf die Datei verschaffen.

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.
7907292512
Solution 7907292512 Sep 26, 2023 updated at 07:32:02 (UTC)
Goto Top
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.

# 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.
WaloscheffHellau
WaloscheffHellau Sep 26, 2023 at 07:34:05 (UTC)
Goto Top
Zitat von @7907292512:

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.

# 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.


Okay und jetzt habe ich eine Text Datei die ein kryptisches Passwort hat. Das binde ich jetzt mit $password in mein main skript ein?
NordicMike
NordicMike Sep 26, 2023 at 07:36:46 (UTC)
Goto Top
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.
WaloscheffHellau
WaloscheffHellau Sep 26, 2023 at 07:37:36 (UTC)
Goto Top
Zitat von @NordicMike:

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.

Ich lass es auf einem physischen Server bei uns laufen ...
7907292512
7907292512 Sep 26, 2023 updated at 07:45:17 (UTC)
Goto Top
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.
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 ...
139689
139689 Sep 28, 2023 at 11:43:13 (UTC)
Goto Top
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
7907292512
7907292512 Sep 28, 2023 updated at 11:46:22 (UTC)
Goto Top
"Security-by-Obscurity" war noch nie eine gute Idee ...