Podepisování skriptů prostředí PowerShell

I ❤️ PowerShell. Je to opravdu užitečný nástroj pro automatizaci těch úloh, které děláte vícekrát. Ale může být také zející bezpečnostní dírou, pokud mu to dovolíte.

PowerShell umožňuje spravovat téměř vše v počítači, a tak může někdo, kdo je schopen spouštět škodlivé skripty ve vašem prostředí, napáchat spoustu škod.

Předtím byl omezen pouze na systém Windows, od verze 6 a nyní po vydání PowerShellu 7.0 jej lze nasadit také v systémech Linux a MacOS. Tento článek však hovoří o zásadách spouštění, které nelze měnit v prostředích jiných než Windows, takže uživatelům Linuxu/MacOS nepřinese žádný užitek (omlouváme se).

Zásady spouštění

Jedním ze způsobů, jak můžete omezit možnost spouštění skriptů v prostředích Windows, je použití zásad spouštění prostředí PowerShell. Tldr je lze použít k omezení skriptů, které se budou v prostředí spouštět. K dispozici jsou tyto možnosti od nejméně bezpečné po nejbezpečnější:

Obejít

Nic není blokováno.

Neomezené (platí vždy na počítačích bez systému Windows)

Stejné jako ByPass, ale před spuštěním skriptů z internetu vyzve uživatele.

RemoteSigned (výchozí pro servery se systémem Windows)

Skripty stažené z internetu lze spustit pouze v případě, že jsou podepsané. Skripty napsané na počítači lze spustit

AllSigned

Všechny skripty musí být před spuštěním podepsány

Restricted (výchozí pro klienty Windows)

Zabrání spuštění skriptů. Lze spouštět pouze jednotlivé příkazy.

Spouštění skriptů

Chcete tedy na serveru spouštět vlastní skripty PowerShell. Ale zobrazuje se vám PSSecurityException jako následující.

PS C:\Users\Administrator\Downloads> .\wibble.ps1.\wibble.ps1 : File .\wibble.ps1 cannot be loaded. The file.\wibble.ps1 is not digitally signed. You cannot run this script on the current system.For more information about running scripts and setting execution policy, see about_Execution_Policies athttp://go.microsoft.com/fwlink/?LinkID=135170.At line:1 char:1+ .\wibble.ps1+ ~~~~~~~~~~~~ + CategoryInfo : SecurityError: (:) , PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
Vstup do celoobrazovkového režimu Ukončení celoobrazovkového režimu

Jedním ze způsobů, jak tento problém vyřešit, je změnit zásady spouštění pomocí příkazu Set-ExecutionPolicy a snížit zabezpečení počítače. To je obecně špatný nápad.

Osobně bych na serveru nikdy nepoužil nic méně bezpečného než RemoteSigned, ale ideálně AllSigned.

Co je to podpis skriptu?

Předpokládám, že chcete zachovat bezpečnost stroje a neotevřít zranitelnost, takže vám zbývá možnost podepsat skripty.

Podepsání skriptu znamená, že někdo, kdo má přístup k soukromému klíči certifikátu pro podepisování kódu, přidal na konec souboru skriptu blok podpisu.

function Get-Wibble { return "Wibble"}# SIG # Begin signature block# vpnIUpm2XxLRhU1no0iuA62xKxYzR6m95z9Ax21ppeTC9NoRd8ocoSGr1zAd# qlMOlz4lZoVWR4ZmtdCgzde1dVxzv4jjHb6ziDiY2o05UXswD2bl6XaOrUpd# Li0Qjg3d3y2r1nrpO8hos906bgXQswysvouegUJcpt8ftmqBKfEYNeBgnBFm# SIG # End signature block
Vstup do celoobrazovkového režimu Ukončení celoobrazovkového režimu

(pouze příklad. Blok podpisu je obvykle mnohem delší)

Blok podpisu bude obsahovat hash skriptu, který byl zašifrován pomocí soukromého klíče. Při pokusu o spuštění skriptu je tento dešifrován pomocí veřejného klíče a porovnán se skutečným hashem. Pokud se shoduje, můžeme potvrdit, že se skriptem nebylo manipulováno, protože jakmile by se tak stalo, hash by se změnil.

Samopodepisovací certifikáty

Pokud budou vaše skripty spouštěny pouze na počítačích ve vaší organizaci, pak pravděpodobně budete moci certifikáty podepisovat sami. Alternativou je utrácet $$$ a každý rok kupovat certifikát pro podepisování kódu.

