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ırFullLanguage
.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 deConstrainedLanguage
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üklenirkenFullLanguage
çalıştırılır.Audit
: Dosya çalıştırılır veya hiçbir kısıtlama olmadan moddaFullLanguage
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 moddaConstrainedLanguage
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 moddaFullLanguage
ç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 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ürConnectionPort
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 verilmiyorEnter-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 verilmiyorEngelleme
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 moddaConstrainedLanguage
ç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üvenilmeyenConstrainedLanguage
.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 kodunScriptBlock
güvenilen yürütme bağlamı içine eklenmesini önlemek için moddaConstrainedLanguage
çalışacak şekilde işaretlenir.Configuration
anahtar sözcüğüne izin verilmiyorConfiguration
Kod ekleme saldırılarını önlemek için language anahtar sözcüğüne moddaConstrainedLanguage
izin verilmez.class
anahtar sözcüğüne izin verilmiyorclass
İ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
ayarlamaConstrainedLanguage
modu, 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
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.
PowerShell