Подпись скриптов PowerShell в доменной среде

Как я уже говорил во многих своих статьях, практически любую задачу, связанную с настройками параметров клиентских операционных систем Windows можно выполнить либо при помощи предустановленных административных шаблонов групповой политики или средствами параметров безопасности GPO, либо благодаря элементам предпочтения реестра и, соответственно, внеся требуемые изменения в системные реестр на машине конечного пользователя, либо благодаря скриптам Windows PowerShell. Все эти средства имеют множества преимуществ и, в зависимости от обстоятельств, вы можете выбрать метод, который будет считаться наиболее приоритетным при решении той или иной задачи. Однако при распространении скриптов Windows PowerShell вы можете столкнуться с некоторым ограничением. Если говорить точнее, то при запуске скрипта на клиентской машине он может быть не выполнен ввиду предустановленных настроек пользовательских параметров политики выполнения Windows PowerShell.

В этой статье вы узнаете о том, как можно в доменной среде подписать скрипты администратора во избежание ограничений, связанных с политикой выполнения сценариев Windows PowerShell.

Ограничения выполнения сценариев Windows PowerShell

Прежде чем снимать ограничения, мне хотелось бы наглядно показать, как именно они работают. В первую очередь, несколькими строчками выше, во введении этой статьи, я уже упомянул, что Windows PowerShell поддерживает некоторую концепцию, которая называется политиками выполнений. Данные политики предназначены для повышения безопасности, связанной с администрированием PowerShell, и они определяют, можно ли пользователю загружать файлы конфигурации Windows PowerShell, а также выполнять скрипты. Более того, политики выполнения определяют, для выполнения каких скриптов требуется цифровая подпись. По умолчанию, PowerShell настроен на работу в максимально безопасном режиме, позволяя работать с данной консолью исключительно в качестве интерактивной оболочки. Как знает каждый, кто успел поработать с командной оболочкой Windows PowerShell, существует четыре политики выполнения, а именно Restricted, AllSigned, RemoteSigned, а также Unrestricted. Буквально в двух словах опишу все эти четыре политики:

  • Restricted. Установленная по умолчанию политика выполнения, которая не позволяет загружать файлы конфигурации и скрипты;
  • AllSigned. Данная политика уже позволяет запускать скрипты и файлы конфигурации, однако она требует, чтобы все они были подписаны доверенным издателем, в том числе и скрипты, подготовленные на локальном компьютере. При запуске сценария PowerShell может задать вопрос о том, доверяете ли вы этому издателю и стоит ли издателю с этой цифровой подписью доверять и в дальнейшем;
  • RemoteSigned. Это еще более щадящая политика выполнения, так как при ее применении PowerShell уже может запускать все скрипты и файлы конфигурации, загруженные из таких коммуникационных приложений, как Microsoft Outlook или, скажем, браузер. Однако эти скрипты должны быть подписаны доверенным издателем. В свою очередь, файлы, запускаемые с локальной машины, могут не иметь цифровой подписи;
  • Unrestricted. В этом случае Windows PowerShell загружает все файлы конфигурации и выполняет все скрипты. К единственному возможному ограничению можно отнести то, что если запущен неподписанный скрипт, который был загружен из внешнего источника, то тогда командная оболочка попросит вас перед запуском ввести разрешение. В том случае, если вы в дальнейшем не желаете предоставлять разрешения, вы можете воспользоваться дополнительным параметром Unblock.

Также не является новостью и то, что политики выполнения можно изменять при помощи выполнения командлета Set-ExecutionPolicy с используемой в будущем политикой выполнения, в качестве параметра.

Для выполнения скриптов PowerShell в корпоративной среде, в качестве политики выполнения по умолчанию, оптимальным вариантом будет политика AllSigned. Чтобы выбрать именно эту политику, вам понадобится воспользоваться возможностями групповой политики.

В оснастке «Управление групповой политикой» (Group Policy Management) создайте новый объект групповой политики, скажем, «Windows PowerShell». Свяжите его со всем доменом и откройте оснастку «Редактор управления групповыми политиками» (Group Policy Management Editor). Находясь в этой оснастке перейдите к разделу Конфигурация компьютера\Политики\Административные шаблоны\Компоненты Windows\Windows PowerShell (Computer Configuration\Policies\Administrative Templates\Windows Components\Windows PowerShell) и откройте параметр политики «Включить выполнение сценариев» (Turn on Script Execution). Как видно на следующей иллюстрации, в отобразившемся диалоговом окне вы можете установить требуемую политику выполнения. Например, в данном случае было выбрано значение «Разрешать только подписанные сценарии» (Allow only signed scripts):

