joe2017
Goto Top

Daten mit Powershell verschlüsseln

Hallo zusammen,

ich muss einen Ordner mit allen Inhalten bzw. einen ganzen USB Stick verschlüsseln.
Da der Stick an mehrere Personen geht und an verschiedenen PC´s verwendet werden wird, dachte ich an ein Powershell Script.

Bitlocker & Zertifikate würde ich ausschließen, da es sich um keine User mit IT Kenntnissen handelt.

Hat jemand eine Idee wie ich das am besten lösen kann?
Geht so etwas mit einem Powershell Script in welchem ich ein Passwort zum ver- und entschlüsseln eingeben kann?

Content-ID: 1002424069

Url: https://administrator.de/forum/daten-mit-powershell-verschluesseln-1002424069.html

Ausgedruckt am: 22.12.2024 um 11:12 Uhr

Tezzla
Tezzla 14.07.2021 um 17:22:01 Uhr
Goto Top
Mahlzeit.

Ich würde trotzdem mal Bitlocker in den Raum werfen. Man kann's doch so einstellen, dass man nur einen PIN eingeben muss, um den USB Stick zu entschlüsseln, der via Popup abgefragt wird. Das kriegt doch eigentlich ein Affe mit Hut hin, oder nich?

VG
joe2017
joe2017 14.07.2021 um 20:07:12 Uhr
Goto Top
Das Problem dabei ist, dass die User den Stick selber verschlüsseln und entschlüsseln müssen.
Daher dachte ich an ein Powershell Script. Alles andere wird wahrscheinlich nicht erwartbar sein.

Ein Script ausführen wird jeder hinbekommen. face-wink
Benandi
Benandi 15.07.2021 um 00:33:45 Uhr
Goto Top
Hallo joe2017,

das Thema ist nicht wirklich mein Bereich, doch vielleicht kann ich Anregungen geben. Der Knackpunkt wird (so wie ich die Ausgangslage momentan interpretiere) in vielen Fällen der Schlüssel und der Umgang damit sein. Manche Varianten funktionieren nur an dem Host, an dem die Verschlüsselung durchgeführt wurde. Für dich ist der wichtigste Aspekt scheinbar "Benutzerfreundlichkeit". Im Umkehrschluss darf also viel Zeit in das Backend / die Konfiguration fließen :p
Nein, im Ernst: welchen Aufwand darfst und willst du überhaupt treiben?

Der Ansatz von @Tezzla ist eine Überlegung wert und würde die User sicherlich nicht zu sehr fordern.
Grundsätzlich wäre dank @DerWoWusste das hier vielleicht eine Inspiration: Meine Wissenssammlung zu Bitlocker)
Ebenfalls könnte VeraCrypt, BitLocker2Go, eine andere Freeware bzw. kommerzielle oder die vom Hersteller des USB-Sticks mitgelieferte "Software für Verschlüsselung" eine Option sein.
Dann gibt es noch USB-Sticks, die eingebaute Sicherheitschips und je nach Umsetzung ein eigenes Tastenfeld haben (z. B. Kingston DataTraveler 2000 oder 4000).
Was aber konkret für dich sinnig ist, steht derzeit noch in den Sternen ;)

Magst du noch ein wenig mehr über das Szenario und Umfeld schreiben? Das hilft sehr, zielgerichtet zu antworten. Auch fallen dann "automatisch" Optionen weg oder kommen hinzu. Mir persönlich sind z. B. noch folgende Sachen unklar:

