Windows PowerShell – jak digitálně podepsat skript

Výchozí nastavení Windows PowerShell zakazuje z bezpečnostních důvodů spouštění všech skriptů a je možné spouštět jen příkazy z “příkazového řádku” Windows PowerShell. Pokud chcete toto nastavení změnit, je třeba otevřít konzolu Windows PowerShell s právem administrátora a pomocí cmdlet Set-ExecutionPolicy toto nastavení změnit. Možné hodnoty jsou:

  • Unrestricted – povoluje spouštění všech skriptů.
  • RemoteSigned – vyžaduje digitální podpis u skriptů, které nepocházejí z lokálního počítače. Toto je doporučené nastavení.
  • AllSigned – všechny skripty, i z lokálního počítače, musejí být podepsané.
  • Restricted – je zakázáno spouštět všechny skripty, kromě “ručně zadaných” do Windows PowerShell konzole. Toto je výchozí nastavení.

Možnost digitálně podepsat, typicky administrační skript, velmi zvyšuje bezpečnost systému před napadením podvrženým skriptem. Digitální podpis skriptu, kromě ověření autora, zajišťuje i kontrolu konzistence, takže není možné spustit skripty, které někdo upravil po podepsání. Pro podepisování skriptů musíte použít certifikát, které je vystaven pro účely podepisování kódu:

Certificate01

Takovéto certifikáty vydává většina certifikačních autorit, ale nejsou úplně levné. Pokud potřebujete zejména hlídat konzistenci skriptů, které jste si vytvořili pro vlastní účely, můžete si za tímto účelem vytvořit vlastní certifikační autoritu pro podepisování skriptů pomocí aplikace makecert.exe.

Vytvoření kořenové certifikační autority (spustit jako administrátor)":

makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cert -ss Root -sr localMachine

Zadejte heslo pro privátní klíč certifikační autority:

Certificate02 

Nově vytvořenou certifikační autoritu najdete mezi důvěryhodnými kořenovými certifikačními úřady:

Certificate03

Dále je potřeba vytvořit certifikát, kterým budeme podepisovat naše skripty. Tento certifikát se samozřejmě vyhodnotí jako platný, pouze na počítači, kde je nainstalován příslušný kořenový certifikát. Pokud jste zadali heslo pro soukromý klíč, budete vyzváni k jeho zadání.

makecert -pe -n "CN=PowerShell Scripts" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cert -ss MY

Vytvořený certifikát nejdete mezi osobními certifikáty:

Certificate04

Certificate05

Seznam certifikátů, určených pro podepisování skriptů, zjistíte následujícím kódem:

Get-ChildItem cert:\CurrentUser\My –CodeSigning

Jako výsledek získáte seznam všech dostupných certifikátů pro účel podepisování kódu. Pro vlastní podepsání skriptu si musíte vybrat jen jeden:

$cert = @(Get-ChildItem cert:\CurrentUser\My -CodeSigning)[0]

Vlastní podepsání se dělá pomocí cmdlet Set-AuthenticodeSignature":

Set-AuthenticodeSignature file.ps1 $cert

Podpis se přidává na konec souboru se skriptem:

Certificate07

Štěpán