PowerShell Yürütme İlkelerini Yönetmek için Set-ExecutionPolicy


Hiç bir PowerShell betiğini indirdiniz, çalıştırdınız ve aşağıdaki rezil hata mesajıyla karşılaştınız mı? Öyleyse Set-ExecutionPolicy cmdlet'ine ve bu eğitime ihtiyacınız var!

Bu yazıda PowerShell yürütme ilkelerini ve bunların Set-ExecutionPolicy cmdlet'iyle nasıl yönetileceğini öğreneceksiniz. Bu yazının sonunda yalnızca komut dosyalarını çalıştırmayı değil, yürütme ilkelerini de nasıl kullanacağınızı öğreneceksiniz!

Bu eğitim Windows PowerShell göz önünde bulundurularak yazılmıştır ve tüm gösterimler Windows PowerShell ile gerçekleştirilmiştir. Yürütme politikaları Windows PowerShell'e özgü değildir ve PowerShell 6+ sürümünde de çok benzer şekilde çalışırlar. Ancak PowerShell 6+ ile çalışıyorsanız davranışlarda küçük farklılıklar bulabilirsiniz.

Yürütme Politikası nedir?

Yukarıda açıklanan hatayla karşılaştıysanız bir yürütme politikasıyla karşılaşmışsınız demektir. PowerShell yürütme ilkeleri, sisteminizi kötü amaçlı komut dosyalarının çalıştırılmasına karşı koruyan bir güvenlik mekanizmasıdır. Yürütme politikaları, PowerShell kodunu konsolda kabuk olarak çalıştırmanızı değil, komut dosyası yürütmesini engellemez.

Microsoft, yürütme politikasının teknik olarak bir "güvenlik" önlemi olmadığını, daha çok açıp kapatabileceğiniz bir kapı olduğunu söylüyor. Sonuçta, daha sonra öğreneceğiniz gibi, tanımlanmış bir yürütme politikasını kolayca atlayabilirsiniz.

Yürütme politikaları güvene dayanır. Bir komut dosyasına güveniyorsanız büyük olasılıkla kötü amaçlı değildir. Yürütme politikaları genellikle tüm komut dosyalarının komut dosyası yürütülmesini engellemez. Birincil amaçları (özellikle daha sıkı yapılandırıldığında), çalıştırdığınız betiğin bir sertifikayla kriptografik olarak imzalanmış olduğuna güvenmenizi sağlamaktır.

Yürütme Politikası Kapsamları

Öğrendiğiniz gibi yürütme ilkeleri komut dosyası yürütmeyi kısıtlar, ancak PowerShell komut dosyalarını birçok farklı bağlamda çalıştırabilir. PowerShell, komut dosyalarını kullanıcının oturum açtığı bağlam veya genel makine bağlamı altında, SİSTEM olarak çalışan zamanlanmış görevler aracılığıyla veya tek bir açık PowerShell konsolu kapsamında yürütür.

Tüm bu bağlamlara uyum sağlamak için PowerShell'de beş farklı bağlam veya kapsam vardır; bir yürütme ilkesi tanımlayabilirsiniz.

  • MachinePolicy - Bu kapsam tek bir bilgisayarla sınırlıdır. Bu bilgisayarda oturum açan tüm kullanıcıları etkiler ve bir Active Directory grup ilkesi nesnesi bunu ayarlar. Tanımlandığında diğer tüm kapsamlara göre önceliklidir.
  • LocalMachine. Bu, tüm bilgisayar kullanıcılarını etkileyen varsayılan kapsamdır ve HKEY_LOCAL_MACHINE kayıt defteri alt anahtarında depolanır. Set-ExecutionPolicy kullanarak bir yürütme politikası ayarladığınızda bu kapsam varsayılandır.