- Alles innerhalb eines Unternehmens? Sind externe Personen beteiligt?
- Warum geht "nur" ein USB-Stick? Wären Netzlaufwerke mit entsprechender Zugangsbeschränkung eine Option?
- Wie ist der Ablauf oder Arbeitsprozess während der Nutzung (exemplarisch "User steckt USB-Stick ein, entschlüsselt ihn, macht sein Ding, verschlüsselt ihn danach, steckt ihn ab und übergibt den Stick der nächsten Person (die damit das Gleiche in Grün tut)")?
- Ist der Benutzerkreis eher fix oder eher wechselnd?
- Was passiert, wenn der USB-Stick kaputt oder verloren geht?
- Wie gut kennst du dich selbst mit der Materie aus? Stichwort Support.
- Ist schon irgendwas mit Schwerpunkt "Endpoint Security" im Einsatz? Solche Lösungen bringen manchmal auch Verschlüsselungsoptionen für Wechselmedien mit.
- Da du PowerShell und BitLocker erwähnst: sind nur Windows Geräte im Spiel? Wenn ja, was habt ihr an Lizenzen für die Betriebssysteme ("SBS" / "Home" oder besser)?
- Ist ein AD vorhanden und in Nutzung?
- Gibt es eine Zertifikatsstelle?
- Fat- oder Thinclients?
- Stehen Eingabegeräte für biometrische Authentifizierung zur Verfügung?
joe2017
joe2017 15.07.2021 um 07:00:05 Uhr
Goto Top
Schönen guten Morgen und danke für die ausführliche Antwort.

Das Problem wurde mir nur von einem Bekannten herangetragen.
Die Benutzung findet leider nicht nur an einem Standort statt. Somit ist auch nicht ganz klar welche Betriebssysteme (Windows XP/Vista/7/10) zum Einsatz kommen. Hier sind unter anderem auch Private PC´s dabei was das ganze Thema recht kompliziert machen wird.

Ich denke das ein Stick mit entsprechender Software sicherlich ein guter Ansatz wäre.
Ich dachte das es mit Powershell vielleicht eine einfache Möglichkeit gibt. Aber dem ist leider nicht so.

Daher werde ich das Ticket schließen und bedanke mich bei euch allen.
BirdyB
BirdyB 15.07.2021 um 07:49:49 Uhr
Goto Top
Wie wäre es denn direkt mit verschlüsselten USB-Sticksß https://www.kingston.com/germany/de/usb-flash-drives/datatraveler-2000-e ...
VG
148656
148656 15.07.2021 um 08:56:47 Uhr
Goto Top
Moin @joe2017,

Ein Bekannter also. Warum warst Du nicht ehrlich zu ihm und hast gesagt: "Puh, knifflige Frage. Melde Dich doch bei Administrator.de an und stelle Sie dort. Mir wird dort auch immer geholfen." ? Du solltest doch Wissen, dass "stille Post" immer Kontraproduktiv ist. Informationen gehen immer Verloren, wenn Sie nicht aus erster Hand kommen. Wenn du ihm wirklich helfen willst, verweise auf diesen Lesestoff.

USB-Sticks an einem Privat-Rechner stecken und dann an einen Firmen-Rechner? Den Mitarbeitern würde ich die Hand mit einem Lineal bearbeiten. In einer Klosterschule ist dies ja auch gängige Praxis. face-smile
Wenn das nicht hilft, nehme ich ihm die Maus weg. face-big-smile

Des Weiteren hast du einen "Beitrag" geschrieben und kein "Ticket" geöffnet.
Bei einem Ticket, würde jeder First-Level-Mitarbeiter das Teil einfach Schließen. Begründung: Mangelnde Informationen.

Gruß
C.C.
schicksal
schicksal 15.07.2021 um 09:33:13 Uhr
Goto Top
Wie wäre es für den Fall mit einen verschlüsselten Zip Container (7Zip)
Hier ist man OS unabhängig, 7Zip kann man scripten.

Das einzige das Zip ist sichtbar und löschbar.
DerWoWusste
DerWoWusste 15.07.2021 um 12:05:33 Uhr
Goto Top
Moin.

Das Problem dabei ist, dass die User den Stick selber verschlüsseln und entschlüsseln müssen.
Und das Rechtsklicken auf den USB-Stick "Bitlocker aktivieren" ist wirklich zuviel verlangt? Einfacher als das Skript, meiner Ansicht nach.
clSchak
clSchak 15.07.2021 um 12:49:02 Uhr
Goto Top
Hi