Определение политики выполнения сценариев PowerShell

Рис. 1. Определение политики выполнения сценариев PowerShell

Теперь, после распространения параметров объекта групповой политики, на клиентских компьютерах будет установлена по умолчанию политика безопасности AllSigned. Можно проверить внесенные изменения на клиентском компьютере посредством выполнения команды Get-ExecutionPolicy. Более того, далее попробуем выполнить на клиентском компьютере простейший скрипт. Скрипт будет называться «Hello.ps1» и он будет состоять из одной строки с текстом «Write-Host «Hello There!»». Как видно на следующей иллюстрации, скрипт не был запущен ввиду отсутствия подписи от доверенного издателя:

Установленная политика выполнения, а также попытка запуска скрипта

Рис. 2. Установленная политика выполнения, а также попытка запуска скрипта

Так что же делать?

Методы подписей скриптов PowerShell

С этого момента начинается самое интересное! Ввиду того что выбран текущий уровень выполнения скриптов, все создаваемые далее скрипты должны быть подписаны.

Добавление цифровой подписи к скрипту подразумевает, чтобы такой скрипт был подписан сертификатом с цифровой подписью «Сертификат подписи кода» (Code Signing Certificate). Для решения этой задачи можно выбрать три метода: покупка сертификата у доверенного центра сертификации (например, это может быть тот же Verisign и т.д.), использование самозаверяющего сертификата, а также использование инфраструктуры открытого ключа.

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

Если все ваши скрипты предназначены для использования, исключительно внутри вашей организации, вы, сможете воспользоваться вторым методом, а именно – созданием и самостоятельной подписью сертификата. Самозаверяющий сертификат представляет собой специальный тип сертификата, подписанный самим его субъектом. Технически, данный тип ничем не отличается от сертификата, заверенного при помощи подписи удостоверяющего центра, однако вместо передачи на подпись в такой центр, пользователь создает свою собственную сигнатуру. Для самозаверяющего сертификата назначенным компьютером является орган, создающий сертификат. Преимущества самоподписывания заключаются как минимум в его нулевой стоимости, а также в скорости и удобству создания. Такой сертификат вы можете создать при помощи инструмента MakeCert, который является частью Microsoft Windows SDK для Windows 7 и .NET Framework 4, который вы можете загрузить по следующей ссылке. Недостатком этого метода является то, что такой сертификат должен быть установлен на каждом компьютере, на котором будут выполняться скрипты, поскольку изначально другие компьютеры не будут доверять компьютеру, используемому для создания сертификата.

При помощи третьего метода можно создать шаблон сертификата подписи кода и использовать его для создания скриптов PowerShell от доверенного издателя. Этот метод считается наиболее трудоемким, так как для его реализации вам понадобится развернутая инфраструктура доменных служб. К основному требованию для данного метода относится наличие центра сертификации внутри вашего домена. Остановимся на этом методе подробнее. Условно всю операцию можно разбить на четыре этапа, а именно:

  • Создание шаблона сертификата подписи кода на выдающем сервере сертификации;
  • Запрос сертификата подписи кода пользователем;
  • Подписание скрипта Windows PowerShell;
  • Распространение сертификата подписи кода как доверенного издателя в среде Active Directory.

Не буду более затягивать и сразу перейду к первому этапу.

Создание шаблона сертификата подписи кода на выдающем сервере сертификации

