Uygulama Denetimi PowerShell ile nasıl çalışır?

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_ALLOWED
  • WLDP_CAN_EXECUTE_BLOCKED
  • WLDP_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 modda FullLanguage kullanı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, ancak ConstrainedLanguage modunda ç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ıtlamayla FullLanguage modunda yüklenir.
  • Audit: Dosya, FullLanguage modunda 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, ConstrainedLanguage modunda ç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, FullLanguage modunda ç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 modda ConstrainedLanguage ç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ür ConnectionPort oluş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-PSHostProcess cmdlet'e izin verilmiyor

    Enter-PSHostProcess Cmdlet 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-Type cmdlet'e izin verilmiyor

    Engelleme Add-Type , rastgele .NET kodunun yürütülmesini engeller.

  • Import-LocalizedData cmdlet kısıtlandı

    öğesinin SupportedCommand parametresinin Import-LocalizedData engellenmesi, rastgele kodun yürütülmesini engeller.

  • Invoke-Expression cmdlet kısıtlandı

    Cmdlet'e Invoke-Expression geçirilen tüm betik blokları, rastgele kod yürütülmesini önlemek için modda ConstrainedLanguage çalıştırılır.

  • New-Object cmdlet kısıtlandı

    New-Object Cmdlet, 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-Object cmdlet 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, ConstrainedLanguage modu, 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-ModuleMember cmdlet 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-ModuleMember cmdlet’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-Module cmdlet kısıtlaması

    New-Module öğesini güvenilen bir betikte çalıştırdığınızda, ScriptBlock parametresi tarafından sağlanan herhangi bir betik bloğu, rastgele kodun güvenilen bir yürütme bağlamına eklenmesini önlemek için ConstrainedLanguage modunda çalışacak şekilde işaretlenir.

  • Configuration anahtar sözcüğüne izin verilmiyor

    Kod ekleme saldırılarını önlemek için, Configuration modunda ConstrainedLanguage language anahtar sözcüğüne izin verilmez.

  • class anahtar sözcüğüne izin verilmiyor

    Rastgele kod eklenmesini önlemek için, class modunda ConstrainedLanguage dil 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

    ConstrainedLanguage modu, olası kod enjeksiyonu saldırılarını önlemek için PowerShell veri (Data) dosyalarının .psd1 bölümlerinde hashtable'dan nesneye dönüştürmeleri engeller.

  • Otomatik tür dönüştürme kısıtlandı

    ConstrainedLanguage modu, 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. ConstrainedLanguage modunda, 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. ConstrainedLanguage modu, 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 AllScope kısıtlaması

    ConstrainedLanguage modu, değişkenler üzerinde ayarlama AllScope ö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

    ConstrainedLanguage modu, 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

    ConstrainedLanguage modu, 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

    ConstrainedLanguage mod, 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

    ConstrainedLanguage modu 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.