Bitlocker, verschlüssle die Geräte vor Herausgabe und versende die dann, der Aufwand hält sich absolut in Grenzen. Wir haben für einen großen Teilbereich rund 200 USB Sticks so vorbereitet und jedem Stick ein eigenes Kennwort / eigenen PIN gegeben, da war unser Azubi mit einem Praktikanten gut ein Tag mit beschäftigt.

Hat als netten Nebeneffekt den Vorteil, das man den Wiederherstellungsschlüssel vorliegen hat und der Benutzer ggf. das Passwort selbst ändern kann, sobald die Leute, vor allem unerfahrene, da selbst Hand anlegen, kann es am Ende schnell zu Problemen kommen.

Bestimmte Personengruppen bei uns können unverschlüsselte Sticks nur lesen, wenn man schreiben möchte, muss Bitlocker aktiviert werden, die Restore-Information werden dann zurück ins SCCM geschrieben (mein aktueller Wissensstand, ist nicht mein Fachbereich bei uns).

Bitlocker ist in dem dargestellten Szenario die Wahl Nr. 1, 100% kompatibel zu Windows 7 - 10, keine extra Software nötig und Anwendung kinderleicht, alles andere mit extra Tools macht die Sache nur komplizierter.

Just my 2 Cent
@clSchak
DerWoWusste
DerWoWusste 15.07.2021 um 14:19:35 Uhr
Goto Top
@clSchak
Da kann ich nur zustimmen, bis auf:
100% kompatibel zu Windows 7 - 10
Das gilt nur, wenn man, falls man Win10 zum Verschlüsseln benutzt, AES256 nutzt und nicht XTS_AES, welches Win7/8.x gar nicht lesen können.
clSchak
clSchak 15.07.2021 um 15:50:22 Uhr
Goto Top
XTS_AES muss aber vorher via Registrie definiert werden, soweit mein Wissensstand jetzt ist. "per se" ist ja AES128 aktiv in Bitlocker ohne manuellen Eingriff, es sei denn es wurde in den letzten Releases von Win10 angepasst.
colinardo
colinardo 16.07.2021 aktualisiert um 11:56:51 Uhr
Goto Top
Zitat von @joe2017:
Geht so etwas mit einem Powershell Script in welchem ich ein Passwort zum ver- und entschlüsseln eingeben kann?
Servus.
Ohne jetzt Vor- und Nachteile diskutieren zu wollen, das haben ja die Kollegen schon übernommen, trotzdem noch etwas praktischer Code der sich einzig und allein auf den Thread-Titel bezieht.
Persönlich würde ich da auch zu fertigen Lösungen(s.o.) greifen oder wenn komfortabel dann zumindest das ganze als c# zu verpacken um dem User das Mit Executionpolicy & Co zu ersparen.

Die beiden Funktionen (Encrypt-File / Decrypt-File) Verschlüsseln symmetrisch mit AES-256 mit Passwort und anpassbarem Salt und bieten zusätzlich die Option das Original gleich zu "schreddern" also mit Nullen oder Random-Data zu überschreiben, und arbeiten nativ auch in der Pipeline von Get-ChildItem.

