Windows Certificate Authority İle PowerShell Code Signing Yapılandırması ve Uygulaması

Merhaba, bu makalede sizlere powershell scriptlerimizi dijital olarak nasıl imzalayacağımızı anlatmaya çalışacağım. IT yöneticileri olarak bizler için powershell olmazsa olmasımız. Powershell aslında iki tarafı kesinkin bıçak. Siber saldırılara baktığımızda bir çok saldırı vektörü tarafından kullanıldığını görmekteyiz. Powershell’i tabiri caiz ise kontrol edilmediğinde size doğrultulmuş bir silah olarak karşınıza çıkabiliyor. Bu yüzden özellikle büyük organizasyonlarda ve haliyle onlarca powershell’in olduğu ortamlarda kontrolünü sağlamalı ve doğru şekilde loglamalıyız.

Makalemizin konusu olan Code Signing bize bu konuda yardımcı oluyor. Code Signing temel olarak bir dijital sertifika kullanarak powershell scriptlerimizi imzalamak, sonrasında organizasyon genelinde sadece dijital olarak imzalanmış powershell scriptlerinin çalışmasını sağlayarak denetim sağlamaya dayanır. Konu karışık gibi görünsede aslında oldukça basittir. Makalenin ilerleyen bölümlerinde adım adım göreceğiz.

İlk olarak bize gerekli bişenlerden ve yapıdan bahsetmek istiyorum. Aşağıdaki diagramda görüldüğü gibi bir yapımız var. İşlem sıramız şöyle olacak.

Yapı

1 Adet DC – S001-060

1 Adet CA Server – S001-066

1 Adet App Server S001-067

İlk olarak S001-067 olan App sunucuma login oldum ve powershell policy’e baktım. Kısaca deyinmek gerekirse powershell policy’ler aşağıdaki gibidir;

İlk olarak basit bir ps hazırıyor ve kaydediyorum.

Görüldüğü gibi sorunsuz çalıştı.

Şimd S001-060 DC’e dönerek yeni bir GPO oluşuturuyor ve aşağıdaki ayarı yapıyorum. “Computer Configuration\Policies\Administrative Templates\ Windows Components\Windows PowerShell” altındaki “Turn on Script Execution” burada da “Allow only signed scripts” seçiyorum. Bu sadece imzalı scriptleri çalıştır demek.

Tekrardan App servera dönüp policy’lerimi güncelledikten sonra aşağıda görüldüğü gibi powershell excution policy’in “AllSigned” olarak değiştini görebiliyorum.

Biraz önce çalıştırdığım powershell script’i yeniden çalıştırdığımda aşağıda görüldüğü gibi uyarıyor ve çalıştırmıyor. Şu ana kadar her şey istediğimiz gibi. Bir sonraki adıma geçmek için hazırız.

Bu adımda S001-066 olan CA server üzerindeyim ve server üzerinde Windows Certificate Authority servisi kurulu durumda.

Codesigning sertifikamı üretmek için “Certificate Template > Manage” diyorum.

Gelen template’lerden Code Signig’ sağ tıklayıp “Duplicate Template” diyorum.

Ayarları aşağıdaki gibi yapıyorum.

Burası önemli, ürettiğimiz sertifikalara herkesin erişmesini istemeyiz özellikle code sign sertifikalarımıza. Bu yüzden AD üzerinde bir grup oluşturdum ve bu gruba, hangi kullanıcı sertifika imzalama işlemlerini yapacaksa onu dahil ediyorum. Bir daha önemle vurguluyorum bu sertifikayı çaldırırsanız, saldırganlar bu sertifikayı kullanarak, zararlı kod içeren powershell scriptleri imzalayabilir ve sistemleriniz üzerinde çalıştırabilir.

Tekrardan CA server’a dönüp kaldığım yerden devam ediyorum ve az önce oluşturduğum grubu buraya ekliyor ve aşağıda görüldüğü gibi izinleri tanımlıyorum.

Template’im hazır.

Aşağıda görüldüğü gibi template’imi yayınlıyorum.

Şimdi sıra yetkilendirdiğim kullanıcı ile App server’a login olmaya ve server üzerinden sertifikayı talep etmeye geldi.

mmc konsolu açıyor sertifikamı talep ediyorum.

Aşağıdak görüldüğü gibi başarı bir şekilde sertifikam geldi. Şimdi sıra bu sertifikayı export edip AD üzerinden yayınlayacağız.

Export ettiğim sertifikayı AD üzerinde yeni bir GPO oluşturup; “Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Public Key Policies -> Trusted Root Certification Authorities ve Trusted Publishers“‘da sertifikamı import ediyorum.

Son GPO görüntüm aşağıdaki gibi oluyor. Not: APP OU’u altında Powershell CodeSigning yapmak istediğim sunucular var sizde kendi yapına göre genişletebilirsiniz.

Artık son aşamaya geldik. Şimdi tekrardan App server’a dönüp powershell scriptlerimizi imzalıyorum.

Bu komut ile, server üzerine yüklediğimiz codesigning sertifikalarımızı listeliyoruz.

Get-ChildItem cert:\CurrentUser\my –CodeSigningCert

Codesigning serifikamızı $cert değişkenine tanımlıyoruz.

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

Aşağıdaki komut ile sertifikamızı imzalıyoruz. Not: Siz kendinize göre düzenleyebilirsiniz.

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

İmzalanan sertifikanın görüntüsü aşağıdaki gibi oluyor.

Şimdi test zamanlı, powershell scriptimi yeniden çalıştırıyorum ve hatasız olarak çalıştığını görüyorum.

Son olarak aşağıdaki komut ile toplu olarak ps scriptlerinizi imzalayabilirsiniz.

Get-ChildItem c:\ps\*.ps1| Set-AuthenticodeSignature -Certificate $Cert

Evet sizde bu şekilde powershell scriptlerinizi imzalayabilir ve günvelik katmanına bir zincir daha ekleyebilirsiniz. Keyifli okumalar.

Exit mobile version