Первым делом надо для пользователя, который будет создавать скрипты PowerShell, указать группу безопасности, предназначенную для подписания всех последующих скриптов. Для этого создается, скажем, глобальная группа безопасности «PS_ScriptCreators» и в качестве ее членов добавляется пользователь DCAdmin.

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

  1. Откройте оснастку «Шаблоны сертификатов» (Certificate Templates). Для этого в диалоговом окне «Выполнить» (Run) вы можете ввести команду «certtmpl.msc». Если вы хотите закрепить эту оснастку в меню «Пуск» или на панели задач, то тогда вам следует открыть «Консоль управления Microsoft» (Microsoft Management Console, MMC), где надо из диалогового окна добавления и удаления оснасток выбрать оснастку «Шаблоны сертификатов» (Certificate Templates). После этого останется лишь сохранить эту оснастку;
  2. Теперь, находясь в требуемой оснастке, вам надо локализовать шаблон «Подписывание кода» (Code Signing) и из контекстного меню выбрать опцию копирования шаблона. В отобразившемся диалоговом окне создания нового шаблона вам следует на вкладке общих параметров указать имя и отображаемое имя шаблона (например, как видно на следующей иллюстрации, в качестве отображаемого имени было указано «Подписывание скриптов Windows PowerShell», а имя шаблона – «PowerShellScriptSigning»), а также удостовериться в том, что на всех вкладках выбраны идентичные с основным шаблоном настройки. Например, на вкладке обработки запроса (Request Handling) в качестве цели указывается «Подпись», на вкладке имени субъекта, в качестве источника имени переключатель установлен на опции построения на основе данных Active Directory и в качестве типа субъекта выбран пользователь, а также на вкладке шифрования следует удостовериться, что в качестве поставщиков служб шифрования указаны «Microsoft Base Cryptographic Provider v1.0» и «Microsoft Enhanced Cryptographic Provider v1.0». Все это видно на следующей иллюстрации:

    Создание нового шаблона сертификата

    Рис. 3. Создание нового шаблона сертификата

  3. Ввиду того что нам необходимо, чтобы подписывать скрипты PowerShell мог лишь узкий круг пользователей, на вкладке «Безопасность» (Security) следует выбрать созданную ранее группу «PS_ScriptCreators» и установить для нее разрешения на чтение и на заявку, после чего можно сохранить диалоговое окно создания нового шаблона сертификата. Назначенные разрешения для выбранной группы безопасности вы можете увидеть ниже:

    Назначение разрешений для группы безопасности «PS_ScriptCreators»

    Рис. 4. Назначение разрешений для группы безопасности «PS_ScriptCreators»

  4. После этого следует включить сгенерированный на предыдущих этапах шаблон сертификата. Для этого надо открыть оснастку «Центр сертификации» (Certification Authority) и перейти к узлу «Шаблоны сертификатов» (Certificate Templates). В этом узле вы можете увидеть все шаблоны сертификатов, которые доступны для запроса самих сертификатов. Ввиду того что изначально данный шаблон отсутствует в этом списке, вам придется его добавить. Для этого надо кликнуть правой кнопкой мыши на названии узла шаблонов сертификатов и затем выбрать последовательно опции «Создать» и «Выдаваемый шаблон сертификата» (New > Certificate Template to Issue). Как вы видите на следующей иллюстрации, в отобразившемся диалоговом окне «Включение шаблонов сертификатов» (Enable Certificate Templates) вам нужно лишь выбрать требуемый шаблон сертификата, а затем нажать на кнопку «ОК»:

    Включение шаблона сертификата

    Рис. 5. Включение шаблона сертификата

Итого, шаблон сертификата, предназначенного для подписи скриптов Windows PowerShell создан и включен. Можно переходить к следующему этапу.

Запрос сертификата подписи кода пользователем

На этом этапе для пользователя, входящего в группу безопасности «PS_ScriptCreators» будет выдан сертификат, предназначенный для подписи скриптов Windows PowerShell. После выполнения указанных на этом этапе действий, пользователь сможет подписывать каждый скрипт PowerShell, который уже, в свою очередь, будет без каких-либо проблем запускаться на компьютерах конечных пользователей.

Следовательно, надо выполнить следующие действия:

  1. В консоли «Консоль управления Microsoft» (Microsoft Management Console, MMC) добавьте оснастку сертификатов, которая будет управлять сертификатами для учетной записи пользователя. В данной оснастке следует перейти к узлу «Личное» (Personal), а затем, как можно заметить ниже, из контекстного меню данного узла последовательно выбрать опции «Все задачи» и «Запросить новый сертификат» (All Tasks > Request New Certificate):

    Открытие мастера регистрации сертификатов

    Рис. 6. Открытие мастера регистрации сертификатов

  2. В отобразившемся окне мастера регистрации сертификатов ознакомьтесь с предоставляемой информацией и перейдите к странице выбора политики регистрации сертификатов. Политика регистрации сертификатов определяет расположение центров сертификации и типы запрашиваемых сертификатов. Ввиду того что созданный на предыдущем этапе шаблон сертификатов был опубликован в Active Directory, следует выбрать опцию политики регистрации Active Directory и перейти к следующей странице мастера;
  3. Как можно заметить на следующей иллюстрации, на странице запроса сертификатов данного мастера, следует локализовать искомый тип сертификата. В этом списке можно найти только те типы сертификатов, разрешения на заявку которых были доступны текущему пользователю. Ввиду того что данный пользователь состоит в группе «PS_ScriptCreators» сейчас мы можем локализовать нужный шаблон. В данном случае это будет шаблон «Подписывание скриптов Windows PowerShell». Для того чтобы посмотреть дополнительную информацию о генерируемом сертификате, например, политику применения или же его срок действия – нажмите на кнопку «Подробности» (Details). При создании нового сертификата будет использоваться вся информация, которая была указана во время создания шаблона сертификата (то есть все, что было указано на предыдущем этапе). Но если вы желаете изменить какие-либо настройки, вы можете открыть диалоговое окно свойств сертификата:

    Запрос и диалоговое окно запрашиваемого сертификата

    Рис. 7. Запрос и диалоговое окно запрашиваемого сертификата

  4. После того как вы удостоверитесь в том, что все настройки были указаны правильно, вам следует нажать на кнопку «Заявка» (Enroll), а затем, по завершении процесса создания сертификата, на кнопку «Готово» (Finish).

