
Nogle gange er vi nødt til at køre baggrunds job på computere eller virtuelle maskiner, og disse job kan kræve adgang til visse ressourcer eller tjenester, der er beskyttet med adgangskode (eller beskyttet ved hjælp af enhver anden hemmelighed). I sådanne tilfælde er hårdkodning af adgangskoden inde i selve koden ikke ideel og bør undgås for enhver pris.
Forestil dig at køre et PowerShell-script i baggrunden, der uploader filer til en sikker fildeling på daglig basis. Enhver grundlæggende (ikke-administrator) bruger, der kan læse scriptet, vil være i stand til at læse adgangskoden og uploade deres egne filer til den sikre butik eller endnu værre slette filer.
Der bør tages skridt til i det mindste at kryptere hemmelighederne, så de ikke opbevares som almindelig tekst i selve scriptet.
Denne blog vil dække, hvordan man gør det. Jeg har kørt disse PowerShell-kommandoer i MacOs, men disse fungerer også i Windows. Ikke testet i Linux.
Forudsætninger
- En PowerShell-terminal i Windows eller MacOs.
Du vil lære
- Sådan krypteres og dekrypteres data ved hjælp af PowerShell.
Brugte PowerShell-kommandoer
ConvertFrom-SecureString – Krypter data.
ConvertTo-SecureString – Dekrypter data.
Read-Host – Læs input som en sikker streng.
RNGCryptoServiceProvider.GetBytes – RNGCryptoServiceProviders GetBytes-metode vil blive brugt til at oprette en krypteringsnøgle, som vil blive brugt til kryptering og dekryptering.
Marshal.SecureStringToBSTR og Marshal.PtrToStringBSTR – Konverter sikker streng til almindelig tekst.
Kryptering af data
Indtast de data, vi skal bruge for at kryptere i en variabel kaldet “PasswordSecureString”. Dette vil bede dig om at indtaste adgangskoden eller hemmeligheden, som du skal kryptere, og den vil blive gemt i variablen. Kør følgende kommando.
$PasswordSecureString = Read-Host -AsSecureString
Lad os kryptere dataene ved at bruge følgende kommando og gemme dem i variabel “EncryptedData”.
$EncryptedData = ConvertFrom-SecureString $PasswordSecureString
Variablen gemmes stadig kun i den aktuelle terminalsessionshukommelse. Hvis vinduet lukkes, vil variablen blive ødelagt, så skriv krypterede data ind i en fil med kommandoen nedenfor. Du kan bruge et hvilket som helst filnavn her. Udfør følgende kommando med din filsti, og en fil vil blive oprettet i den angivne filsti.
$EncryptedData | Out-File -FilePath "/Users/T365/Desktop/secret.encrypted"
Bemærk: Hver kommando ovenfor blev udført én efter én for at lette forståelsen. Alt kan udføres i en one liner ved hjælp af Powershell pipelines (|) som nedenfor.
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath "/Users/T365/Desktop/secret.encrypted"
Nu er adgangskoden eller hemmeligheden sikkert gemt i filen “secret.encrypted”, og den kan ikke læses, selvom filen er åbnet. Hvis nogen vil bruge eller se adgangskoden, skal der køres et PowerShell-dekrypteringsscript for at se det. Så en grundlæggende bruger, der ikke har adgang til at udføre scripts, vil ikke kunne se dette.
Dekryptering af data
- Læs “secret.encrypted” filen og gem indholdet i en variabel “EncryptedData” ved hjælp af nedenstående kommando.
$EncryptedData = Get-Content “/Users/T365/Desktop/secret.encrypted”
- Dekrypter dataene og få den sikre streng tilbage til en variabel “PasswordSecureString” ved hjælp af nedenstående kommando.
$PasswordSecureString = ConvertTo-SecureString $EncryptedData
- $PasswordSecureString er et SecureString-objekt, og det skal konverteres til almindelig tekst. Brug følgende kommando til at gemme almindelig tekst i variabel “PlainTextPassword”.
$PlainTextPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PasswordSecureString))
- Kør følgende kommando for at se adgangskoden i almindelig tekst.
$PlainTextPassword
Fra dette tidspunkt og fremefter kan adgangskoden eller hemmeligheden bruges i det script, der kræves for at have det.
Hvornår skal man bruge en krypteringsnøgle
En krypteringsnøgle blev ikke brugt i krypteringsprocessen udført i det foregående afsnit. Da vi ikke specificerede en krypteringsnøgle, kan dekrypteringsprocessen kun udføres med den samme brugerkonto, som krypterede dataene.
Dekrypteringen vil mislykkes, hvis
- En anden brugerkonto forsøger at dekryptere.
- Hvis brugerkontoens adgangskode ændres, hvilket blev brugt til at kryptere dataene.
Som du kan se, er det normalt bedre altid at give en krypteringsnøgle, da det løser ovenstående problemer.
Oprettelse af en krypteringsnøgle
- Udfør følgende kommando og opret krypteringsnøglen til filen “encryption.key”.
$EncryptionKeyBytes = New-Object Byte[] 32 [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($EncryptionKeyBytes) $EncryptionKeyBytes | Out-File "/Users/T365/Desktop/encryption.key"
Bemærk: Denne nøgle skal opbevares på et sikkert sted. Opbevar dette på en lokal brugerkontospecifik placering eller begræns adgangen til den ved hjælp af ACL’er. Hvis dette opbevares i en offentlig mappe, er det meningsløst at oprette dette i første omgang.
Krypter med krypteringsnøgle
- Det eneste yderligere trin, vi skal gøre, er at angive krypteringsnøglen som en parameter til kommandoen “ConvertFrom-SecureString”.
$EncryptionKeyData = Get-Content "/Users/T365/Desktop/encryption.key" Read-Host -AsSecureString | ConvertFrom-SecureString -Key $EncryptionKeyData | Out-File -FilePath "/Users/T365/Desktop/secret.encrypted"
Dekrypter med krypteringsnøgle
- På samme måde som kryptering skal krypteringsnøglen leveres til kommandoen “ConvertTo-SecureString” som en parameter.
$EncryptionKeyData = Get-Content "/Users/T365/Desktop/encryption.key" $PasswordSecureString = Get-Content "/Users/T365/Desktop/secret.encrypted" | ConvertTo-SecureString -Key $EncryptionKeyData $PlainTextPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($PasswordSecureString))
- Kør følgende kommando for at se adgangskoden i almindelig tekst.
Oversigt
Kryptering af adgangskoder eller hemmeligheder, der er nødvendige for PowerShell-scripting, er altid en god praksis sammenlignet med hårdkodning af dem i selve scriptet. Nu ved du, hvordan det kan gøres med forholdsvis mindre indsats.
Nice scripting!
Referencer
ConvertFrom-SecureString (Microsoft.PowerShell.Security) – PowerShell
ConvertFrom-SecureString cmdlet’en konverterer en sikker streng (System.Security.SecureString) til en krypteret standard…
docs.microsoft.com
ConvertTo-SecureString (Microsoft.PowerShell.Security) – PowerShell
ConvertTo-SecureString-cmdlet’en konverterer krypterede standardstrenge til sikre strenge. Det kan også konvertere almindeligt…
docs.microsoft.com
Read-Host (Microsoft.PowerShell.Utility) – PowerShell
Read-Host-cmdlet’en læser en linje med input fra konsollen (stdin). Du kan bruge den til at bede en bruger om input. Fordi…
docs.microsoft.com
RNGCryptoServiceProvider.GetBytes-metoden (System.Security.Cryptography)
GetBytes(Byte[]) Fylder et array af bytes med en kryptografisk stærk sekvens af tilfældige værdier. offentlig: tilsidesætte…
docs.microsoft.com
Skriv en kommentar
Se kommentarer