LocalMachine yürütme ilkesi HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell kayıt defteri anahtarında saklanır.

  • UserPolicy - UserPolicy kapsamı bilgisayardaki yalnızca tek bir kullanıcıyı etkiler ve bir Active Directory grup ilkesi nesnesi bunu ayarlar. Bu politikayı Set-ExecutionPolicy ile değiştiremezsiniz.
  • Geçerli Kullanıcı. CurrentUser ilkesinin kapsamı yalnızca geçerli kullanıcı için yürütme ilkesini ayarlar ve HKEY_CURRENT_USER kayıt defteri kovanında depolanır. Bu politikayı Set-ExecutionPolicy ile değiştiremezsiniz.

CurrentUser'ın yürütme ilkesi HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell kayıt defteri anahtarında saklanır.

  • Süreç - Bu kapsam, tek bir kullanıcı için tek bir PowerShell oturumuna ilişkin yürütme ilkesini tanımlar. Süreç yürütme politikası kapsamı, tanımlayabileceğiniz en ayrıntılı yürütme politikasıdır. Diğer yürütme politikalarından farklı olarak bu politika, kayıt defteri yerine PSExecutionPolicyPreference adlı bir ortam değişkenine kaydedilir.

Yürütme İlkesi Türleri

Yürütme politikalarının çeşitli "güvenlik düzeyleri" vardır. Bu seviyeler yürütme politikasının ne kadar katı olduğunu belirler. Örneğin, aslında hiçbir şey yapmayan bir yürütme politikanız olabilir; devre dışıdır, ancak öte yandan bir yürütme politikası komut dosyasının yürütülmesini tamamen devre dışı bırakabilir.

Bir yürütme politikasının güvenlik düzeyini en azdan en kısıtlayıcıya kadar yapılandırabileceğiniz yolların her birini ele alalım.

Sınırsız

En az kısıtlayıcı politika, hiç etkilemeyen politikadır; Kısıtlamasızdır. Kısıtlanmamış yürütme politikaları esasen devre dışıdır. Yürütme ilkesi Kısıtlanmamış olduğunda, kullanıcılar güvenden bağımsız olarak tüm komut dosyalarını çalıştırabilir.

Kalp ameliyati

Kısıtlanmamış türü gibi, Atla olarak ayarlanan yürütme politikası da hiçbir şeyi engellemez.

Atlatma ve Kısıtlamasız benzer etkiye sahip olsa da, Atlatma yürütme politikası türü teknik olarak bir tür değildir. Tanımlanmış bir yürütme politikasını tamamen atlar.

Tanımsız

Yaygın olarak kullanılmasa da, bir yürütme ilkesini Tanımsız olarak ayarlayarak esasen kaldırabilirsiniz. Bir yürütme ilkesini Tanımsız olarak ayarladığınızda PowerShell, atanan tüm yürütme ilkelerini atanan kapsamdan tamamen kaldırır.

Windows olmayan bilgisayarlarda yürütme politikası her zaman Kısıtlanmamış olarak ayarlanır ve değiştirilemez.

Tüm kapsamlar Tanımsız olarak ayarlandığında PowerShell esas olarak tüm kapsamları Kısıtlanmış olarak ele alır.

Uzaktanİmzalı

Daha önce okuduğunuz gibi, yürütme politikaları tamamen komut dosyalarındaki dijital imza yoluyla kazanılan güven ile ilgilidir. PowerShell ayrıca bu betiğin nereden geldiğini de hesaba katar. Yerel bilgisayarınızda mı yoksa internetteki rastgele bir kişi tarafından mı oluşturuldu?

Yerel bilgisayarınız dışında bir yerde oluşturulan komut dosyalarına doğası gereği güvenilmemelidir. PowerShell'in RemoteSigned yürütme politikasını sağlamasının nedeni budur. RemoteSigned yürütme politikası, tüm komut dosyalarının kriptografik olarak imzalanmak üzere yerel bilgisayarınız dışında bir yere yazılmasını zorunlu kılar.

Dosya Engellemeyi Kaldır cmdlet'ini kullanarak İnternet'ten indirilen dosyalar için bu yürütme politikasını bir dereceye kadar geçersiz kılabilirsiniz. Şununla ilgili daha fazla bilgi edinin: Bu davranış, RemoteSigned İlkesi Nasıl Çalışır bölümünde biraz sonra anlatılacaktır.

