Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, İş için Uygulama Denetimi'nin PowerShell'i nasıl güvenli bir şekilde güvence altına alır ve uyguladığı kısıtlamalar açıklanmaktadır. PowerShell'in güvenli davranışı, kullandığınız Windows ve PowerShell sürümüne göre değişir.
PowerShell sistem kilitleme ilkesini nasıl algılar?
PowerShell, sistem genelinde hem AppLocker hem de İş için Uygulama Denetimi ilkelerini algılar. Microsoft artık AppLocker'a yatırım yapmaz. AppLocker yalnızca güvenlik düzeltmelerini alır. Uygulama Denetimi, Windows için tercih edilen uygulama denetim sistemidir.
Eski Uygulama Denetimi ilkesi uygulamasının algılanması
PowerShell, iki şeyi keşfetmek için eski Uygulama Denetimi WldpGetLockdownPolicy API'sini kullanır:
- Sistem genelinde ilke uygulaması:
None,Audit,Enforce - Tek tek dosya ilkesi:
None,Audit(ilke tarafından izin verilir),Enforce(ilke tarafından izin verilmez)
Tüm PowerShell sürümleri (v5.1 - v7.x) bu Uygulama Denetimi ilkesi algılamasını destekler.
En son Uygulama Denetimi ilkesi uygulama tespiti
Uygulama Denetimi, Windows'un son sürümlerinde yeni API'ler kullanıma sunulmuştur. PowerShell, 7.3 sürümünden başlayarak dosyanın nasıl işleneceğini belirlemek için yeni WldpCanExecuteFile API'yi kullanır. Windows PowerShell 5.1 bu yeni API'leri desteklemez. Yeni API, tek tek dosyalar için eski API'den önceliklidir. Ancak PowerShell, sistem genelinde ilke yapılandırmasını almak için eski API'yi kullanmaya devam eder. Yeni API kullanılamıyorsa PowerShell eski API davranışına geri döner.
Yeni API her dosya için aşağıdaki bilgileri sağlar:
WLDP_CAN_EXECUTE_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_CAN_EXECUTE_REQUIRE_SANDBOX
Kilitleme ilkesi altında PowerShell davranışı
PowerShell hem etkileşimli hem de etkileşimli olmayan modlarda çalıştırılabilir.
- Etkileşimli modda, PowerShell kullanıcıların komut satırı girdilerini komut veya betik olarak çalıştırmak üzere alan bir komut satırı uygulamasıdır. Sonuçlar kullanıcıya geri görüntülenir.
- Etkileşimli olmayan modda PowerShell modülleri yükler ve betik dosyalarını kullanıcı girişi olmadan çalıştırır. Sonuç veri akışları yok sayılır veya bir dosyaya yönlendirilir.
İlke uygulaması kapsamında çalışan etkileşimli mod
PowerShell, komutları ConstrainedLanguage modunda çalıştırır. Bu mod, etkileşimli kullanıcıların belirli komutları çalıştırmasını veya rastgele kod yürütmesini engeller. Bu moddaki kısıtlamalar hakkında daha fazla bilgi için bu makalenin kilitleme ilkesi altındaki PowerShell kısıtlamaları bölümüne bakın.
İlke uygulaması altında çalışan etkileşimsiz mod
PowerShell bir betik çalıştırdığında veya bir modül yüklediğinde, dosya için ilkenin nasıl uygulanacağını belirlemek üzere Uygulama Denetimi API'sini kullanır.
PowerShell sürüm 7.3 veya üzeri, mevcutsa WldpCanExecuteFile API'sini kullanır. Bu API aşağıdaki sonuçlardan birini döndürür:
-
WLDP_CAN_EXECUTE_ALLOWED: İlke, dosyanın birkaç kısıtlamayla moddaFullLanguagekullanılmasına izin verir. -
WLDP_CAN_EXECUTE_BLOCKED: İlke dosyaya izin vermemektedir. PowerShell, dosya çalıştırıldığında veya yüklendiğinde bir hata oluşturur. -
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: Politika dosyayı onaylamaz, ancakConstrainedLanguagemodunda çalıştırılabilir veya yüklenebilir.
Windows PowerShell 5.1'de veya API kullanılamıyorsa WldpCanExecuteFile PowerShell'in dosya başına davranışı şöyledir:
-
None: Dosya birkaç kısıtlamaylaFullLanguagemodunda yüklenir. -
Audit: Dosya,FullLanguagemodunda hiçbir kısıtlama olmaksızın çalıştırılır veya yüklenir. PowerShell 7.4 veya sonraki sürümlerde ilke, kısıtlama bilgilerini Windows olay günlüklerine kaydeder. -
Enforce: Dosya,ConstrainedLanguagemodunda çalıştırılır veya yüklenir.
Kilitleme ilkesi kapsamındaki PowerShell kısıtlamaları
PowerShell, sistemin bir App Control kilitleme politikası altında olduğunu algıladığında, betik güvenilir olsa bile FullLanguage modunda çalışırken kısıtlamalar uygular. Bu kısıtlamalar, PowerShell'in kilitli bir sistemde rastgele kod yürütülmesine neden olabilecek bilinen davranışlarını engeller. Kilitleme ilkesi aşağıdaki kısıtlamaları uygular:
Joker karakterli işlev dışarı aktarma kısıtlaması ile noktalı kaynak oluşturma modülü
Betiklerde nokta kaynak kullanımı yapan ve işlevleri joker karakterli adlarla dışa aktaran herhangi bir modül hataya neden olur. Joker karakterli dışa aktarmaların engellenmesi, nokta kaynak yöntemiyle güvenilir bir modüle dahil edilen güvenilmeyen bir betiği yerleştirebilen kötü amaçlı bir kullanıcının betik enjeksiyonu yapmasını önler. Daha sonra kötü amaçlı betik, güvenilen modülün özel işlevlerine erişim sağlayabilir.
Güvenlik önerisi: Bir modülde betiği nokta kaynaklama yöntemiyle asla kullanmayın ve modül fonksiyonlarını her zaman açıkça belirtilmiş adlarla dışa aktarın (joker karakter kullanmadan).
Joker karakterli fonksiyon dışa aktarma kısıtlamasına sahip iç içe modül
Üst modül işlev adı joker karakterlerini kullanarak işlevleri dışarı aktarırsa PowerShell, iç içe yerleştirilmiş modüldeki işlev adlarını işlev dışarı aktarma listesinden kaldırır. İç içe modüllerden joker karakter dışarı aktarmanın engellenmesi, joker karakter adı eşleştirme yoluyla tehlikeli iç içe geçmiş işlevlerin yanlışlıkla dışarı aktarılmasını önler.
Güvenlik önerisi: Modül işlevlerini her zaman açık adlarla (joker karakter olmadan) dışarı aktarın.
Etkileşimli kabuk parametre türü dönüştürme
Sistem kilitlendiğinde, etkileşimli PowerShell oturumları rastgele kod yürütülmesini önlemek için modda
ConstrainedLanguageçalışır. Oturuma yüklenen güvenilir modüller,FullLanguagemodunda çalışır. Güvenilir bir modülün cmdlet’i parametrelerinde karmaşık türler kullanıyorsa, güven sınırları arasında dönüştürmeye izin verilmiyorsa parametre bağlaması sırasında tür dönüştürme başarısız olabilir. Hata, PowerShell bir tür oluşturucu çalıştırarak bir değeri dönüştürmeye çalıştığında oluşur. Tür oluşturucularının moddaConstrainedLanguageçalışmasına izin verilmez.Bu örnekte, parametre bağlama türü dönüştürmeye normalde izin verilir, ancak modda
ConstrainedLanguageçalıştırıldığında başarısız olur. TürConnectionPortoluşturucuya izin verilmez:PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".Enter-PSHostProcesscmdlet'e izin verilmiyorEnter-PSHostProcessCmdlet devre dışı bırakılır ve kullanılırsa bir hata oluşturur. Bu komut ekleme ve hata ayıklama oturumları için kullanılır. Yerel makinedeki diğer Tüm PowerShell oturumlarına bağlanmanızı sağlar. Bilgilerin açığa çıkmasını ve rastgele kod yürütülmesini önlemek için cmdlet devre dışı bırakılır.
Kısıtlanmış dil modu altında PowerShell kısıtlamaları
Uygulama Denetimi ilkesi tarafından onaylanmayan bir betik veya işleve güvenilmez. Güvenilmeyen bir komut çalıştırdığınızda, PowerShell komutun çalışmasını engeller (yeni davranış) veya komutu modda ConstrainedLanguage çalıştırır. Mod için ConstrainedLanguage aşağıdaki kısıtlamalar geçerlidir:
Add-Typecmdlet'e izin verilmiyorEngelleme
Add-Type, rastgele .NET kodunun yürütülmesini engeller.Import-LocalizedDatacmdlet kısıtlandıöğesinin SupportedCommand parametresinin
Import-LocalizedDataengellenmesi, rastgele kodun yürütülmesini engeller.Invoke-Expressioncmdlet kısıtlandıCmdlet'e
Invoke-Expressiongeçirilen tüm betik blokları, rastgele kod yürütülmesini önlemek için moddaConstrainedLanguageçalıştırılır.New-Objectcmdlet kısıtlandıNew-ObjectCmdlet, güvenilmeyen türlere erişimi önlemek için yalnızca izin verilen .NET ve COM türlerini kullanmakla sınırlıdır.ForEach-Objectcmdlet kısıtlamasıForeEach-Objectöğesine geçirilen değişkenler için, onaylı listede yer almayan hiçbir .NET türünde tür yöntemi çağrısına izin verilmez. Genel olarak,ConstrainedLanguagemodu, güvenilmeyen .NET türlerine erişimi önlemek için onaylanmış .NET türleri dışındaki herhangi bir nesne yöntemi çağrısına izin vermez.Export-ModuleMembercmdlet kısıtlamasıAlt modüle güvenilmeyen, üst modüle ise güvenilen bir iç içe modül betik dosyasında işlevleri dışa aktarmak için
Export-ModuleMembercmdlet’ini kullanmak bir hataya neden olur. Bu senaryo engellenirken, kötü amaçlı güvenilmeyen bir modülün tehlikeli işlevleri güvenilen bir modülden dışarı aktarması engellenir.New-Modulecmdlet kısıtlamasıNew-Moduleöğesini güvenilen bir betikte çalıştırdığınızda,ScriptBlockparametresi tarafından sağlanan herhangi bir betik bloğu, rastgele kodun güvenilen bir yürütme bağlamına eklenmesini önlemek içinConstrainedLanguagemodunda çalışacak şekilde işaretlenir.Configurationanahtar sözcüğüne izin verilmiyorKod ekleme saldırılarını önlemek için,
ConfigurationmodundaConstrainedLanguagelanguage anahtar sözcüğüne izin verilmez.classanahtar sözcüğüne izin verilmiyorRastgele kod eklenmesini önlemek için,
classmodundaConstrainedLanguagedil anahtar sözcüğüne izin verilmez.Komut Dosyası Bloğu işleme kapsamı kısıtlamaları
Betik blokları farklı güven düzeylerine sahipse alt betik bloklarının üst betik bloğu kapsamlarında çalıştırılmasına izin verilmez. Örneğin, bir komut dosyasını başka bir komut dosyasına nokta kaynaklama yöntemiyle dahil ettiğinizde bir alt ilişki oluşturursunuz. Bu senaryoyu engellemek, güvenilmeyen bir betiğin güvenilir betik kapsamındaki tehlikeli fonksiyonlara erişim kazanmasını önler.
Komutların güvenilmeyen betik işlevlerini bulmasını önleyin
PowerShell’de komut keşfi, örneğin güvenilmeyen bir betik veya modül gibi güvenilmeyen bir kaynaktan gelen işlevleri güvenilir bir işleve döndürmez. Güvenilmeyen komutların bulunmasını engellemek, komut ekleme yoluyla kod eklenmesini önler.
Hashtable'dan nesneye dönüştürmeye izin verilmiyor
ConstrainedLanguagemodu, olası kod enjeksiyonu saldırılarını önlemek için PowerShell veri (Data) dosyalarının.psd1bölümlerinde hashtable'dan nesneye dönüştürmeleri engeller.Otomatik tür dönüştürme kısıtlandı
ConstrainedLanguagemodu, olası kod ekleme saldırılarını önlemek için küçük bir onaylanan güvenli türler kümesi dışında otomatik tür dönüştürmeyi engeller.Örtük modül fonksiyonu dışa aktarma kısıtlaması
Bir modül işlevleri açıkça dışarı aktarmazsa, PowerShell tüm tanımlı modül işlevlerini otomatik olarak bir kolaylık özelliği olarak örtük olarak dışarı aktarır.
ConstrainedLanguagemodunda, bir modül güven sınırları arasında yüklendiğinde örtük dışa aktarmalar artık gerçekleşmez. Örtük dışarı aktarmaların engellenmesi, genel kullanıma yönelik olmayan tehlikeli modül işlevlerinin istenmeyen şekilde açığa çıkmasını önler.Betik dosyaları modül olarak içeri aktarılamaz
PowerShell, betik dosyalarını (
.ps1) modül olarak içeri aktarmanızı sağlar. Tüm tanımlı işlevler genel olarak erişilebilir hale gelir.ConstrainedLanguagemodu, tehlikeli betik işlevlerinin istenmeyen şekilde açığa çıkmasını önlemek için betik dosyasının içeri aktarılmasını engeller.Değişken ayarlama
AllScopekısıtlamasıConstrainedLanguagemodu, değişkenler üzerinde ayarlamaAllScopeözelliğini devre dışı bırakır. Değişkenlerin kapsamını sınırlamak, değişkenlerin güvenilen komutların oturum durumunu engellemesini önler.Tür yöntemi çağırmaya izin verilmiyor
ConstrainedLanguagemodu, onaylanmamış türlerde yöntem çağrısına izin vermez. Onaylanmamış türlerdeki engelleme yöntemleri, tehlikeli olabilecek .NET türü yöntemlerinin çağrılmasını engeller veya kod eklemeye izin verir.Tür özelliği ayarlayıcılarına izin verilmiyor
ConstrainedLanguagemodu, onaylanmamış türlerde özellik ayarlayıcılarının çağrılmalarını kısıtlar. Onaylanmamış türlerde özellik ayarlayıcılarının engellenmesi, kod ekleme saldırılarını önler.Tür oluşturmaya izin verilmiyor
ConstrainedLanguagemod, kod eklemeye izin verebilecek güvenilmeyen oluşturucuları engellemek için onaylanmamış türlerde tür oluşturmayı engeller.Modül kapsamı işlecine izin verilmiyor
ConstrainedLanguagemodu modül kapsamı işlecinin kullanılmasına izin vermez. Örneğin:& (Get-Module MyModule) MyFunction. Modül kapsamı işlecini engellemek, modül özel işlevlerine ve değişkenlerine erişimi engeller.
Daha fazla bilgi
- PowerShell dil modları hakkında daha fazla bilgi için bkz . about_Language_Modes.
- Uygulama Denetimi'ni yapılandırma ve kullanma hakkında bilgi için bkz . PowerShell için Uygulama Denetimi'ni kullanma.
PowerShell