Комментарии 29
Не могли бы вы пояснить чем именно плохо изменить политику на Unrestricted. Если я могу выполнить скрипт на какой либо машине я могу выполнить и экзешник, подписи для которого не требуются.
Где ошибка в моём рассуждении?
Где ошибка в моём рассуждении?
Ошибок нет. Но чертова паранойя. В общем, чем меньше можно, тем больше нельзя. Ваш К.О.
У МС хватает перестраховок, ещё известная гадость — запрет на открытие сертификатов в почтовых вложениях.
Сколько не отправлял, никаких проблем не было. Ни с открытыми сертификатами, ни с закрытыми.
Возможно админы постарались, так как по-умолчанию они запрещены к открытию:
office.microsoft.com/en-us/outlook-help/blocked-attachments-in-outlook-HA010354417.aspx#_Attachment_file_types
office.microsoft.com/en-us/outlook-help/blocked-attachments-in-outlook-HA010354417.aspx#_Attachment_file_types
Наверное тем, что даже без администраторского доступа запущенный скрипт имеет очень много вариантов нагадить в системе.
Для выполнения скрипту нужны права администратора?
Для запуска на выполнение — нет. Но для успешного прохождения некоторых инструкций могут понадобиться.
Мне кажется слишком сложное решение получилось. В линуксе на скрипт ушли те же 15 минут с выставлением прав на соответсвующего юзера.
Непонятно, почему нельзя было сделать небольшую утилиту с правами запуска от администратора.
Непонятно, почему нельзя было сделать небольшую утилиту с правами запуска от администратора.
Мне непонятно, как вы измерили время написания скрипта, при условии, что я не указывал, что именно делает скрипт
Ну вы же сами написали:
> Скрипт, решающий задачу, был готов через 15 минут…
> Скрипт, решающий задачу, был готов через 15 минут…
по-моему мс перемудрили с этими сертификатами. Защита от выполнения чужого скрипта таки правами решаться должна, а если кто-то похачил систему и получил админа, его уже не остановить.
--sign.vbs--
--end--
Вообще, если это standalone машина, то тогда почему бы не сделать политику Unrestricted? Если же машина внутри корпорации, то наверняка в корпорации есть свой доверенный УЦ, там можно получить сертификат по шаблону «Подписывание кода».
Set oSigner = WScript.CreateObject("Scripting.Signer")
oSigner.SignFile "D:\MyScripts\MyScript.vbs", "MyCert"
--end--
Вообще, если это standalone машина, то тогда почему бы не сделать политику Unrestricted? Если же машина внутри корпорации, то наверняка в корпорации есть свой доверенный УЦ, там можно получить сертификат по шаблону «Подписывание кода».
Да просто, чтоб показать, что тема с подписыванием скриптов не нова, она существует уже какое-то время.
А в вашем скрипте я бы заменил строчку:
У вас же может статься так, что в хранилище тысяча сертификатов, подписывающих код. Зачем нужно брать самый первый, не пойму? Не проще ли обратиться к сертификату по имени? Да и в параметры к скрипту вставить можно.
А в вашем скрипте я бы заменил строчку:
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning) | Where-Object {$_.Subject -eq "CN=<субъект>"}
У вас же может статься так, что в хранилище тысяча сертификатов, подписывающих код. Зачем нужно брать самый первый, не пойму? Не проще ли обратиться к сертификату по имени? Да и в параметры к скрипту вставить можно.
Да, вы совершенно правы. Первый попавшийся брал, потому что сертификат был на машине единственный, да и задачка достаточно узкая. На новизну темы не претендовал, просто поделился, так сказать, наболевшим. И ваш вариант с подписью, как и следовало ожидать, тоже работает корректно. Интересно только то, что сам текст подписи формируется другой, хоть формат и схож.
Есть еще одна бага, может пригодится, может нет, а может это и фича вовсе… Не знаю, MS мне на их форумах так внятного ответа и не дали. Короче, если групповой политикой на Logon поставить неподписанный повершелл-скрипт — раз, и два — поставить политику запуска хоть даже AllSigned, то Logon-скрипт все равно запустится, он отрабатывает в режиме Undefined. Почему так — никому не известно.
RemoteSigned — компросс между AllSigned и Unrestricted. Тогда подписанными должны быть только скрипты, скачанные из интернета.
Почитать о том, как PowerShell определяет, скачан скрипт или нет, можно в следующей статье: blogs.msdn.com/b/powershell/archive/2007/03/07/how-does-the-remotesigned-execution-policy-work.aspx
Почитать о том, как PowerShell определяет, скачан скрипт или нет, можно в следующей статье: blogs.msdn.com/b/powershell/archive/2007/03/07/how-does-the-remotesigned-execution-policy-work.aspx
Автор кое-что забыл упомянуть.
Когда я разбирался по данной теме я столкнулся с проблемой в момент подписывания, выдавалось такое:
SignerCertificate Status Path
— — — UnknownError CheckMSE.ps1
Разобравшись в данном вопросе, выяснил, что виновата кодировка скрипта. К сожалению, PowerShell ISE второй версии не позволял менять кодировки, по этому приходилось либо открывать скрипт в Notepad++ и менять кодировку на UTF8, либо с помощью небольшого скриптика:
Get-Content CheckMSE.ps1 | out-file .\CheckNew.ps1 -encoding UTF8
Set-AuthenticodeSignature .\CheckNew.ps1 $cert
И все было ок:
SignerCertificate Status Path
— — — 0990C1A9E09DCE1263DD5F7D7688FFB8E20AD25E Valid CheckNew.ps1
З.Ы. В 3-й версии эту проблему исправили.
Когда я разбирался по данной теме я столкнулся с проблемой в момент подписывания, выдавалось такое:
SignerCertificate Status Path
— — — UnknownError CheckMSE.ps1
Разобравшись в данном вопросе, выяснил, что виновата кодировка скрипта. К сожалению, PowerShell ISE второй версии не позволял менять кодировки, по этому приходилось либо открывать скрипт в Notepad++ и менять кодировку на UTF8, либо с помощью небольшого скриптика:
Get-Content CheckMSE.ps1 | out-file .\CheckNew.ps1 -encoding UTF8
Set-AuthenticodeSignature .\CheckNew.ps1 $cert
И все было ок:
SignerCertificate Status Path
— — — 0990C1A9E09DCE1263DD5F7D7688FFB8E20AD25E Valid CheckNew.ps1
З.Ы. В 3-й версии эту проблему исправили.
Прошу прощения за неудачные вставки из кода
Невнимательно читаете. Не забыл.
Скрипт нужно создавать в любом текстовом редакторе, кроме PowerShell ISE. Для скриптов, созданных внутри этой среды, возникнут проблемы с подписыванием в виде Unknown Error. Решение взято здесь.
у меня получилось почему-то так:
cd «C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\»
.\makecert -n «CN=PowerShell Local Certificate Root» -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv d:\root.pvk d:\root.cer -ss Root
в Вашем случае создание файла ключа идет где-то на диске С, куда запись не оченоь приветствуется, поэтому лучше писать куда-то, к примеру в $Home.
cd «C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\»
.\makecert -n «CN=PowerShell Local Certificate Root» -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv d:\root.pvk d:\root.cer -ss Root
в Вашем случае создание файла ключа идет где-то на диске С, куда запись не оченоь приветствуется, поэтому лучше писать куда-то, к примеру в $Home.
Да, ошибку с PSH ISE подтверждаю.
оказалось просто скопипастить текст скрипта в редактор FAR после чего подпись прошла на ура
оказалось просто скопипастить текст скрипта в редактор FAR после чего подпись прошла на ура
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Как подписать свой первый скрипт за 48 часов