Windows Server için varsayılan ilke olarak RemoteSigned atanır.

Tüm İmzalar

Tüm PowerShell komut dosyalarının kriptografik olarak imzalandığından emin olmak istiyorsanız yürütme politikasını AllSigned olarak ayarlayın. RemoteSigned gibi, bu yürütme politikası da imzalama gereksinimini bir adım daha ileri götürür ve tüm komut dosyalarının yürütmeden önce imzalanmasını zorunlu kılar.

AllSigned yürütme politikasını ayarlamış olsanız bile, daha sonra öğreneceğiniz gibi, yürütme politikasını atlayarak yine de bu politikayı aşabilirsiniz.

Sınırlı

En kısıtlayıcı yürütme politikası Kısıtlı'dır. Bir yürütme politikası Kısıtlı olarak belirlendiğinde, kesinlikle hiçbir komut dosyası yürütülemez; Güvenilir olup olmadıklarına bakılmaksızın. Bu politika aslında komut dosyasının yürütülmesini tamamen devre dışı bırakır.

Ayrıca, daha az kısıtlayıcı türlerin aksine Kısıtlı türü, PowerShell biçimlendirmesinin ve yapılandırma dosyalarının (PS1XML), modül komut dosyası dosyalarının (PSM1) ve PowerShell profillerinin yürütülememesini sağlar.

Tüm Windows istemcileri varsayılan olarak Kısıtlı yürütme ilkesine ayarlıdır.

Teknik olarak Microsoft, Varsayılan adında yedinci bir yürütme ilkesi tanımlar, ancak bu tür aslında RemoteSigned (Windows Server) ve Restricted (Windows İstemcileri) için başka bir etikettir.

RemoteSigned Politikası Nasıl Çalışır?

Dikkat edilmesi gereken özel bir senaryo, RemoteSigned yürütme politikasının nasıl çalıştığıdır. Bu yürütme ilkesi (öğrendiğiniz gibi), yerel bilgisayarınız dışında bir yerde oluşturulan komut dosyalarının çalışmasını engeller.

Peki PowerShell betiğin başka bir yerde oluşturulduğunu nasıl biliyor? Veri akışları.

NTFS Veri Akışlarını Anlama ve Sorgulama

NTFS dosya sisteminde bir dosya oluşturduğunuzda, NTFS dosyaya bir alternatif veri akışı (ADS) niteliği uygular. Bir ADS'nin iki dosya özelliği vardır: $Data ve zone.Identifier. PowerShell, bir PowerShell betik dosyasının başka bir yerde oluşturulup oluşturulmadığını belirlemek için zone.Identifier özelliğini kullanır.

Sıkıştırılmış veya Salt Okunur gibi diğer niteliklerin aksine, ADS nitelikleri Dosya Gezgini'nde gizlidir. Ancak PowerShell kullanarak bu veri akışlarını inceleyebilirsiniz.

Komut dosyasının yolunu ve aşağıda gösterildiği gibi Stream parametresini kullanarak Get-Item cmdlet'ini çalıştırın. Bu örnekte, yerel bilgisayara Hello World.ps1 yazılmıştır. Stream özelliğine atanan tek özelliğin $DATA olduğuna dikkat edin. ADS özelliği yoktur.

Get-Item '.\Hello World.ps1' -Stream *

Şimdi aynı komutu internetten indirilen bir komut dosyasında çalıştırın. Şimdi dikkat edin Get-Item, Zone.Identifier'ın Stream'iyle tamamen başka bir nesne döndürüyor.

Bir dosyanın ADS'si olduğunu öğrendikten sonra bölgeyi keşfetmek için Get-Content komutunu kullanabilirsiniz. Bölge, dosyanın nereden geldiğini tanımlar.

Get-Content .\Get-CertDetails.ps1 -Stream zone.identifier

Get-Content, dosyanın geldiği bölgeyi temsil eden bir ZoneId değeri döndürecektir.

Olası bölge değerleri şunlardır:

