Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_ЛР_БОС.doc
Скачиваний:
112
Добавлен:
08.05.2019
Размер:
1.15 Mб
Скачать

Установка уровня политики ExecutionPolicy

Данное действие можно смело назвать процедурой настройки powershell с целью изменения текущего уровня безопасности? который задается параметром «ExecutionPolicy», который можно изменить в реестре.

Он расположен по следующему пути:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]

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

Get-ExecutionPolicy

Существует шесть уровней политики ExecutionPolicy:

Restricted

Это конфигурация PowerShell по умолчанию. Этот вариант означает, что никакие скрипты не могут быть запущены. Единственное, что можно делать в PowerShell при такой настройке — это выполнять одиночные команды.

AllSigned

Эта настройка позволяет выполнять скрипты. Скрипт должен быть подписан сертификатом от доверенного источника. Перед выполнением подписанного скрипта будет выводится предупреждение.

RemoteSigned

Эта настройка позволяет выполнять скрипты, но требует, чтобы все скрипты и файлы конфигурации, загруженные из Интернета, были подписаны сертификатом от доверенного источника. Скриптам, выполняющимся на локальном компьютере, подпись не требуется. Предупреждений перед запуском скриптов не выводится.

Unrestricted

Такая настройка используется чеще всего но она потенциально опасна и крайне не рекомендована. Такая настройка позволяет запускать неподписанные скрипты, включая загруженые из Интернета.

Bypass

Ничто не блокируется и никаких предупреждений не выводится.

Undefined

Удаляет присвоенную в настоящий момент политику.

В случае необходимости уровень разрешений запуска изменяется командой:

PS C:\temp> Set-ExecutionPolicy RemoteSigned

Execution Policy Change The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic. Do you want to change the execution policy? [Y] Yes [N] No [S] Suspend [?] Help (default is «Y»): y

В зависимости от специфики выполняемых задач, в случаях, когда выполняются преимущественно сценарии собственного написания я бы рекомендовал использовать RemoteSigned. В случае когда выполняются сценарии, полученные из внешних источников стоит использовать AllSigned.

Подписывание скриптов

Для подписывания скрипта нам понадобится программа makecert.exe она входит в состав Microsoft .NET Framework SDK или Microsoft Windows Platform SDK.

Скачиваем пакет, устанавливаем.

Открываем командную строку (Win+r – cmd.exe) и вводим:

cd "C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\"

Создаем нужные сертификаты.

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.

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

PS C:> Get-ChildItem cert:\CurrentUser\My -codesign

Необходимые сертификаты созданы, остается подписать наш скрипт.

Для этого возьмём из справочного (get-help about_signing) руководства готовый пример кода.

## sign-file.ps1

## Sign a file

param([string] $file=$(throw "Please specify a filename."))

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

Set-AuthenticodeSignature $file $cert

В качестве переменной $file указываем имя нашего скрипта. Если при подписывании скрипта возвращается ошибка UnknownError то сохраните скрипт в кодировке UTF-8.

Результатом нашей работы получился файл следующего вида:

Write-Host «Hello!»

# SIG # Begin signature block

# MIIOPAYJKoZIhvcNAQcCoIIOLTCCDikCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB

# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR

# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUukjlMS+jNOxKqyd+oixh1rVp

..

# Jj+zcmnLYpEMAPjaP8MFurZIgWroOUNFPKLQMKWHau1kmxPnKNrroAD/zG/0dIjg

# W04RHGBT3csXoEcwCA6oOSmyptp6rLtRn9AjR9epWj4SGgBrdiGZIp2vWZkOzGGa

# SIG # End signature block

Попробуем его запустить…

Нас спросят о том, что нужно ли этому издателю доверять. Да!

PS C:\TEMP\> .\1.ps1

Do you want to run software from this untrusted publisher?

The file C:\TEMP\1.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

Hello!

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

PS C:\TEMP\> .\1.ps1

The file C:\TEMP\> .\1.ps1 cannot be loaded. The signature of the certificate can not be verified.

Так как для удаленного хоста он подписан неизвестно кем и доверия к нему нет никакого. Поэтому коллегам придется его посмотреть и при необходимости подписать самим.

В случае если в вашей организации уже есть развернутый доменный Центр Сертификации то ваша задача значительно облегчается до следующих пунктов:

  • Получаем доменный сертификат для подписывания (Code Sign)

  • Выполняем следующий скрипт:

$cert = @(dir cert:\CurrentUser\My -codesigning)[0]

Set-AuthenticodeSignature $file $cert

Где $file – путь к скрипту и $cert – объект сертификата.