PowerShell Script Signing

PowerShell script signing  scriptlerinin güvenliğini artırmak ve çalıştırılmadan önce kaynağının doğrulanmasını sağlamak amacıyla kullanılır. Normalde bir .PowerShell scripti herkes tarafından yazılabilir. Eğer ortamda Execution Policy   AllSigned veya RemoteSigned gibi birkonfigürasyona sahipse, imzasız scriptlerin çalışması engellenir. Bir scripti dijital olarak imzalamak, o scriptin:, Kim tarafından oluşturulduğunu, İçeriğinin değiştirilip değiştirilmediğini kanıtlar. Böylece, PowerShell bir scripti çalıştırmadan önce imzayı kontrol eder. Eğer imza geçerliyse çalıştırır. Değilse çalıştırmayı reddeder veya uyarı verir.

Neden önemli?

Güvenlik: Scriptlerin kötü amaçlı değiştirilmediğinden emin olmak.

Kurumsal ortamlar: Şirketler, imzalı scriptler dışında hiçbir şey çalıştırmak istemeyebilir.

Bu işlem için öncelikle Code Signing Sertifikası oluşturmamız gerekmektedir.

Bunun için  CA’ de

Certificate Template, sağ tuş, Manage seçilir.

Code Signing Templatei üzerinde sağ tuş ve Dublicate Template seçilir.

Template properties de display name,  valid period ve renewal period belirlenir.

Compatibility ayarları yapılır.

CA’de Certificate Template – New – Certificate Template to issue seçilir.

Sonra hazırladığımız Code Signing seçilir.

Ardından oluşturduğumuz sertifika export edilerek domain ortamımızda kullanılacak olan yerlere import edilir. Group policy ile de yapılabilinir.

PowerShell Execution policy hazırlamak için,

Computer Configuration / Policies / Administrative Templates / Windows Components / Windows PowerShell/ Turn on Script Execution

Import etme işlemi manuel olarak aşağıdaki gibidir.

Sertifika aşamaları tamamlandıktan sonra, aşağıdaki komutlar kullanılarak PS Script sign edilir. Status gölümünün VALID olması gerekmektedir. Eğer valid değil ise sertifika bölümünde sorun olabilir.

$cert = Get-ChildItem -Path Cert:\CurrentUser\My

Set-AuthenticodeSignature -FilePath “C:\volsys14.ps1” -Certificate $cert

Sign edilmiş scriptin özeliklerinden Digital Signatures tabını kontrol ediyorum.

Sign edilmiş scriptin içeriği aşağıdaki gibidir.

Test amaçlı oluşturduğum 2 scripti kontrol edeceğim.

SignPS ‘I sign ediyorum.

Get-executionpolicy komutu ile mevcut durumumu kontol ediyorum.

Sign edilmiş olan dosyanın sorunsuz çalıştığını ve Sign edilmemiş script’in çalışmadığını görüyorum.