Zone ID Zone
------- ---------------------
0       My Computer
1       Local Intranet Zone
2       Trusted sites Zone
3       Internet Zone
4       Restricted Sites Zone

Yürütme Politikası Önceliği

Yukarıda ele alındığı gibi, birçok farklı yürütme politikası aynı anda mevcuttur. Tüm bu yürütme politikaları birleştirildiğinde mevcut oturumunuzun ayarlarını belirler. Birden fazla yürütme politikanız geçerli olduğunda önceliğe sahip olmanız gerekir.

İlke önceliği, PowerShell'in farklı kapsamlarda belirlenen farklı ilkeleri uygulama sırasıdır. Bazı yürütme politikaları diğerlerinden daha yüksek önceliğe sahiptir.

Get-ExecutionPolicy -List'i çalıştırdığınızda, şu anda yürürlükte olan tüm yürütme politikalarının en düşük öncelikten en yükseğe doğru sıralandığını göreceksiniz. Örneğin, MachinePolicy'in önceliği daha düşük olduğundan, LocalMachine ve CurrentUser politikaları bunu geçersiz kılacaktır.

Yürütme İlkeleriyle Çalışma

Yürütme politikalarının arka planını yeterince anladığımıza göre, şimdi onlarla nasıl çalışacağımıza bakalım! PowerShell'in yürütme politikalarıyla çalışmak için, şu anda tanımlanmış politikaları keşfetmek için Get-ExecutionPolicy ve yeni politikalar ayarlamak için Set-ExecutionPolicy iki komutunuz vardır.

Şu Anda Atanmış Politikaları Alma

Yürütme ilkelerini değiştirmeye başlamadan önce neyle çalıştığınızı öğrenmeniz gerekir. Bunu yapmak için Get-ExecutionPolicy komutuna sahipsiniz. Bu komut, bilgisayardaki mevcut atanmış ilkelerin tümünü sıralar.

Get-ExecutionPolicy komutunu hiçbir parametre olmadan doğrudan bir PowerShell konsolunda çalıştırdığınızda, geçerli PowerShell oturumunuz için ayarlanan yürütme ilkesi gösterilir.

Yürütme politikasının bir kapsama ayarlandığını görmek için sonuçlarını görmek istediğiniz kapsam adını kullanarak Kapsam parametresini belirtin.

Get-ExecutionPolicy -Scope Process
Get-ExecutionPolicy -Scope LocalMachine

Tüm kapsamları ve yürütme politikalarını görüntülemek için aşağıda gösterildiği gibi List parametresini kullanın.

Get-ExecutionPolicy -list

Yürütme Politikalarını Değiştirme

Şu anda hangi yürütme ilkelerinin atandığını öğrendikten sonra bunları da değiştirebilirsiniz. Tek bir bilgisayarda politikayı değiştirmek için Set-ExecutionPolicy komutunu kullanabilirsiniz. Ancak bir kuruluştaysanız politikaları toplu olarak değiştirmek isteyeceksiniz. Durum buysa, Active Directory etki alanındaysanız her zaman Grup İlkesi'ne sahip olursunuz.

Set-ExecutionPolicy'yi kullanma

Öncelikle Set-ExecutionPolicy komutuyla politikaların nasıl değiştirileceğini ele alalım. Bunu yapmak için PowerShell'i yönetici olarak açın.

Şimdi Set-ExecutionPolicy komutunu, yürütme ilkesinin adını sağlayan tek bir parametreyle (ExecutionPolicy) çalıştırın.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

PowerShell daha sonra yürütme politikasını değiştirmek isteyip istemediğinizi soracaktır. Bunu yaparsanız Y veya A yazın ve Enter tuşuna basın.

Bazı PowerShell komutlarının çalışması için birden fazla başka görevi çalıştırması gerekir. Yukarıdaki örnekte Y girerseniz PowerShell sizden her adım için devam etmenizi isteyebilir. A tuşuna basarsanız sonraki tüm adımlara devam edilecektir.

Set-ExecutionPolicy'i İstemsiz Çalıştırma

