Merhabalar,
Bu makalemde, basit ama önemli bir konu olduğunu düşündüğüm, PowerShell üzerindeki güvenlik seviyeleriyle yani PowerShell Execution Policy ile ilgili bilgileri aktarmak istiyorum.
PowerShell Execution Policy, PowerShell ‘in yapılandırma dosyalarını yüklediği ve script’lerin çalışma koşullarını denetleyen bir güvenlik özelliğidir. Bu özellik, kötü amaçlı script’lerin yürütülmesini de önlemeye yardımcı olur.
Windows işletim sistemine sahip bilgisayarlarda ya da sunucularda, yerel bilgisayar için, geçerli kullanıcı veya belirli bir oturum için Execution Policy’leri ayarlayabilirsiniz. Ayrıca, bilgisayarlar ve kullanıcılara yönelik Execution Policy ayarlamak için bir grup policy (GPO) de kullanabilirsiniz.
Yerel bilgisayar ve geçerli kullanıcı için Execution Policy’ler kayıt defterinde saklanır. PowerShell profilinizde Execution Policy’leri ayarlamanız gerekmez. Belirli bir oturuma ait Execution Policy ayarları, yalnızca bellekte depolanır ve oturum kapatıldığında kaybedilir.
Execution Policy, kullanıcı eylemlerini kısıtlayan bir güvenlik sistemi değildir. Bunları, arabalarda bulunan emniyet kemerlerine benzetebiliriz. PowerShell konusunda bilgisi olmayan son kullanıcıları, yanlışlıkla ya da değil, kendilerine veya sistemlere zarar vermekten koruyan emniyet kilidi gibi düşünebiliriz. Elbetteki mutlak şekilde sistemi koruyamaz, fakat zarar verecek bir işlem için birkaç katman geçilmesi gerekeceği için, ilk olay anında sisteme zarar verilmesine engel olur.
Örnekle açıklamak gerekirse;
Kullanıcılar, normalde çalıştıramayacakları bir script içeriğini, komut satırında komut satırı içeriğini yazarak herhangi bir politikayı kolayca atlatabilir. Bunun yerine, Execution Policy’ler kullanılarak, kullanıcıların temel kuralları belirlemesi ve bunların yanlışlıkla ya da bilerek ihlal edilmesi de engellenmiş olur.
PowerShell komut satırı, oldukça güçlü bir araçtır. İlgili bilgisayara ya da sunucuya, doğrudan erişim imkanı sağlar. Sistem yönetimi açısından baktığınızda, tarihin/saatin alınması ve ayarlanmasından tutun da uygulamaların yüklenmesi/kaldırılmasına kadar birçok işlemi, komut satırından yapmanıza imkan verir. Hatta grafik arabirimden göremediğiniz bazı parametreleri bile powershell komut satırından kolaylıkla değiştirebilirsiniz.
Bu açıdan baktığınızda, çeşitli güvenlik seviyelerine sahip olmasını da beklersiniz. İşte bu aşamada, PowerShell Execution Policy türlerini incelememiz gerekmektedir.
PowerShell Execution Policy Türleri
PowerShell Execution Policy’lerin çeşitli güvenlik seviyeleri vardır. Bu güvenlik seviyeleri, PowerShell komut satırının nasıl davranacağını denetlemek için ayarlanabilir. Bu seviyeleri incelemek ve yardım dosyalarını sisteme aktarmak isterseniz, aşağıdaki komutu kullanabilirsiniz. Böylece yardım dosyalarını kullanarak daha detaylı bilgiler elde edebilirsiniz.
Get-Help about_Execution_Policies
Komut çıktısında, policy türlerini göreceksiniz.
Şimdi bu policy türlerine göz atalım. Çıktıdan da görebileceğiniz üzere, Execution Policy türleri aşağıdaki gibidir:
- AllSigned
- ByPass
- RemoteSigned
- Restricted
- Unrestricted
Bunlar dışında, Default ve Undefined değerleri de vardır. Birazdan örneklerini göreceksiniz ama kısaca Default ve Undefined değerlerinin ne anlama geldiğini hemen özetlemek isterim.
Default;
Default Execution Policy uygulanır. Default Execution policy uygulandığında, Default değerler aşağıdaki gibi olmaktadır.
- Windows client’lar için RESTRICTED
- Windows sunucular için ise REMOTESIGNED
Undefined;
İlgili scope için Undefined değeri görünüyorsa, etki eden Execution Policy aşağıdaki gibi olur:
- Windows client’lar için RESTRICTED
- Windows sunucular için ise REMOTESIGNED
Yani Undefined gördüğünüz herhangi bir scope için, Default değerler kullanılmış olur.
Şimdi türleri incelemeye başlayalım…
1. AllSigned
- Script’ler çalıştırılabilir.
- Fakat local makinede yazılanlar da dahil olmak üzere, çalıştırılabilecek tüm script’ler, güvenilir bir yayıncı tarafından imzalanmış olmalıdır.
- Eğer bu politika kullanılıyorsa, çalıştırmak istediğiniz script’in çalıştırılmasından önce, trusted ya da untrusted olarak imzalanmamış script’ler içinuyarılar gösterilir.
- İmzalanmış, fakat zararlı içeriğe sahip script’ler, bu policy kullanılırken risk teşkil edebilir.
2. ByPass
- Hiç bir bloklama yapılmaz, uyarı ya da işaret verilmeden ilgili script’ler çalıştırılabilir.
- Bu Policy, daha ziyade bir PowerShell script’inin yerleşik olduğu yapılandırmalar veya PowerShell’in kendi güvenlik modeline sahip bir programın temelinde olduğu yapılandırmalar için tasarlanmıştır.
3. RemoteSigned
- Sunucu sistemleri için default policy’dir.
- Script’ler çalıştırılabilir.
- Script’lerin ya da konfigürasyon dosyalarının, güvenilir bir yayıncı tarafından imzalanmış olmasını gerektirir.
- İnternetten download edilmeyen ama local makine üzerinde yazılmış olan script’lerin çalışmasında, dijital olarak imzalanmış olma şartı aranmaz.
- İnternetten download edilen ama imzalı olmayan script’ler, bloke edilmemiş ise çalıştırılabilir.
- İnternet dışındaki kaynaklardan, imzasız script dosyaları ve kötü amaçlı olabilecek imzalı komut dosyaları çalıştırmada riskler ortaya çıkabilir.
4. Restricted
- Windows client’lar için default policy’dir.
- Tek tek komutlara izin verir, ancak script’lerin çalışmasına izin vermez.
- Biçimlendirme ve konfigürasyon dosyaları (.psm1xml), module script dosyaları (.psm1), PowerShell profilleri (.ps1) dahil, tüm script’lerin çalışması engellenir.
5. Unrestricted
- Hiçbir sınırlamanın olmadığı policy’dir. PowerShell komut dosyalarını herhangi bir kısıtlama olmadan çalıştırmanıza olanak sağlar.
- İmzalanmamış script’ler çalıştırılabilir. Dolayısıyla riskli işlemlere açıktır.
- Bu politika hiçbir ortamda güvenli değildir ve yalnızca ne yaptığınızı bildiğiniz zaman uygulanmalıdır.
PowerShell Execution Policy Scope’ları
Execution policy kavramını ve türlerini açıkladıktan sonra, hangi Scope’lara uygulandığını incelemekte fayda vardır. Execution policy scope’ları aşağıdaki gibidir.
- MachinePolicy
- UserPolicy
- Process
- CurrentUser
- LocalMachine
Bu scope’ları aşağıdaki komut ile görebiliriz.
Get-ExecutionPolicy -List
Bakınız bu komut çıktısında, yukarıda da açıklamalarını yaptığım policy türlerini ve hangi Scope’lara uygulandığını görmektesiniz. Yukarıda da aktardığım gibi, burada gördüğünüz Undefined değerlerinin, default değerleri ifade ettiğini yinelemek isterim.
İlgili kullanıcı için, ilgili makinede uygulanan policy hakkında kısa bilgi almak isterseniz, parametre kullanmadan direkt olarak komutu yazmanız yeterlidir.
Get-ExecutionPolicy
Restricted görüyorsak, bunun bir windows client olduğunu hemen söyleyebiliyoruz artık değil mi? J Sunucu olsaydı bu default değer, RemoteSigned olacaktı…
Bu scope’ları da kısaca açıklamak istiyorum:
MachinePolicy :
Bilgisayarın tüm kullanıcıları için GPO’lar kapsamında uygulanır.
UserPolicy :
Bilgisayarın geçerli kullanıcısı için GPO’lar kapsamında uygulanır.
Process :
Yalnızca geçerli PowerShell oturumunu etkiler. Burada ayarlanan Yürütme Politikası en yüksek önceliğe sahiptir. Bu nedenle, Process’de ayarladığınız policy, CurrentUser ve LocalMachine düzeylerinde ayarlanan ilkeleri geçersiz kılar. Default olarak, Process’de ayarlanan PowerShell execution policy, Undefined değerindedir. Bu nedenle, CurrentUser üzerinde ayarlanan policy işleme uygulanır.
Fakat unutmayınız ki, bu makinenin domain ortamında olup olmamasına göre de bu uygulama şekilleri değişebilir !!!
Diğerlerinden farklı olarak, kayıt defteri yerine PSExecutionPolicyPreference adlı bir ortam değişkenine kaydedilir. ($env:PSExecutionPolicyPreference) PowerShell oturumu kapatıldığında, değişken ve değer silinir.
CurrentUser :
Execution policy, yalnızca geçerli kullanıcıyı etkiler. Yeni açılan bir PowerShell oturumunda, ortaya çıkan policy, CurrentUser’da ayarlanan policy olacaktır. HKEY_CURRENT_USER kayıt defteri alt anahtarında depolanır.
CurrentUser’da ayarlanan PowerShell execution policy Undefined ise, Process düzeyinde bir geçersiz kılma olmadığı sürece, LocalMachine’de ayarlanan policy, CurrentUser’a uygulanacaktır.
LocalMachine :
Execution policy, geçerli bilgisayardaki tüm kullanıcıları etkiler. HKEY_LOCAL_MACHINE kayıt defteri alt anahtarında depolanır.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
CurrentUser, LocalMachine veya Process’te ayarlanan bir policy yoksa ve Undefined değeri görünüyorsa, kullanılan sistemin sunucu veya client olmasına göre yukarıda da açıkladığım üzere, default değerlerin uygulanacağını tekrarlamak isterim.
Powershell Execution Policy Ayarlarını Değiştirme
Genel olarak ayarları görmek ve değiştirmek için iki komut kullanılır.
- İlgili policy görüntülemek için Get-ExecutionPolicy
- İlgili policy değiştirmek için ise Set-ExecutionPolicy
Şimdi bu komutların nasıl uygulandığına bakalım…
Öncelikle Get-ExecutionPolicy komutunu uygulayalım.
Get-ExecutionPolicy
Bakınız burada Restricted olan bir değer görmekteyiz. Peki burada görebileceğimiz değerler nelerdir? Aşağıdaki komutla bunu görebilirsiniz.
Get-ExecutionPolicy -List
Bu esnada regedit kayıt defterindeki değer de aşağıdaki şekildedir.
Madem Scope kavramını da açıkladık, o zaman sadece tek bir Scope için execution policy değerini almak istediğimizde, -Scope parametresini kullanabiliriz.
Get-ExecutionPolicy -Scope Process
Şimdi bu değerleri set komutuyla değiştirmeyi görelim…
Set-ExecutionPolicy RemoteSigned
Remote signed olarak değişti ve şimdi de registery de nasıl göründüğüne bakalım.
Tüm tüm Scope’larda nelerin değiştiğini görelim şimdi de…
Get-ExecutionPolicy -List
Demek ki Scope belirtmeden yazdığımız komut, LocalMachine Scope’una etki eden bir komut oluyor. Gördüğünüz gibi yazılan komut, LocalMachine scope’unu değiştirdi.
Peki farklı scope’lardaki seviyeleri değiştirmek için ne yapmalıyız? Bunun için -Scope parametresini kullanacağız. Örneğin CurrentUser için bu değişimi yapalım ve sonucu görelim.
Set-ExecutionPolicy -Scope CurrentUser Unrestricted
Bu komutu -ExecutionPolicy parametresini kullanarak, şu şekilde de kullanabilirdiniz:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
O zaman bu komutu kullanarak, her iki scope için de ilk değerlerine geri döndürelim. Yani CurrentUser ve LocalMachine scope’ları için Undefined olarak değiştirelim.
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
Burada -Scope parametresini, komut içinde sadece bir defa kullanabiliyoruz ve dolayısıyla iki scope için iki ayrı komut yazarak bu değişimi yapabiliyoruz.
Bir powershell script’i komut satırından çalıştıramıyorsanız ve komut çıktısında hatalar alıyorsanız, bunun sebebi, etki altında olduğunuz Execution Policy ayarıdır.
Bir önceki makalemden bir örnekle açıklamak gerekirse, VMware PowerCLI komutlarını kullanmak istediğimizi var sayalım ve bir modülü powershell komut satırına import edip çalıştırmak istemiş olalım.
Bu durumda, güvenlik seviyesini, yani uygulanan Execution Policy ayarını, yukarıda da gösterdiğim şekilde Set-ExecutionPolicy komutuyla, uygun bir güvenlik seviyesine çekmeniz gerekebilir. Elbette ki çalıştırılacak olan bir script ise, güvenli olup olaması durumunda neleri etkileyeceğini değerlendirip bu kararı vermelisiniz.
Set-ExecutionPolicy Unrestricted
Bu işlemden sonra tekrar modül import etmeyi deneyelim.
Import-Module VMware.PowerCLI
Execution Policy konusundaki tüm işlemlerimiz bu kadardır. Powershell Execution Policy ayarlarını, hem detaylı hem kolay hem de akılda kalıcı şekilde aktarabilmiş olmayı ümit ediyorum…
Devam niteliğindeki makalemde, Active Directory Domain Controller üzerinde, GPO ile bu işlemlerin nasıl yapılabileceğine dair bilgileri paylaşacağım.
Yararlı olması dileğiyle.
Yusuf İşleyen