Domain Ortamında PowerShell Dijital İmzalı Script Oluşturma

PowerShell script signing (PowerShell betik imzalama), bir betiğin kaynağını doğrulamak ve betiğin değiştirilmediğini garanti etmek için kullanılan bir güvenlik özelliğidir. Bu işlem, özellikle bir domain ortamı (yani, kurumsal bir ağda) güvenliği sağlamak ve yönetimi kolaylaştırmak için oldukça faydalıdır.

PowerShell script signing, aşağıdaki amaçlarla kullanılabilir.

1. Güvenlik

Betiklerin imzalanması, sadece belirli, güvenilir kaynaklardan gelen betiklerin çalıştırılmasını sağlar. Böylece, kötü niyetli kullanıcıların veya zararlı yazılımların sisteme zarar vermek için sahte veya değiştirilmiş PowerShell betikleri çalıştırmasını engeller.

2. Betiğin Kaynağının Doğrulanması

Betikler, dijital imza ile birlikte sunulduğunda, hangi kullanıcı veya sistem tarafından yazıldıkları doğrulanabilir. Bu, bir betiğin aslında beklenen geliştirici veya yetkilendirilmiş bir kaynaktan geldiğinden emin olunmasını sağlar.

3. Betiklerin İzinli Yürütülmesini Sağlama

PowerShell’in “Execution Policy” ayarları, yalnızca imzalanmış betiklerin çalışmasına izin verecek şekilde yapılandırılabilir. Böylece yalnızca belirli bir güvenlik seviyesini karşılayan betikler çalıştırılabilir ve dış kaynaklardan gelen betikler engellenir.

4. Kurumsal Politikaların Uygulanması

Bir domain ortamında, ağdaki tüm bilgisayarların güvenli bir şekilde PowerShell komutları çalıştırmasını sağlamak için imzalama politikaları uygulanabilir. Örneğin, bir kuruluş, sadece belirli yazılım geliştirme ekipleri tarafından yazılan ve imzalanan betiklerin çalıştırılmasına izin verebilir.

5. Sahtekarlık ve Manipülasyon Riskini Azaltma

Betiklere dijital imza eklemek, kötü amaçlı yazılımların ve saldırganların PowerShell betiklerini değiştirmesini zorlaştırır. Bir betik, dijital olarak imzalanmışsa ve imza bozulursa, betik çalıştırılmadan önce bir uyarı gösterilir.

6. Otomatik Betik Dağıtımı ve Yönetimi

Domain ortamında, betikler merkezi olarak yönetilir ve imzalanır. Bu sayede, organizasyon çapında birden fazla sistemde betiklerin güvenli bir şekilde dağıtılması ve çalıştırılması sağlanabilir.

Mevcut Durum

Domain ortamında kullanmamız ya da yaygınlaştırmamız gereken bir scriptimiz var. Ancak bazı güvenlik politikaları gereği imzasız bir script kullanamamaktayız. Örnekler ile göstermek gerekirse aşağıda script ve içeriği görebilirsiniz. Script dosyamızın içeriğine ve boyutunun 1KB olduğuna dikkat edelim. Buranın işlem sonundaki halini görmüş olacağız.

Bu scripti doğrudan çalıştırmak istediğimizde aşağıdaki şekilde bir hata alıyoruz.

Powershell Execution policy değiştirmek istediğimizde ise yine hata ile karşılaşıyoruz.

Bunun nedeni group policy ile aşağıdaki politikanın uygulanıyor olmasıdır.

Bu politikayı değiştirerek problemden kurtulabiliriz ancak güvenlik noktasında bir zafiyete sebebiyet vermiş olacağız. Tabi ki bunları bypass etmenin yöntemleri var.

Dijital İmzalı Script Oluşturma

Unutmayın, bizim amacımız güvenliğin nasıl atlatılacağını göstermek yerine doğru bir politika yapısı ile script çalışmalarını güvenli şekilde sürdürmektir. Bunun için aşağıdaki adımları takip edebilirsiniz.

Bölüm 1 : Sertifika Template Oluşturma ve Yayınlama

Domain yapımızda yer alan Certification Authority hizmeti sayesinde bir Code Signing sertifika üreterek ilgili scriptimizi imzalı hale getireceğiz. Bunu self-signed sertifika ile de yapabiliriz ancak domain yapısında dağıtılması gereken bir durumda daha efektif bir yönetim sağlayacaktır.

Certification Authority konsolu açılarak “Certificate Templates” kısmı üzerinde sağ tuş Manage butonu tıklanır.

Certification Authority

Ardından “Code Signing” template üzerinde Duplicate Template tıklanır.

Certificate Templates Console

Compatibility sekmesinden uyumluluk ayarları kendi ortamımıza göre düzenlenir. Burası zorunlu bir ayar değildir.

Certification Authority - New Template

General sekmesinden sertifikaya bir isim verilir.

Certification Authority - New Template

Extensions sekmesinde “Application Policies” kısmında Code Signing yazdığından emin olmalıyız.

Certification Authority - New Template

Ardından “Basic Constraints” alanında Edit butonu tıklanır.

Certification Authority - New Template