Varsayılan olarak, Set-ExecutionPolicy'i çalıştırdığınızda, yürütme politikasını değiştirmek isteyip istemediğiniz sorulacaktır. Komutunuza Force parametresini ekleyerek bu istemi atlayabilirsiniz. Force parametresinin kullanılması tüm onay istemlerini bastıracaktır.

Set-ExecutionPolicy RemoteSigned -Force

Kayıt Defteri Aracılığıyla PowerShell Yürütme Politikasını Ayarlama

Yürütme ilkelerinin çoğu kayıt defterinde saklandığından (İşlem) hariç), ilkeleri doğrudan kayıt defteri aracılığıyla da değiştirebilirsiniz.

Yürütme ilkelerini kayıt defteri aracılığıyla değiştirmek için:

  1. Windows Kayıt Defteri Düzenleyicisi'ni (regedit) veya seçtiğiniz kayıt defteri düzenleme aracını açın.

2. Değiştirmek istediğiniz yürütme ilkesi kapsamının kayıt defteri anahtarına gidin.

LocalMachine - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

Geçerli Kullanıcı - HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

3. Kayıt defteri anahtarına sağ tıklayın ve ExecutionPolicy adında yeni bir dize değeri oluşturun.

4. Yeni oluşturulan ExecutionPolicy dize değerini çift tıklayın ve istediğiniz yürütme politikası adını girin (Restricted, RemoteSigned, AllSigned ) , Sınırsız veya Tanımsız).

5. Aynı anahtarda Yol adında başka bir dize değeri oluşturun. Path dize değeri, PowerShell altyapısının yolunu temsil eder. Path değerinin, Windows PowerShell motorunu işaret eden C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe olduğundan emin olun.

CurrentUser yürütme politikası, LocalMachine politikasını geçersiz kılar. Kayıt defterinde ayarlanmış bir CurrentUser politikanız varsa ve yürütme politikasını varsayılan olarak LocalMachine'de ayarlayan Set-ExecutionPolicy aracılığıyla değiştirmeye çalışırsanız kapsamında, PowerShell aşağıda gösterilen bir hata döndürecektir.

Grup İlkesi Aracılığıyla PowerShell Yürütme İlkesini Ayarlama

Active Directory'ye sahip bir kuruluştaysanız, tüm Windows makinelerinize gidip Set-ExecutionPolicy cmdlet'ini çalıştırmak istemeyeceksiniz. Bunun yerine Grup İlkesi ile ilkeleri toplu olarak yönetebilirsiniz.

Yürütme ilkelerini GPO aracılığıyla yönetmek için:

Grup İlkesi Nesnesini Oluşturun

  1. Grup İlkesi Yönetimi uygulamasını bir etki alanı denetleyicisinde veya etki alanına katılmış iş istasyonunuzda açın.

2. Etki Alanları —> —> Grup İlkesi Nesneleri'ni genişletin.

3. Grup İlkesi Nesneleri'ni sağ tıklayın ve Yeni'yi tıklayın.

4. GPO'nuza bir ad verin. Bu öğreticide GPO'ya PowerShell Yürütme İlkesi adı verilmektedir.

5. Yeni oluşturulan GPO'yu sağ tıklayın ve Düzenle'yi tıklayın.

6. Bilgisayar Yapılandırması\İlkeler\Yönetim Şablonları\Windows Bileşenleri\Windows PowerShell'e gidin.

7. Sağ pencere bölmesindeki ayarı açın, Komut Dosyası Yürütmeyi Aç ayarını açın.

8. Komut Dosyası Yürütmeyi Aç kutusunda Etkin seçeneğini seçin. Artık aşağıda gösterilen seçeneklerden herhangi birini seçebilirsiniz:

9. Şimdi Yürütme Politikası'nı istediğiniz politikayla değiştirin.

  • Yalnızca imzalı komut dosyalarına izin ver - Güvenilir bir yayıncı imzaladığında tüm komut dosyalarının yürütülmesine izin verir.
  • Yerel komut dosyalarına ve uzaktan imzalı komut dosyalarına izin ver - Yerel komut dosyalarının çalıştırılmasına izin verir ancak internetten indirilen komut dosyalarının güvenilir bir yayıncı tarafından imzalanması gerekir.
  • Tüm komut dosyalarına izin ver - Tüm komut dosyalarının çalıştırılmasına izin verir.

