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, hem AppLocker hem de İş için Uygulama Denetimi sistem genelinde ilkeleri algılar. AppLocker kullanım dışı bırakıldı. Uygulama Denetimi, Windows için tercih edilen uygulama denetim sistemidir.

Eski Uygulama Denetimi ilkesi zorlama algılama

PowerShell, iki şeyi keşfetmek için eski Uygulama Denetimi WldpGetLockdownPolicy API'sini kullanır:

  • Sistem genelinde ilke zorlama: 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 zorlama algılama

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ı girişini komut veya betik olarak çalıştıracak şekilde 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ı yoksayılır veya bir dosyaya yönlendirilir.

İlke zorlaması altında çalışan etkileşimli mod

PowerShell komutları modda ConstrainedLanguage ç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 zorlaması altında çalıştırılan etkileşimsiz mod

PowerShell bir betik çalıştırdığında veya bir modül yüklediğinde, dosyanın ilke zorlamasını almak için Uygulama Denetimi API'sini kullanır.

PowerShell sürüm 7.3 veya üzeri varsa API'yi WldpCanExecuteFile kullanır. Bu API aşağıdaki sonuçlardan birini döndürür:

  • WLDP_CAN_EXECUTE_ALLOWED: Dosya ilke tarafından onaylanır ve birkaç kısıtlamayla modda kullanılır FullLanguage .
  • WLDP_CAN_EXECUTE_BLOCKED: Dosya ilke tarafından onaylanmamıştır. PowerShell, dosya çalıştırıldığında veya yüklendiğinde bir hata oluşturur.
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: Dosya ilke tarafından onaylanmamıştır, ancak yine de ConstrainedLanguage modda ç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 modda yüklenirken FullLanguage çalıştırılır.
  • Audit: Dosya çalıştırılır veya hiçbir kısıtlama olmadan modda FullLanguage yüklenir. PowerShell 7.4 veya sonraki sürümlerde ilke, kısıtlama bilgilerini Windows olay günlüklerine kaydeder.
  • Enforce: Dosya çalıştırılır veya modda ConstrainedLanguage yüklenir.

Kilitleme ilkesi kapsamındaki PowerShell kısıtlamaları

PowerShell sistemin Bir Uygulama Denetimi kilitleme ilkesi altında olduğunu algıladığında, betik güvenilir ve modda FullLanguage çalışıyor olsa bile 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ü

    Betik nokta kaynağını kullanan ve joker karakter adlarını kullanarak işlevleri dışarı aktaran tüm modüller hatayla sonuçlanır. Joker karakter dışarı aktarmalarının engellenmesi, güvenilir bir modüle nokta kaynaklı olan güvenilmeyen bir betik yerleştirebilen kötü amaçlı bir kullanıcıdan betik eklenmesini ö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 hiçbir zaman betik nokta kaynağını kullanmayın ve modül işlevlerini her zaman açık adlarla (joker karakter olmadan) dışarı aktarın.

  • Joker karakter işlev dışarı aktarma kısıtlaması ile 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 modda FullLanguage çalışır. Güvenilen modül cmdlet'i parametreleri için karmaşık türler kullanıyorsa, güven sınırları boyunca 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 betik veya işlev 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ı

    öğesine geçirilen değişkenler için tür yöntemi çağırmasına ForeEach-Object , onaylanan listede olmayan herhangi bir .NET türü için izin verilmez. Genel olarak, mod güvenilmeyen ConstrainedLanguage .NET türlerine erişimi önlemek için onaylı .NET türleri dışında herhangi bir nesne yöntemi çağırmasına izin vermiyor.

  • Export-ModuleMember cmdlet kısıtlaması

    Alt modüle güvenilmeyen ve üst modülün güvenilir olduğu iç içe modül betik dosyasındaki işlevleri dışarı aktarmak için cmdlet'in kullanılması Export-ModuleMember 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ı

    Güvenilen bir betikte çalıştırdığınızda New-Module , parametre tarafından sağlanan tüm betik blokları, rastgele kodun ScriptBlock güvenilen yürütme bağlamı içine eklenmesini önlemek için modda ConstrainedLanguage çalışacak şekilde işaretlenir.

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

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

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

    class İsteğe bağlı kod eklenmesini önlemek için language anahtar sözcüğüne modda izin verilmezConstrainedLanguage.

  • Betik 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 betiği diğerine noktalı kaynak olarak eklediğinizde bir alt ilişki oluşturursunuz. Bu senaryonun engellenmesi, güvenilmeyen bir betiğin güvenilen betik kapsamındaki tehlikeli işlevlere erişmesini engeller.

  • Güvenilmeyen betik işlevlerinin komut bulmayı engelleme

    PowerShell komut bulma, güvenilmeyen betik veya modül gibi güvenilmeyen bir kaynaktan güvenilen bir işleve işlev döndürmez. Güvenilmeyen komutların bulunmasını engellemek, komut ekleme yoluyla kod eklenmesini önler.

  • Hashtable'da nesne dönüştürmeye izin verilmiyor

    ConstrainedLanguage modu, olası kod ekleme saldırılarını Data önlemek için PowerShell veri (.psd1) dosyalarının bölümlerinde hashtable'ı nesne dönüştürmelerine 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 işlevi dışarı 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. Modunda ConstrainedLanguage , bir modül güven sınırları boyunca yüklendiğinde örtük dışarı 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 kısıtlaması AllScope ayarlama

    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.