Gelen ekranda “Enable this extension” işaretlenir ve OK tıklanır.

Certification Authority - New Template

Daha sonra “Subject Name” sekmesinde “Supply in the request” tıklanır ve Use subject alanı işaretli ise uncheck yapılır.

Certification Authority - New Template

Security” sekmesinden sertifikayı enroll edebilecek kullanıcılar eklenir ve Enroll yetkisi verilir.

Eğer bu sertifika tüm domain ortamındaki cihazlarda zorunlu olarak bulunması gerekecekse “Domain Users” grubuna Autoenroll yetkisi verilebilir. Apply butonu ile düzenleme işlemi tamamlanır.

Certification Authority - New Template

Sertifika konsolundan New – Certificate Template Issue tıklanır.

Certification Authority

Az önce oluşturduğumuz “Powershell CodeSigning Certificate” isimli template seçilir ve OK tıklanır.

Enable Certificate Templates

Sertifika artık yayınlanmış durumdadır.

Certification Authority

Bölüm 2 : Sertifika Talep Etme

Şimdi issue edilen sertifikamızı script çalıştırılacak sunucu / client üzerinde request etmemiz gerekiyor. Bunun için Windows + R ile çalıştır alanına “certmgr.msc” yazıyoruz.

Run (Windows + R)

Personal – Certificates – All Tasks – Request New Certificate ile süreci başlatıyoruz.

certmgr

İlgili sertifika template seçerek “More information is required to enroll for this certificate” kısmına tıklıyoruz.

Certificate Enrollment

Subject” sekmesinde Type kısmını “Common name” yaparak sertifikamıza bir isim veriyoruz. Burada uygulama, script vs tanımlayıcı isimler kullanılabilir.

Certificate Properties

General” sekmesinde sertifikaya displayname (görünen) bir ismi veriyoruz. Apply / OK tıklanır.

Certificate Properties

Enroll butonu ile sertifika import edilmiş olur. Sertifikanın oluştuğunu doğruluyoruz.

Certificate Enrollment
Certificate Enrollment
certmgr

Bölüm 3 : Script İmzalama

İlk 2 bölümde sertifika template oluşturduk ve ilgili makineye ekledik. Şimdi scriptimiz için imzalama aşamasına geçiyoruz.

Sertifikamızı Powershell üzerinden tanımlayacağız. Bu nedenle aşağıdaki komutla doğru sertifikamızı tespit ediyoruz.

Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object {$_.Subject -like '*$ContosoSigningCert*'}
PowerShell

Sertifikayı bir değişkene atıyoruz.

$cert = Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object { $_.Subject -like '*$ContosoSigningCert*' }

Daha sonra script dosyamızı path ile birlikte yazarak sertifikayı assign ediyoruz.

Set-AuthenticodeSignature -FilePath "C:\Scripts\UserLogonInformation.ps1" -Certificate $cert

Aşağıdaki komut ile sertifika dosyası ile scriptin imzalandığını teyit ediyoruz.

Get-AuthenticodeSignature "C:\Scripts\UserLogonInformation.ps1"

Bölüm 4 : Script Kontrolü ve Test Aşaması

Makalenin ilk bölümlerinde hatırlarsanız script dosyamız 1KB boyutuna sahipti. Şimdi kontrol ettiğimizde değişikliği doğruluyoruz.

Windows Explorer

Sertifika hash bilgisinin script içerisine eklendiğini doğruluyoruz.

Windows PowerShell Scripts

Script dosyamızın özelliklerini kontrol ettiğimize “Digital Signatures” sekmesinin geldiğini ve doğrulandığını görmekteyiz.

Digital Signature Details
Certificate Details

Scripti çalıştırmak istediğimizde “Untrusted Publisher” uyarısı alıyoruz. “A” butonu tıklarsak bu script için yeniden uyarı vermeyecektir.

PowerShell Untrusted Publisher

Script çıktımızı artık görebiliyoruz.

PowerShell

Aynı scripti domain ortamındaki farklı bir makinede çalıştırmayı deneyelim. Bu defa “R” butonu ile 1 kez izin ver diyelim. Tekrar çalıştırılmak istendiğinde de aynı uyarıyı verecektir.

PowerShell, Do you want to run software from this untrusted publisher?

Bu uyarıdan kurtulmak ve sertifikamız güvenilir bir yerden temin edildiği için sertifikayı “Trusted Publisher” alanına import ediyoruz.

cermgr, Trusted Publisher

Sonuç

Şimdi tekrar çalıştırdığımızda artık uyarı vermeden scriptin çalıştığını doğruluyoruz.

PowerShell

Bu noktaya kadar bir script nasıl sertifika ile imzalanır bunları gördük.

Script içeriğinin değişiklik kontrolü, değiştirilmesinin engellenmesi gibi konuları Hash kontrolü, Applocker, SCCM ya da Intune araçları ile kontrol altına alabiliriz. Ancak bu konuyu daha fazla uzatmamak adına o konuları sonraya saklıyoruz.

Faydalı olması dileğiyle.

Diğer yazılarımızı okumak için buraya tıklayabilirsiniz.

Kaynaklar

Similar Posts

Bir yanıt yazın

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