Windows Server

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.

  • CA üzerinde bir codesigning sertifikası üreteceğiz. Not: CA kullanmak zorunda değiliz ücretli bir sertifika yada SelfSignedCertificate sertifika kullanabilirsiniz.
  • GPO ile powershell restriction uygulayacağız ve yine denetim yapmak istediğimiz noktalara dağıtacağız.
  • Üretilen sertifkayı GPO ile powershell denetimi yapmak istediğimiz noktalara dağıtacağız.
  • Sertifikamızla powershell scriptlerimizi imzalayıp test edeceğiz.

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;

  • Restricted – Yapılandırma dosyalarını yüklemez veya komut dosyalarını çalıştırmaz. Windows istemci bilgisayarlar için varsayılan yürütme ilkesi.
  • Allsigned Yerel bilgisayarda yazılan komut dosyaları da dahil olmak üzere tüm komut dosyalarının ve yapılandırma dosyalarının güvenilir bir yayıncı tarafından imzalanmasını gerektirir.
  • RemoteSigned – İnternetten indirilen tüm komut dosyalarının ve yapılandırma dosyalarının güvenilir bir yayıncı tarafından imzalanmasını gerektirir. Windows sunucu bilgisayarları için varsayılan yürütme ilkesi.
  • Unrestricted – PowerShell 6.0’dan başlayarak varsayılan yürütme ilkesidir ve değiştirilemez. Tüm yapılandırma dosyalarını yükler ve tüm komut dosyalarını çalıştırır. İnternetten indirilmiş imzasız bir komut dosyası çalıştırırsanız, çalıştırmadan önce sizden izin istenir.
  • Bypass – Hiçbir şey engellenmez ve herhangi bir uyarı yoktur.
  • Undefined – Grup ilkesi tarafından ayarlanmayan bir kapsamdan atanan yürütme ilkesini kaldırır. Tüm kapsamlardaki yürütme ilkesi Tanımsız ise, etkin yürütme ilkesi Kısıtlı’dır .

İ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.

İlgili Makaleler

3 Yorum

  1. İyi günler certutil ile trust yapmadan kod sertifikası oluştursak kodun sisteme zarar vermesi söz konusu olur mu ?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu