Work with Windows PowerShell. Parameter “Execution Policy” and how to create a self-signed certificate.

По умолчанию, выполнение скриптов Windows PowerShell отключено. Различные политики (их всего 4) отвечают за возможность запуска как подписанных, так и неподписанных скриптов, которые могут быть как скачанными из Интернета, так и локальными.

Текущий уровень безопасности задаётся параметром «ExecutionPolicy», который можно изменить в реестре. Он расположен по следующему пути:

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftPowerShell1ShellIdsMicrosoft.PowerShell]

Однако, гораздо проще воспользоваться встроенной в саму консоль командой:

PS> Get-ExecutionPolicy Restricted PS> Set-ExecutionPolicy RemoteSigned

Параметр «ExecutionPolicy» может принимать следующие значения:

  • AllSigned - Все .ps1 и .ps1xml файлы должны иметь цифровую подпись. Это касается и конфигурационных файлов как для всей системы в целом, так и для конкретного пользователя. Если файл подписан и производится попытка его исполнения, то оболочка задаст вопрос о том, доверяете ли вы данному издателю и стоит ли запускать файлы, подписанные этим лицом (или организацией) в дальнейшем. Эта политика распространяется даже на файлы, которые созданы на вашей машине. Они тоже должны быть подписаны.
  • RemoteSigned - Файлы .ps1 и .ps1xml загруженные из сети с помощью программ Microsoft Outlook, Internet Explorer, Outlook Express или Windows Messenger и др. должны быть подписаны издателем, которому вы доверяете. Если файл имеет цифровую подпись и его попробовать запустить, то оболочка задаст вопрос о том, доверяете ли вы данному издателю и стоит ли запускать файлы, подписанные этим лицом или организацией в дальнейшем. Скрипты, которые являются локальными, запускаются без вывода запроса о доверии конкретному издателю и цифровой подписи не требуют.
  • Restricted - Исполнение скриптов запрещено. Данный запрет распространяется на системные и пользовательские файлы профилей. Данная политика включена по умолчанию. Загрузка конфигурационных файлов при старте возможна, однако они должны иметь цифровую подпись. В этом случае система спросит о возможности запуска сейчас и в дальнейшем скриптов подписанных этим лицом или организацией.
  • Unrestricted - Файлы могут не иметь цифровой подписи. Запуск файлов, скачанных из сети, будет сопровождаться предупреждающим сообщением. Для избавления от него необходимо выделить файл в explorer’е и, нажав правую кнопку мыши, выбрать пункт «Properties» (свойства) и нажать «Unblock» (разблокировать).

Сразу после установки в Windows PowerShell установлен режим Restricted, позволяющий работать с консолью только в интерактивном режиме. Посмотрим, что это нам даёт.

Сейчас у нас активна политика «по умолчанию» т.е. Restricted. Но поскольку файлы скриптов всё же запускать изредка необходимо, то придётся изменить её на AllSigned.

Windows(R) PowerShell Copyright (C) 2006 Microsoft Corporation. All rights reserved. PS C:Program FilesWindows PowerShellv1.0> cd c: PS C:> Get-ExecutionPolicy Restricted PS C:> Set-ExecutionPolicy AllSigned PS C:> Get-ExecutionPolicy AllSigned

Для начала напишем самый простой пример. Пускай это будет уже избитое обращение к списку процессов.

PS C:> get-process
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
170 6 5424 2188 41 0,59 3444 ccApp
288 6 3740 552 38 1,32 1576 ccEvtMgr
486 14 19780 14048 99 327,49 2468 explorer

В интерактивном режиме работы с консолью мы имеем право на выполнение команд. Попробуем запустить эту же команду из файла.

PS C:> more test.ps1 Get-Process PS C:> .test.ps1
The file C:test.ps1 cannot be loaded. The file C:test.ps1 is not digitally si gned.
The script will not execute on the system. Please see "get-help about_sig ning" for more details..
At line:1 char:10 + .test.ps1 < <<<
PS C:>

Как и ожидалось, нам погрозили пальцем. Ведь мы не имеем цифровой подписи. Ну что ж, придётся её создать. Тем более, нам говорят, в каком направлении глядеть документацию.

PS C:> get-help about_signing

Чтобы иметь возможность подписывать цифровой подписью скрипты, необходимо иметь соответствующий «сертификат». Они бывают двух типов: выданные третьей стороной (это компании вроде Verisign или Thawte и др.) или самоподписанный сертификат. Конечно, если есть лишние финансы, то можно получить сертификат и у этих компаний. Но мы постараемся обойтись малой кровью – сделаем себе сертификат сами.