Wer's gebrauchen kann, gerne bedienen oder auch an seine Bedürfnisse anpassen.
function Encrypt-File {
    [cmdletbinding(SupportsShouldProcess=$true)]
    param(
        [Parameter(mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][ValidateNotNullOrEmpty()][ValidateScript({Test-Path $_})][Alias('FullName')][string[]]$path,  
        [Parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$password,
        [Parameter(mandatory=$false)][ValidateNotNullOrEmpty()][string]$salt='jj3h4h5+tbbj2j281273#+',  
        [Parameter(mandatory=$false,HelpMessage='Overwrites original with zeros and finally deletes the file.')][ValidateNotNullOrEmpty()][switch]$shredoriginal,  
        [Parameter(mandatory=$false)][ValidateNotNullOrEmpty()][ValidateSet('Zeros','RandomData')][string]$shredmethod = 'Zeros',  
        [Parameter(mandatory=$false)][ValidateNotNullOrEmpty()][switch]$force
    )
    begin{
        $p = new-Object System.Security.Cryptography.AesManaged
        $p.Key = (new-Object Security.Cryptography.PasswordDeriveBytes ([Text.Encoding]::UTF8.GetBytes($password)), ([Text.Encoding]::UTF8.GetBytes($salt)), "SHA256", 5).GetBytes(32) #256/8  
	    $p.IV = (new-Object Security.Cryptography.SHA256Managed).ComputeHash([Text.Encoding]::UTF8.GetBytes($salt))[0..15]
        $encryptor = $p.CreateEncryptor()
        if ($shredoriginal.IsPresent){
            $shredcollection = New-Object System.Collections.ArrayList
        }
    }
    process{
        foreach($file in $path){
            $fsEncrypt = $null
            $csEncrypt = $null
            $fsRead = $null
            try{
                if ($pscmdlet.ShouldProcess($file, "Encrypt file")){  
                    $fileout = "$file.encrypt"  
                    if ((Test-Path $fileout) -and !$force.IsPresent){
                        throw "File '$fileout' already exists, to overwrite the file regardless if it exists, use the -force switch!"  
                    }
                    $fsEncrypt = New-Object System.IO.FileStream $fileout, "Create"  
                    $csEncrypt = New-Object Security.Cryptography.CryptoStream $fsEncrypt,$encryptor,"Write"  
                    $fsRead = New-Object System.IO.FileStream $path, "Open"  
                    $fsRead.CopyTo($csEncrypt)
                    $fsRead.Close()
                    $csEncrypt.Close()
                    $fsEncrypt.Close()
                    if ($shredoriginal.IsPresent){
                        [void]$shredcollection.Add($file)
                    }
                    return (gi $fileout)
                }
            }catch{
                Write-Error $_.Exception.Message
            }finally{
                if($fsEncrypt){$fsEncrypt.dispose()}
                if ($csDecrypt){$csDecrypt.Dispose()}
                if ($fsRead){$fsRead.Dispose()}
            }
        }
    }
    end{
        if ($shredoriginal.IsPresent){
            if ($pscmdlet.ShouldProcess('all above files','Shred files')){  
                $crypto = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
                foreach ($file in $shredcollection){
                    $fs = $null
                    try{
                        $fs = New-Object System.IO.FileStream $file, ([System.IO.FileMode]::Open)
                        $data = $null
                        switch($shredmethod){
                            'Zeros' {  
                                $data = New-Object 'Byte' $fs.Length  
                            }
                            'RandomData' {  
                                $data = New-Object 'Byte' $fs.Length  
                                $crypto.GetBytes($data)
                            }
                        }
                        $fs.Write($data,0,$data.Length)
                        $fs.Close()
                        del $file -Force
                    }catch{
                        Write-Error $_.Exception.Message
                    }finally{
                        if ($fs){$fs.Dispose()}
                    }
                }
            }
        }
        $p.Clear()
    }
}

function Decrypt-File {
    [cmdletbinding(SupportsShouldProcess=$true)]
    param(
        [Parameter(mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][ValidateNotNullOrEmpty()][ValidateScript({Test-Path $_})][Alias('FullName')][string[]]$path,  
        [Parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$password,
        [Parameter(mandatory=$false)][ValidateNotNullOrEmpty()][string]$salt='jj3h4h5+tbbj2j281273#+',  
        [Parameter(mandatory=$false,HelpMessage='Deletes encrypted file after successfull decryption')][switch]$DeleteEncrypted,  
        [Parameter(mandatory=$false)][switch]$force

    )
    begin{
        $p = new-Object System.Security.Cryptography.AesManaged
        $p.Key = (new-Object Security.Cryptography.PasswordDeriveBytes ([Text.Encoding]::UTF8.GetBytes($password)), ([Text.Encoding]::UTF8.GetBytes($salt)), "SHA256", 5).GetBytes(32) #256/8  
	    $p.IV = (new-Object Security.Cryptography.SHA256Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($salt) )[0..15]
        $decryptor = $p.CreateDecryptor()
    }
    process{
        $fsReadDecrypt = $null
        $fsWriteDecrypt = $null
        $csDecrypt = $null
        foreach ($file in $path){
            try{
                if ($pscmdlet.ShouldProcess($file, "Decrypt file")){  
                    $fileout = $file -replace '\.encrypt$'  
                    if ((Test-Path $fileout) -and !$force.IsPresent){
                        throw "File '$fileout' already exists, to overwrite the file regardless if it exists, use the -force switch!"  
                    }
                    $fsReadDecrypt = New-Object System.IO.FileStream $path, "Open"  
                    $fsWriteDecrypt = New-Object System.IO.FileStream $fileout, "Create"  
                    $csDecrypt = New-Object Security.Cryptography.CryptoStream $fsReadDecrypt,$decryptor,"Read"  
                    $csDecrypt.CopyTo($fsWriteDecrypt)
                    $csDecrypt.Close()
                    $fsReadDecrypt.Close()
                    $fsWriteDecrypt.Close()
                
                    if ($DeleteEncrypted.IsPresent){
                        del $file -Force
                    }
                    return (gi $fileout)
                }
            }catch [System.Security.Cryptography.CryptographicException] {
                Write-Error "Password is not incorrect." -Category InvalidArgument  
            }catch{
                Write-Error $_.Exception.Message
            }finally{
                if ($fsReadDecrypt){$fsReadDecrypt.Dispose()}
                if ($fsWriteDecrypt){$fsWriteDecrypt.Dispose()}
                if ($csDecrypt){$csDecrypt.Dispose()}
            }
        }
    }
    end{
        $p.Clear()
    }
}

# Encrypt some files
#ls 'D:\data' -File -Filter *.jpg | Encrypt-File -password 'Passw0rd' -force -shredoriginal  

# Decrypt some files
#ls 'D:\data' -File -Filter *.encrypt | Decrypt-File -password 'Passw0rd' -force  
Grüße Uwe
clSchak
clSchak 16.07.2021 um 11:32:47 Uhr
Goto Top
ich bin mir immer noch nicht sicher ob @colinardo ein Bot ist ... fasziniert mich immer wieder wie und aus "dem ff" das fertige Script herauskommt, ich warte bei uns immer eine Ewigkeit auf die Entwickler wenn Ich nur eine Kleinigkeit haben möchte face-smile
colinardo
colinardo 16.07.2021 aktualisiert um 11:39:53 Uhr
Goto Top
Zitat von @clSchak:

ich bin mir immer noch nicht sicher ob @colinardo ein Bot ist ...
rrr...klck...ratrat...zisch...summmm, Daten zu unspezifisch, bitte Eingabe wiederholen ... face-smile.
DerWoWusste
DerWoWusste 16.07.2021 um 11:56:52 Uhr
Goto Top
ich bin mir immer noch nicht sicher ob @colinardo ein Bot ist
Wo findet man denn Bots, die was auf dem Kasten haben?
colinardo
colinardo 16.07.2021 aktualisiert um 12:02:27 Uhr
Goto Top
Zitat von @DerWoWusste:
Wo findet man denn Bots, die was auf dem Kasten haben?
Evt. nicht auf aber vielleicht im "B(r)otkasten" 🙈
DerWoWusste
DerWoWusste 16.07.2021 um 12:36:31 Uhr
Goto Top
Oha, Flachwitz des Monats...
Genug offtopic face-smile Schönes WE