Это продолжение этой статьи о том, как запустить свои скрипты в 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. Ловим ошибки)
Большой помощью в данном решении - являлась статья Вадима Поданса
Подразумевается, что у вас имеется установленная роль 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. Ловим ошибки)
Большой помощью в данном решении - являлась статья Вадима Поданса
Комментариев нет:
Отправить комментарий