Для начала нам понадобится программа makecert.exe, она входит в состав Microsoft .NET Framework SDK или Microsoft Windows Platform SDK. Так говорит встроенная справка в PowerShell, но данная программа включена и в Microsoft Office XP и лежит в папке

…Program FilesMicrosoft OfficeOffice10makecert.exe

Но есть небольшая оговорка – старые версии программы не поддерживают ключ -pe, а он нам понадобится для создания сертификата с экспортируемым приватным ключом.

Затем мы сохраним его в хранилище сертификатов Windows. Поэтому нужно проверить, поддерживает ли ваша версия этот ключ. Если нет, то скачиваем makecert версии 5.131.

Теперь создаём сертификаты.

makecert -n "CN=PowerShell Local Certificate Root" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv root.pvk root.cer -ss Root -sr localMachine
makecert -pe -n "CN=PowerShell User" -ss MY -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv root.pvk -ic root.cer

Результатом работы будут два файла: root.cer и root.pvk.

Из одного или нескольких сертификатов X.509 с помощью программы Cert2spc.exe производим создание сертификата издателя программного обеспечения (Software Publisher’s Certificate, SPC). Русскоязычную документацию по данной программе можно взять на сайте Майкрософт.

cert2spc.exe root.cer root.spc

Результатом работы будет файл root.spc являющийся сертификатом издателя программного обеспечения (SPC). Затем необходимо конвертировать его в файл типа PFX. Это файл обмена персональной информацией Personal Information Exchange (PFX), он защищён паролем. Вот его-то нам и необходимо, в конечном счёте, получить. Для этого скачиваем программу pvkimprt

Microsoft Windows [Version 5.2.3790] (C) Copyright 1985-2003 Microsoft Corp.
C:WINDOWS>PVKIMPRT.EXE -pfx d:WorkPowerShellcertroot.spc d:WorkPowerShellcertroot.pvk

После этого проверим, удачно ли всё прошло.

PS C:> dir cert:CurrentUserMy -codesign Directory: Microsoft.PowerShell.SecurityCertificate::CurrentUserMy Thumbprint Subject ---------- ------- 3CA81DA6487CDF1631F862FBAB2F3D0CF9C3F69D CN=PowerShell User

Да, всё нормально. Остаётся только подписать наш файл. Для этого возьмём из справочного руководства готовый пример кода.

## sign-file.ps1 ## Sign a file param([string] $file=$(throw "Please specify a filename.")) $cert = @(Get-ChildItem cert:CurrentUserMy -codesigning)[0] Set-AuthenticodeSignature $file $cert

Остаётся только в качестве переменной $file указать имя нашего файла. В результате получим файл следующего вида:

Get-Process
# SIG # Begin signature block # MIIEMwYJKoZIhvcNAQcCoIIEJDCCBCACAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
Вырезано без потери для смысла
# EbkzcLgFVmeXsiGLpeEO2AzfUVbJdhltMBlEPo383U+l66eTAMDuFtQaVI2pgMcz # cD2FEdSpU+PBojTim8ERjqvHKpTMIdQ= # SIG # End signature block

Попробуем его запустить… Нас спросят доверяем ли мы этому издателю. Да, мы себе доверяем и разрешаем и в дальнейшем запускать скрипты, подписанные этим издателем.

PS C:\> .\test.ps1
Do you want to run software from this untrusted publisher?
The file C:\test.ps1 is published by CN=PowerShell User. This publisher is not
trusted on your system. Only run scripts from trusted publishers.
[V] Never run  [D] Do not run  [R] Run once  [A] Always run  [?] Help
(default is "D"):a
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
171       5     5432       2572    41     0,62   3444 ccApp
288       6     3740        628    38     1,32   1576 ccEvtMgr
188       5     3552        832    31     0,92   1532 ccSetMgr

Однако если мы выложим свой подписанный файл в открытый доступ и кто-то его скачает, то при включённой политике AllSigned он получит следующее предупреждение:

PS C: > . test.ps1
The file C: test.ps1 cannot be loaded. The signature of the
certificate can not be verified.
At line:1 char:11
+ . test.ps1 < <<<

Т.к. он подписан не вами, то и доверия к нему нет никакого. Поэтому придётся его просмотреть и – если всё нормально – подписать самим.