четверг, 10 сентября 2015 г.

GPO AD: Computer Startup scripts and Powershell (часть 2: Созданиесвоего сертификата. Подпись скриптов)

Это продолжение этой статьи о том, как запустить свои скрипты в GPO. И в текущей, второй части, мы рассмотрим вариант собственной подписи скрипта созданным сертификатом.



Подразумевается, что у вас имеется установленная роль AD CS. Если у вас нет такой роли, то рекомендую поискать статьи в интернете, по поводу установки и настройке. Или, например, обратиться к этой статье.

Итак. У нас уже имеются свои скрипты и все готово к их плановому запуску (в данном примере мы рассматривали срабатывание скриптов после загрузки системы, т.е. групповой политикой для компьютера). Но как и уже сообщал ранее - наша политика (как и политика по умолчанию) не позволят запустить скрипт, даже если файл скрипта находится в нашей локальной сети. А для того, чтобы скрипт считался доверенным - нам необходимо его подписать.

В первую очередь, нам необходимо создать сертификат, которым мы будем подписывать наши скрипты. Все действия мы будем выполнять из под учетной записи Администратора Домена.

Открываем оснастку Certification Authority (выполнив команду certsrv.msc) и переходим в раздел Certificate Templates



Нажимаем правой кнопкой по Certificate Templates и выбираем Manage.  В открывшемся окне редактора шаблонов находим шаблон Code Signing и жмем на нем правой кнопкой, выбираем Properties. Переходим на вкладку Security и убеждаемся, что группа Domain Admins имеет права Read, Write, Enroll.





Теперь, когда мы убедились в наличии прав - окно редактора шаблонов можно закрыть, если вы не хотите создавать свой собственный шаблон (мы этого делать не будем).

Затем в основном окне Certification Authority вновь нажать правой кнопкой по Certificate Templates и выбрать New -> Certificate Template to issue и в открывшемся списке выбрать шаблон Code Signing.

Теперь, в списке шаблонов у вас появился Code Signing.

Далее, нам необходимо вызвать менеджер сертификатов. Сделать это можно выполнив команду certmgr.msc 

Переходим в раздел Personal - Certificates Жмем правой кнопкой в пустой области. Выбираем All Tasks -> Requeste New Certificate 





Откроется мастер запроса сертификата. В первом окне просто жмем Next, во втором ничего не меняя и не выбирая так же жмем Next



На следующем этапе выбираем наш шаблон Code Signing и жмем Enroll.



Когда сертификат появится в списке - жмем по нему правой кнопкой - выбираем All Tasks - Export.

Откроется окно экспорта. Жмем Next. Во втором окне доступен лишь один пункт (Не экспортировать приватный содержимое), поэтому жмем Next



Далее оставляем выбор открытой части сертификата x509 



Затем указываем путь и имя файла сертификата и жмем Finish.

На выходе у нас будет файл сертификата, который нам необходимо распространить по нашей сети, средствами GPO.

Создаем новую политику или используем существующую. Переходим Computer Configuration - Polices - Windows Settings - Security Settings - Software Restriction Policy 

Если у вас еще нет ни одной политики безопасности программного обеспечения, то необходимо нажать правой кнопкой по Software Restriction Policy и выбрать New Sofware Restriction Policy. Политика будет создана моментально.



Первое, что я сделал - это зашел в параметр Designied File Types и удалил оттуда все типы файлов, дабы не разбираться с правами доступа к запуску приложений, в дальнейшем.





Переходим в папку Additional Rules. Жмем правой кнопкой в пустом месте и выбираем New Certificate Rule

В открывшемся окне - выбираем наш файл сертификата. Выставляем уровень безопасности Unrestricted и можем добавить какое-либо описание. Хотя это не обязательно.




Теперь сертификат будет распространен по нашим машинам и при выполнении скрипта - к нему будет идти обращение о подлинности подписи.

У нас все готово, для того, чтобы начать подписывать наши скрипты. Важно, чтобы ваш сертификат находился в Personal Sertificate на той машине, с которой вы планируете подписывать.



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

Если проще сказать: я выполняю подпись на том же сервере, где я запрашивал сертификат и где у меня установлен AD CA

Для удобства: создайте в корне диска папку для скриптов, которые необходимо будет подписать и сложите туда файлы скриптов.





Открываем PowerShell и первое что мы сделаем - это создадим объект, в который "упакуем" наш сертификат. Вот таким образом:

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

Эта команда кладет объект сертификата в переменную cert у которого EKU (Enchanced Key Usage) указан Code Signing и [0] сообщает о том, что нам надо взять первый, подходящий по условиям. В силу того, что он у нас один - проблем возникнуть не должно. В ином случае - меняйте условия выбора сертификата.

После выполнения команды - убедимся, что в $cert теперь находится наш сертификат. Просто выведем содержимое, командой:

$cert





Как можно видеть на скрине выше - все в полном порядке. Осталось подписать этим сертификатом наши скрипты.

Для этого выполняем команду:

Set-AuthenticodeSignature C:\Main.ps1 $cert

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



Статус валидной подписи можно узнать несколькими способами. В т.ч. и запросив статус из PS командой: Get-AuthenticodeSignature C:\Main.ps1

А можно открыть свойства файла скрипта, перейти на вкладку цифровой подписи и посмотреть детали этой подписи. Если с подписью все хорошо - то об этом вы увидите сообщение.





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



Это значит, что если теперь мы изменим содержимое скрипта хотя-бы на 1 знак - то при проверке хэша - скрипт не пройдет валидность цифровой подписи и его необходимо будет подписывать заново. А блок сигнатуры будет автоматически изменен новыми значениями.

Поэтому каждый раз, когда вы меняете содержимое файла скрипта - не забывайте его вновь подписывать!

Теперь нам осталось лишь заменить в папках GPO наши файлы-скриптов уже подписанными файлами-скриптами путем банального копирования-замещения :)

Смотрите также...

GPO AD: Computer Startup scripts and Powershell (часть 1: Создание. Запуск)

GPO AD: Computer Startup scripts and Powershell (часть 3: PsExec. Ловим ошибки)

Большой помощью в данном решении - являлась статья Вадима Поданса