Samopodepisování znamená, že si certifikát vygenerujete sami a skripty jím podepíšete.

Jak vytvořit samopodepisovací certifikát

PowerShell má velmi užitečný příkaz New-SelfSignedCertificate pro výrobu samopodepisovacích certifikátů. Ty pak můžeme exportovat a umístit do různých úložišť.

Příkaz ve výchozím nastavení vytvoří certifikát, jehož platnost vyprší po 1 roce. To můžete změnit pomocí parametru -NotAfter a zadáním data, kdy si přejete, aby platnost certifikátu vypršela.

Pro vytvoření certifikátu spusťte relaci prostředí PowerShell a spusťte následující příkaz

$CertificateName = Read-Host "Input your certificate name"$OutputPFXPath = "$CertificateName.pfx"$OutputCERPath = "$CertificateName.cer"$Password = Get-Credential -UserName Certificate -Message "Enter a secure password:"$certificate = New-SelfSignedCertificate -subject $CertificateName -Type CodeSigning -CertStoreLocation "cert:\CurrentUser\My"$pfxCertificate = Export-PfxCertificate $certificate -FilePath $OutputPFXPath -password $Password.passwordExport-Certificate -Cert $certificate -FilePath $OutputCERPathImport-PfxCertificate $pfxCertificate -CertStoreLocation cert:\CurrentUser\Root -Password $password.passwordWrite-Output "Private Certificate '$CertificateName' exported to $OutputPFXPath"Write-Output "Public Certificate '$CertificateName' exported to $OutputCERPath"
Vstup do celoobrazovkového režimu Ukončení celoobrazovkového režimu

Tím se vytvoří certifikát a vyexportuje se do dvou samostatných souborů s příponami .pfx a .cer.

PFX

Certifikát PFX je ten, který bude třeba nainstalovat na počítače, které budou provádět podepisování. V našem případě je to každý z našich vývojářských počítačů.

Měl by být nainstalován do úložiště cert:\CurrentUser\Root, známého také jako úložiště „Důvěryhodné kořenové certifikační autority“.

Tento soubor by měl být uložen na bezpečném místě. Heslo by pak mělo být zabezpečeno zvlášť (použijte správce hesel). Pokud se k oběma těmto souborům dostane zlý subjekt, pak může své škodlivé skripty podepisovat, jako byste to byli vy.

CER

Soubor certifikátu CER je to, co budete muset nainstalovat na počítače, na kterých budou skripty spuštěny. Jeho instalace nebude vyžadovat heslo, ale nelze jej použít k podepisování skriptů. Obsahuje pouze veřejný klíč, který se používá k dešifrování podpisu.

Protože neobsahuje soukromý klíč, lze tento certifikát volně distribuovat do všech prostředí, ve kterých budou skripty spuštěny.

Tento certifikát bude třeba nainstalovat do dvou úložišť certifikátů na počítačích, ve kterých budou skripty spuštěny: Úložiště cert:\LocalMachine\Root a cert:\LocalMachine\TrustedPublisher.

Podepisování skriptů

K podepisování skriptů slouží funkce Set-AuthenticodeSignature. Musíme předat cestu ke skriptu a certifikát z úložiště. Napsali jsme obalovou funkci, která dokáže skripty podepsat.

function Set-ScriptSignatures { param ( $pathToScripts = "." ) $certificateName = "PowerShell Signing Certificate" $scripts = Get-ChildItem -Path "$pathToScripts\*" -Include *.ps1, *.psm1 -Recurse $certificate = @(Get-ChildItem cert:\CurrentUser\My -codesign | Where-Object { $_.issuer -like "*$certificateName*" } ) foreach ($script in $scripts) { Write-Host "Signing $script" Set-AuthenticodeSignature $script -Certificate $certificate }}
Vstup do celoobrazovkového režimu Ukončení celoobrazovkového režimu

Proměnná $certificateName by měla obsahovat název použitý při vytváření certifikátu.

Funkci můžete použít tak, že zadáte cestu k adresáři, který obsahuje skripty, a ona je všechny projde ve smyčce a podepíše je.

Po instalaci skriptů na cílový počítač byste nyní měli být schopni spustit spuštění skriptů bez jakýchkoli problémů.

Proměnná proměnné

může být použita i v cílovém počítači.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.