Grup İlkesi Nesnesini Atama

GPO'yu oluşturduktan sonra, onu hedef bilgisayarlarınıza atamanın zamanı geldi. Bunu yapmak için GPO'yu bir Active Directory Kuruluş Birimi'ne (OU) atamanız gerekir.

Yeni bir GPO oluşturmak yerine mevcut bir GPO'yu düzenlediyseniz, bu GPO muhtemelen zaten bir kuruluş birimine atanmış durumdadır.

  1. Grup İlkesi Yönetimi'nde, Etki Alanları —> —> < seçeneğine giderek tercih ettiğiniz kuruluş birimine gidin. Kuruluş biriminiz>.

2. Kuruluş birimini sağ tıklayın ve Mevcut bir GPO'yu Bağla… seçeneğini seçin.

3. Yeni oluşturulan GPO'yu seçin (PowerShell Yürütme Politikası) ve Tamam'ı tıklayın.

Şimdi OU'ya atanan GPO'yu aşağıda gösterildiği gibi görmelisiniz.

Bu noktada, tanımlanan Grup İlkesi yenileme aralığını bekleyebilir veya yenilemeyi zorlamak için hedef bilgisayarda gpupdate komutunu çalıştırabilirsiniz.

Yerel Politika Değişikliklerini Kilitleme

Yürütme politikasını değiştiren bir GPO etkinleştiğinde, yerel kullanıcılar artık politikayı yerel PowerShell konsolu aracılığıyla değiştiremez. Eğer denerlerse aşağıda gösterildiği gibi bir hata alacaklardır.

Yürütme Politikasını Tamamen Atlamak

Daha önce de belirtildiği gibi, bir yürütme politikasının mutlaka bir güvenlik önlemi olması anlamına gelmez. Neden? Çünkü isterseniz birkaç farklı yolla bunu tamamen atlayabilirsiniz.

-ExecutionPolicy Bypass Parametresini Kullanma

Diğer yürütme politikalarından farklı olarak, Bypass politikası genellikle PowerShell konsolunda ayarlanmaz, yönetici olarak çalıştırılan powershell.exe motoruna aktarılır.

Örneğin, herhangi bir yürütme politikasını tamamen atlayarak Hello World.ps1 adlı bir komut dosyasını çalıştırmak için powershell.exe'yi çağırın, Bypass parametresini kullanın ve aşağıdakileri sağlayın: aşağıda gösterildiği gibi dosya yolunu seçin.

powershell.exe -executionpolicy bypass -file '.\Hello World.ps1'

Komut Dosyalarını Okumak ve Ham Kodu Çalıştırmak

Ayrıca, önce bir betiğin içeriğini okuyarak ve ardından bu içeriği doğrudan PowerShell motoruna aktararak herhangi bir yürütme ilkesini aşabilirsiniz. Bunu yaptığınızda, her bir komut tek seferde çalıştırılır ve bir komut dosyası olarak çalıştırılmaz.

Aşağıda görebileceğiniz gibi, yürütme politikası Kısıtlı olarak ayarlanmıştır, ancak komut dosyasını okuyup onu powershell.exe'ye ilettiğinizde hala çalışır.

Bu yaklaşım, bir betiği PowerShell ISE veya Visual Studio Code gibi bir PowerShell düzenleyicisinde açmaya, bir satır seçip F8 tuşuna basmaya benzer.

Get-Content '.\Hello World.ps1' | powershell.exe -noprofile

Çözüm

Artık PowerShell yürütme politikaları hakkında bilmeniz gereken her şeyi biliyor olmalısınız. Teknik olarak bir güvenlik önlemi olmasalar bile bunları kuruluşunuzda kuruluş politikalarına göre yönetmelisiniz.

İlgili makaleler