Як підписати скрипт PowerShell сертифікатом

Наявність цифрового підпису у скрипта або виконуваного файлу дозволяє користувачеві упевнитися, що файл є оригінальним, і в тому, що його код не був змінений третіми особами. У PowerShell також є вбудована можливість підписати файл скрипта * .ps1.

Підписати скрипт PowerShell можна за допомогою спеціального типу сертифіката  Code Signing. Цей сертифікат може бути отриманий від зовнішнього комерційного центру сертифікації, внутрішнього корпоративного CA або самоподпісанного сертифіката (природно, це не найкращий варіант).

Припустимо, у нас в домені розгорнуті служби PKI - Active Directory Certificate Services. Запитаємо новий сертифікат, перейшовши на сторінку https: // CA-server-name / certsrv і запросити новий сертифікат з шаблоном Code Signing (Даний шаблон повинен бути попередньо дозволений в консолі Certification Authority).

Встановіть отриманий сертифікат в локальне сховище сертифікатів вашого комп'ютера.

Після того, як сертифікат отриманий, налаштуємо політику виконання скриптів PowerShell, дозволивши запуск тільки підписаних скриптів. Значення політики за замовчуванням (Restricted) блокує виконання будь-яких скриптів. Щоб дозволити запуск підписаних скриптів, можна змінити тип політики на AllSigned або RemoteSigned, різниця між якими в тому, що RemoteSigned вимагає наявність підпису тільки для скриптів, отриманих з інтернету.

Set-ExecutionPolicy AllSigned -Force

В окремий об'єкт збережемо сертифікат з локального сховища для поточного користувача:

$ Cert = (Get-ChildItem cert: \ CurrentUser \ my -CodeSigningCert) [0]

Потім підпишемо скрипт за допомогою даного сертифікату:

Set-AuthenticodeSignature -Certificate $ cert -FilePath C: \ PS \ test_script.ps1

Порада. При створенні самоподпісанного СЕРТФІКАТА для підписування коду за допомогою комндлета New-SelfSignedCertificate, потрібно вказати тип сертифіката CodeSigning:

New-SelfSignedCertificate -DnsName test1 -Type CodeSigning

Після генерації сертифіката, його потрібно буде в консолі управління сховищем сертифікатів (certmgr.msc) перенести з контейнера Intermediate в Trusted Root.

Підписати скрипт цим сертифікатом можна так:

Set-AuthenticodeSignature C: \ PS \ test_script.ps1 @ (gci Cert: \ LocalMachine \ My -DnsName test1 -codesigning) [0]

Після того, як PowerShell скрипт підписаний, в текстовий файл скрипта ps1 додасться блок сигнатури підписи, обрамлений рядками

# SIG # Begin signature block
...
...
# SIG # End signature block

При першій спробі запустити скрипт з'явиться попередження, якщо вибрати [A] Always run, при запуску скриптів, підписаних цим сертифікатом, попередження з'являтися більш не.

Do you want to run software from this untrusted publisher?

File C: \ PS \ test_script.ps1 is published by CN = test1 and is not trusted on your system. Only run scripts from trusted publishers.

Порада. Кореневий сертифікат CA, за допомогою якого було підписано скрипт повинен бути довіреною (інакше скрипт взагалі не запуститься). Сертифікат, яким підписано сам скрипт також повинен бути довіреною, інакше скрипт буде запускатися з підтвердженням. Тут вам на допомогу стаття: Як додати сертифікати на ПК домену за допомогою GPO

Що станеться, якщо змінити код підписаного скрипта PowerShell? Його запуск буде заблокований, із зазначенням, що вміст скрипта було змінено.

C: \ PS \ test_script.ps1: File C: \ PS \ test_script.ps1 can not be loaded. The contents of file C: \ PS \ test_script.ps1 might have been changed by an unauthorized user or process, because the hash of the file does not match the hash stored in the digital signature. The script can not run on the specified system.

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