Теперь данный пользователь может похвастаться наличием сертификата, благодаря которому он сможет начать подписывать скрипты PowerShell. Посмотрим, как это делается.

Подписание скрипта Windows PowerShell

На данный момент у нас осталось три этапа для полноценной проверки подписания скриптов. Прежде всего, это будет само подписание, которое будет рассмотрено в этом разделе. После этого надо будет распространить сертификат на компьютеры домена при помощи функциональных возможностей групповой политики. Ну и последним этапом, ест-но, будет тестирование всех выполненных сегодня действий. Другими словами, мы с вами попробуем выполнить заготовленный на одном из ранних этапов скрипт «Hello.ps1». Итак, подписание скрипта…

Для данной задачи подходит командлет Windows PowerShell «Set-AuthenticodeSignature». Данный командлет отвечает за добавление подписи в любой тип файла, который может быть совместим с протоколом SIP. В данном случае будет извлечен сертификат подписи кода из поставщика сертификата, после чего он будет использован для подписания скрипта Windows PowerShell.

Как правило, для выполнения этой операции используются две команды:

  • При помощи первой команды будет использоваться командлет Get-ChildItem, благодаря которому вы можете получить сертификат во вложенном каталоге хранилища сертификатов «Cert:\CurrentUser\My». Наряду с параметром выбора каталога используется параметр CodeSigningCert, который обеспечивает извлечение сертификатов только с заверителем подписи кода. Как правило, принято сохранять результат извлечения сертификата в переменную $cert;
  • В свою очередь, вторая команда выполняется при помощи командлета Set-AuthenticodeSignature, который уже подписывает наш скрипт Hello.ps1. Минимальными требованиями выполнения команды составляет использование параметра FilePath, который определяет имя скрипта, а также параметра Certificate – указывающего, что сертификат хранится в переменной $cert. При выполнении этой команды настоятельно рекомендуется еще использовать параметр TimestampServer. Для чего он нужен? Смотрите, сертификат выдается на определенный срок и этот срок имеет свойства заканчиваться. Так вот, данный параметр позволит вам быть уверенным в том, что скрипт продолжит выполняться даже по истечению срока действия вашего сертификата. То есть, используя этот параметр вы можете определить сервер отметок времени, который добавит к подписи саму отметку времени. Эта отметка времени представляет собой временной штамп добавленного в файл сертификата. Таким образом, данная отметка времени защищает скрипт от сбоев в случае истечения срока действия сертификата, ввиду того, что пользователи будут знать, что сертификат считался действительным во время подписания. В том случае если вы не будете использовать текущий параметр, скрипт перестанет работать, как только срок действия сертификата истечет. Сам сервер отметок времени указывается в качестве URL-адреса.

Итак, процесс подписания скрипта будет выглядеть следующим образом:

$cert=Get-ChildItem -Path cert:\CurrentUser\my -CodeSigningCert

Set-AuthenticodeSignature -FilePath C:\PowerShell\Hello.ps1 -Certificate $cert

Как видно на следующей иллюстрации, скрипт был успешно подписан:

Процесс подписания скрипта Windows PowerShell

Рис. 8. Процесс подписания скрипта Windows PowerShell

Распространение сертификата подписи кода как доверенного издателя в среде Active Directory

