Windows Firewall, Windows Advanced Firewall veya Windows Defender Firewall. Microsoft'un ürünlerine verdiği isimler bana hep garip gelmiştir. Bir müzik ve video oynatıcısı yapıp adına media player demek, mesajlaşma uygulamasına messanger, interent tarayıcılarına Internet Explorer demek... İşletim sisteminin adı zaten Windows.
Konuyu dağıtmayalım. Bugün baktığımda kullandığım bilgisayarın güvenlik duvarımda 700'den fazla kural var. En fazla 2 tanesini ben oluşturmuşumdur -belki. Üstüne ek yazılımlar kurduğumuzda daha da fazlası geliyor. Bunlar ile uğraşmak hiç kolay değil. Evet, belli kolaylıklar sağlanmış, gruplanmış. Ağlara göre sınıflandırılmış (etki alanı, özel ağ, genel ağ falan) ama yine de belli bir portu açmak için yeni bir kural mı oluştursam, yoksa var olan kurallardan biri işimi görür mü diye düşündüğüm durumlar hiç az değil. Üstüne üstlük "Gelişmiş Güvenlik Özellikli Windows Defender Güvenlik Duvarı" uygulaması da pek kullanışlı değil. İsme, adrese veya porta göre arama, sıralama, süzme yok. Ama iyi ki Powershell var!
Yeni bir bilgisayara oturduk. Tüm önyargılara rağmen ilk yapılacak iş güvenlik duvarını devreye almak. Güvenlik duvarı, bağlı olunan ağ profiline göre kuralları etkinleştiriyor. Mevcut ağ profilimize bakalım:
Get-NetConnectionProfile
Bakılacak alan NetworkCategory. Private / Public arasında geçiş yapmak için
Set-NetConnectionProfile -NetworkCategory Private
kullanabiliriz. Bu profile uyan güvenlik duvarı profilimizi görmek için
Get-NetFirewallProfile -Name Private | Select-Object Name, Enabled, DefaultInboundAction
kullanabilir, Enabled alanından etkin mi değil mi görebilir, DefaultInboundAction'dan kurala uymayan gelen trafiğe karşı varsayılan eylemini (Block olmalı) tespit edebiliriz. Genel eğilim, güvenlik duvarını etkinleştirirken bütün profilleri etkinleştirmek. Eğer yapmak istediğimiz buysa
Set-NetFirewallProfile -All -Enabled True
Burada garip olan, True değerinin bir boolean değer değil de GpoBoolean olması. Şu sayfa da dahil her yerde $True yerine True yazılmış. Tam olarak aynı şey mi, emin değilim ama şöyle birşey buldum:
$a = [Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetSecurity.GpoBoolean]::True
$a -eq $True
True
yani sanki aynı şey. Bu adımlardan sonra ikinci yaptığım şey genelde bazı temel kuralları etkinleştirmek veya kontrol etmek. Örneğin söz konusu bilgisayara uzak masaüstü yapılmasını istiyorsam ilgili kuralın devrede olup olmadığını kontrol ederim. Bunun için içinde "Uzak Masaüstü*" (İngilizce bilgisayarlarda "Remote Desktop*") geçen kuralları geçenleri ararım:
Get-NetFirewallRule -DisplayName "Uzak Masaüstü*" | ft Name, DisplayName, Enabled
Bunu dahil oldukları gruba göre arayarak da yapabilirim:
Get-NetFirewallRule -DisplayGroup "Uzak Masaüstü" | ft Name, DisplayName, Enabled
Bu kuralların hangi uygulamaya, hangi porta ve hangi uzak IP grubuna izin/engelleme verdiğini görmek için ise şu sorgu mükemmel:
Get-NetFirewallRule -DisplayGroup "Uzak Masaüstü" |
Format-Table DisplayName,
@{N="Port";E={($_|Get-NetFirewallPortFilter).LocalPort}},
@{N="Application";E={($_|Get-NetFirewallApplicationFilter).Program}},
@{N="Address";E={($_|Get-NetFirewallAddressFilter).RemoteAddress}} -AutoSize
Benzer şekilde IIS yüklü bir bilgisayarda 80 numaralı port üzerinden HTTP hizmeti vermek için güvenlik duvarındaki kuralları kontrol etmek istersem
Get-NetFirewallRule -DisplayGroup "*World Wide Web Services*" | Ft DisplayGroup, DisplayName, Enabled
Bilgisayarımız ping'lere cevap veriyor mu diye bakmak için (İngilizce bilgisayarlarda):
Get-NetFirewallRule -DisplayName "Core Networking Diagnostics - ICMP Echo Request (ICMPv4-In)" |
Format-Table DisplayGroup, Displayname, Profile, Enabled
ya da grup bazlı
Get-NetFirewallRule -DisplayGroup "Core Networking Diagnostics" |
Format-Table DisplayGroup, Displayname,
Profile, Enabled
Türkçe bilgisayarlarda aynısını yapmak için ise
Get-NetFirewallRule -DisplayName "Çekirdek Ağ Tanılama - ICMP Yankı İsteği (ICMPv4-Gelen)" |
Format-Table DisplayGroup, Displayname,
Profile, Enabled
grup bazlı olarak da
Get-NetFirewallRule -DisplayGroup "Çekirdek Ağ Tanılama" |
ft DisplayGroup, DisplayName, Profile, Enabled -AutoSize
gibi birşey olabilir. Bunlardan etkinleştirmek istediklerimizi pipe ile
Get-NetFirewallRule -DisplayName "Çekirdek Ağ Tanılama - ICMP Yankı İsteği (ICMPv4-Gelen)" |
Enable-NetFirewallRule
ya da devre dışı bırakmak için Disable-NetFirewallRule yapabiliriz. Dosya ve yazıcı paylaşımı kural grubu için sırasıyla Türkçe ve İngilizce bilgisayarlarda komudumuz şöyle olabilir:
Get-NetFirewallRule -DisplayGroup "Dosya ve Yazıcı Paylaşımı" |
ft Displayname, DisplayGroup, Enabled, Profile -AutoSize
Get-NetFirewallRule -DisplayGroup "File and Printer Sharing" |
ft Displayname, DisplayGroup, Enabled, Profile -AutoSize
Bütün dosya paylaşımlarını devre dışı bırakmak için
Get-NetFirewallRule -DisplayGroup "Dosya ve Yazıcı Paylaşımı" | Disable-NetFirewallRule
kullanılabilir.
Asıl kilit nokta, herhangi bir porta komuta eden bir kural var mı yok mu aramak istersek
Get-NetFirewallRule | where {($_ | Get-NetFirewallPortFilter).LocalPort -eq 9401} | select DisplayName
Kurallar etki alanı (domain), özel ağlar (private) ve genel ağlar (public) olarak kategorize edildiği için bu profile bilgisine dikkat etmek çok önemli. Özel bir ağda çalışırken genel ağ kuralı üzerinde işlem yaparsak etkili olmayacaktır.
Bunları Get-* komutları ile mevcut durumu görmek üzerine komutlardı. Bir de kurallarda toplu değişiklik yapalım. Örneğin DisplayGroup özelliği "Dosya ve Yazıcı Paylaşımı" olan kural gruplarını sadece belli IP'lerden erişilebilecek şekilde ayarlayalım. Önce "Dosya ve Yazıcı Paylaşımı" DisplayGroup'una dahil kuralların IP adresi kısıtlaması var mı, bakalım:
Get-NetFirewallRule -DisplayGroup "Dosya ve Yazıcı Paylaşımı" |
Format-Table Enabled, DisplayName, Profile,
@{N="Scope";E={($_|Get-NetFirewallAddressFilter).RemoteAddress}} -Autosize
Bu şekilde hedef kural grubumun tam olarka istediğim kurallar olduğundan emin olabilirim. Hedef kural grubum basit bir şekilde DisplayName veya DisplayGroup ile ifade edilebilecek grup ise basitçe
Set-NetFirewallRule -DisplayGruop "Dosya ve Yazıcı Paylaşımı" -RemoteAddress 192.168.1.28
gibi bir komutla bu kurala uzaktan erişebilecek bilgisayarların IP adreslerini seçebilirim.
Bu arada LocalSubnet bilgisayarın yerel ağındaki IPv4 ve IPv6 altağını kapsar. Sadece IPv4 için LocalSubnet4, veya sadece IPv6 için LocalSubnet6 kullanılabilir:
Set-NetFirewallRule -DisplayGruop "Dosya ve Yazıcı Paylaşımı" -RemoteAddress LocalSubnet4
Daha karmaşık bir senaryomuz varsa, örneğin domain profilinde ve sadece etkinleştirilmiş kural alt grubununa uzaktan erişebilecek bilgisayarın IP adresini kısıtlamak için
Get-NetFirewallRule -DisplayGroup "Dosya ve Yazıcı Paylaşımı" |
where {$_.Enabled -eq $true -and $_.Profile -eq "Domain"} |
Set-NetFirewallRule -RemoteAddress 192.168.1.28