Ввиду того что о вашем сертификате пользователи еще не знают, последним этапом (не считая тестирования) является распространение сертификата подписи кода как доверенного издателя в среде Active Directory. Как я уже успел упомянуть ранее, распространяться он будет при помощи групповой политики. Ну а данную задачу можно условно разбить на два небольших этапа: экспорт самого сертификата и, непосредственно, сам распространение последнего.

Для экспорта сертификата вы можете воспользоваться уже знакомой вам по одному из предыдущих этапов оснасткой «Сертификаты» (Certificates), которая была открыта в консоли mmc. В этой оснастке вам нужно локализовать сам сертификат (как вы помните, он находится в узле «Личное\Сертификаты» (Personal\Certificates)) и из его контекстного меню для вызова соответствующего мастера, выбрать последовательно опции «Все задачи\Экспорт» (All Tasks\Export).

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

Процесс экспорта сертификата подписывания скриптов PowerShell

Рис. 9. Процесс экспорта сертификата подписывания скриптов PowerShell

Как только экспорт сертификата будет выполнен, можно приниматься к его распространению. Откройте оснастку «Управление групповой политикой» (Group Policy Management) и создайте новый объект групповой политики, предназначенный для работы с сертификатами. Ввиду того что в данном примере распространяется сертификат лишь в демонстрационных целях для решения поставленной задачи, будет использоваться созданный на ранних этапах объект «Windows PowerShell». Так как все предварительные действия выполнены, можно открыть оснастку редактора управления групповыми политиками.

В данной оснастке вам нужно перейти к узлу Конфигурация компьютера\Политики\Конфигурация Windows\Параметры безопасности\Политики открытого ключа (Computer Configuration\Policies\Windows Settings\Public Key Policies). Именно здесь будет выполняться импорт распространяемого сертификата. Получается, вам следует выбрать узел «Доверенные издатели» (Trusted Publishers) и, находясь в этом узле, из контекстного меню выбрать опцию импорта. Отобразится диалоговое окно мастера импорта сертификатов, где вам следует для учетной записи локального компьютера указать путь к экспортированному только что сертификату, который в последствии будет помещен в хранилище доверенных издателей. Все выбранные мною опции видны на следующей иллюстрации:

Импорт сертификата при помощи групповой политики

Рис. 10. Импорт сертификата при помощи групповой политики

Теперь осталось лишь обновить параметры групповой политики на конечном компьютере и проверить, удастся ли нам запустить скрипт. Находясь на пользовательском компьютере «Client02» откройте оснастку сертификатов для учетной записи компьютера. На следующей иллюстрации видно, что в хранилище доверенных издателей появился новый сертификат.

Более того, если сейчас в консоли Windows PowerShell попробовать запустить скрипт, вы уже не увидите сообщение об ошибке.

Удачно запущенный скрипт на пользовательском компьютере

Рис. 11. Удачно запущенный скрипт на пользовательском компьютере

Заключение

Из этой статьи вы узнали о том, как можно подписывать свои скрипты Windows PowerShell в корпоративной среде для их безопасного использования. Вы познакомились с политиками выполнения PowerShell и с соответствующим параметром групповой политики, позволяющем выполнить их настройку одновременно для всех пользовательских компьютеров. Вы узнали о трех методах получения сертификатов для подписи скриптов PowerShell, которые можно использовать, а именно: покупка сертификата у доверенного центра сертификации, использование самозаверяющего сертификата, а также использование инфраструктуры открытого ключа, что и было подробным образом рассмотрено в настоящей статье. Было подробно рассказано о том, как можно создать шаблон сертификата подписи кода на выдающем сервере сертификации и как можно на основании этого шаблона запросить сертификат подписи кода пользователем. Далее вы узнали о том, каким образом подписываются скрипты Windows PowerShell, а также как можно распространить такой сертификат на учетные записи компьютеров организации при помощи функциональных возможностей групповой политики.

Надеюсь, что это статья оказалась для вас полезной и вы из нее узнали для себя что-то новое. До новых встреч!

VN:F [1.9.22_1171]
Rating: 10.0/10 (2 votes cast)
Подпись скриптов PowerShell в доменной среде, 10.0 out of 10 based on 2 ratings

2 комментария

  1. Спасибо за статью. Как раз озаботился этим вопросом 🙂 Но вот у меня вопрос: а нужно ли распространять сертификат подписи кода через политики, если у нас и так распространен корневой сертификат СА, которым как раз подписан наш сертификат на код? По моему получается лишнее телодвижение.

    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *