2017 yılında WannaCry fidye yazılımı dünyayı kasıp kavururken, arkasındaki asıl silahın SMB protokolündeki EternalBlue açığı olduğunu öğrendik. O günden bu yana kaç sistem yöneticisinin “keşke daha önce haberdar olsaydım” dediğini tahmin edemezsiniz. Bu yazıda SMB güvenliğini baştan sona ele alacağız: EternalBlue açığını kapatmak, SMB sürümlerini kontrol altına almak ve gerçek dünya senaryolarında bu işleri nasıl yapacağınızı adım adım göreceğiz.
SMB Nedir ve Neden Bu Kadar Kritik?
SMB (Server Message Block), Windows ortamlarında dosya paylaşımı, yazıcı paylaşımı ve ağ iletişimi için kullanılan temel protokoldür. Neredeyse her Windows sunucusunda aktif olan bu protokol, aynı zamanda tarihsel olarak en çok saldırıya uğrayan servislerden biri olmuştur.
SMB’nin üç ana sürümü vardır:
- SMBv1: 1980’lerde IBM tarafından tasarlanan, güvensiz ve artık kullanılmaması gereken eski sürüm
- SMBv2: Windows Vista ile birlikte gelen, performans iyileştirmeleri içeren sürüm
- SMBv3: Windows 8/Server 2012 ile gelen, şifreleme desteği sunan modern sürüm
Asıl tehlike SMBv1’de yatıyor. MS17-010 olarak bilinen EternalBlue açığı, SMBv1 üzerinden uzaktan kod çalıştırılmasına imkan tanıyor. NSA tarafından geliştirilen bu exploit, Shadow Brokers grubu tarafından sızdırıldıktan sonra WannaCry ve NotPetya saldırılarında kullanıldı.
Ortamınızı Tanımak: SMB Durumunu Kontrol Etme
Herhangi bir değişiklik yapmadan önce mevcut durumu tespit etmeniz şart. Körü körüne bir şeyler kapatmak, özellikle üretim ortamlarında ciddi sorunlara yol açabilir.
Yerel Sunucuda SMB Durumu Kontrolü
# SMBv1 durumunu kontrol et
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
# Tüm SMB sürümlerinin durumunu görüntüle
Get-SmbServerConfiguration | Select EnableSMB1Protocol, EnableSMB2Protocol
# SMB oturumlarını listele (kim bağlı şu an?)
Get-SmbSession
# Açık SMB paylaşımlarını listele
Get-SmbShare
Bu komutları çalıştırdığınızda, EnableSMB1Protocol: True görüyorsanız acil durum moduna geçme zamanı gelmiş demektir.
Ağ Genelinde SMB Taraması
Tek bir sunucu değil, tüm ağınızı taramanız gerekiyor. Bunun için PowerShell ile basit bir tarama yapabilirsiniz:
# Belirli bir IP aralığındaki makinelerde SMBv1 kontrolü
$computers = 1..254 | ForEach-Object { "192.168.1.$_" }
foreach ($computer in $computers) {
if (Test-Connection -ComputerName $computer -Count 1 -Quiet -ErrorAction SilentlyContinue) {
try {
$smb = Invoke-Command -ComputerName $computer -ScriptBlock {
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
} -ErrorAction Stop
[PSCustomObject]@{
Computer = $computer
SMBv1 = $smb.EnableSMB1Protocol
SMBv2 = $smb.EnableSMB2Protocol
}
}
catch {
Write-Warning "$computer - Erisilemedi: $($_.Exception.Message)"
}
}
}
Bu scripti çalıştırmak için domain admin yetkilerine ihtiyacınız var. Büyük ortamlarda Invoke-Command’ın WinRM üzerinden çalıştığını, dolayısıyla hedef makinelerde WinRM’in aktif olması gerektiğini unutmayın.
EternalBlue Yaması: MS17-010
EternalBlue’ya karşı Microsoft, Mart 2017’de MS17-010 yamasını yayınladı. WannaCry saldırısı Mayıs 2017’de gerçekleşti; yani arada iki ay vardı ama pek çok kurum bu yamayı uygulamamıştı.
Yama Durumunu Kontrol Etme
# MS17-010 yamasının yüklü olup olmadığını kontrol et
$patches = @('KB4012212', 'KB4012213', 'KB4012214', 'KB4012215',
'KB4012216', 'KB4012217', 'KB4012218', 'KB4012220',
'KB4012606', 'KB4013198', 'KB4013429')
$installedPatches = Get-HotFix | Select-Object -ExpandProperty HotFixID
foreach ($patch in $patches) {
if ($installedPatches -contains $patch) {
Write-Host "$patch - YUKLU" -ForegroundColor Green
}
}
# Daha kapsamlı kontrol - son 90 günde yüklenen yamalar
Get-HotFix | Where-Object { $_.InstalledOn -gt (Get-Date).AddDays(-90) } |
Sort-Object InstalledOn -Descending |
Select-Object HotFixID, Description, InstalledOn
Önemli not: Windows 10 ve Server 2016+ için kümülatif güncellemeler farklı KB numaraları taşır. systeminfo | findstr KB komutuyla yüklü tüm yamaları görebilirsiniz.
Otomatik Windows Update Durumunu Kontrol Etme
# Windows Update servis durumu
Get-Service -Name wuauserv | Select-Object Name, Status, StartType
# Windows Update ayarlarını kontrol et (registry üzerinden)
$wuPath = "HKLM:SOFTWAREPoliciesMicrosoftWindowsWindowsUpdateAU"
if (Test-Path $wuPath) {
Get-ItemProperty -Path $wuPath
} else {
Write-Host "Group Policy ile yapılandırılmamış, varsayılan ayarlar geçerli"
}
SMBv1’i Kapatma
Artık en kritik adıma geldik. SMBv1’i kapatmadan önce şunu kendinize sorun: “Bu ağda SMBv1’e ihtiyaç duyan eski bir cihaz var mı?” Eski yazıcılar, NAS cihazları veya Windows XP makineler hala SMBv1 kullanıyor olabilir. Bu cihazları tespit etmeden SMBv1’i kapattığınızda iş yerinde fırtına kopabilir.
SMBv1 Kullanan Cihazları Tespit Etme
# SMBv1 bağlantı loglarını etkinleştir (önce bunu yap)
Set-SmbServerConfiguration -AuditSmb1Access $true -Force
# Bir süre bekledikten sonra logları kontrol et
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Audit |
Where-Object { $_.Id -eq 3000 } |
Select-Object TimeCreated, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 50
Bu logu birkaç gün aktif tutun. Hangi IP adreslerinin SMBv1 kullandığını göreceksiniz. O cihazları güncelleyin veya izole edin, sonra kapatma işlemine geçin.
SMBv1’i Devre Dışı Bırakma
# PowerShell ile SMBv1'i kapat (Server 2012 R2 ve üzeri)
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
# Değişikliği doğrula
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol
# İstemci tarafında da SMBv1'i kapat
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanWorkstationParameters" `
-Name "SMB1" -Value 0 -Type DWORD
# Windows özelliği olarak SMBv1'i tamamen kaldır (Server 2016+)
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
# Değişiklikler için yeniden başlatma gerekebilir
# Restart-Computer -Force # Production'da dikkatli kullanın!
Gerçek dünya notu: Bir keresinde büyük bir hastane ağında SMBv1 kapatma işlemi yapıyordum. Eski tıbbi görüntüleme sistemleri SMBv1 kullanıyordu ve bunu önceden tespit edememiştik. Sistemler kapandıktan sonra radyoloji departmanı felç oldu. O günden beri “önce audit, sonra kapat” kuralını asla çiğnemiyorum.
Group Policy ile Merkezi Yönetim
Tek tek sunucularla uğraşmak yerine Group Policy kullanarak tüm domain’i merkezi olarak yönetmek çok daha verimlidir.
GPO ile SMBv1’i Kapatma
Group Policy Management Console’dan yeni bir GPO oluşturun ve aşağıdaki registry ayarlarını yapılandırın:
GPO Yolu: Computer Configuration > Preferences > Windows Settings > Registry
Anahtar 1 (SMBv1 Server):
Hive: HKEY_LOCAL_MACHINE
Path: SYSTEMCurrentControlSetServicesLanmanServerParameters
Value name: SMB1
Value type: REG_DWORD
Value data: 0
Anahtar 2 (SMBv1 Client):
Hive: HKEY_LOCAL_MACHINE
Path: SYSTEMCurrentControlSetServicesLanmanWorkstationParameters
Value name: SMB1
Value type: REG_DWORD
Value data: 0
GPO’yu uyguladıktan sonra test etmek için:
# GPO'nun uygulandığını doğrula
gpresult /r /scope computer
# Uzak makinede GPO'yu zorla uygula ve SMB durumunu kontrol et
Invoke-Command -ComputerName SUNUCU01 -ScriptBlock {
gpupdate /force
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol
}
SMBv3 Şifrelemesini Aktifleştirme
SMBv1’i kapatmak yeterli değil. Güvenliği bir adım daha ileri taşımak için SMBv3 şifrelemesini de etkinleştirmelisiniz. Bu özellik, aktarılan verilerin dinlenmesini (man-in-the-middle saldırıları) önler.
# Sunucu genelinde SMB şifrelemesini etkinleştir
Set-SmbServerConfiguration -EncryptData $true -Force
# Belirli bir paylaşım için şifreleme zorunluluğu
Set-SmbShare -Name "Hassas-Veri" -EncryptData $true
# Yeni bir şifreli paylaşım oluştur
New-SmbShare -Name "GizliDosyalar" -Path "D:GizliDosyalar" `
-EncryptData $true -FullAccess "DOMAINAdminGrubu"
# SMB şifreleme durumunu kontrol et
Get-SmbServerConfiguration | Select-Object EncryptData, RejectUnencryptedAccess
# Aktif oturumların şifreleme durumunu görüntüle
Get-SmbSession | Select-Object ClientComputerName, Dialect, Encrypted
Dikkat edilmesi gereken nokta: RejectUnencryptedAccess parametresini $true yaparsanız, şifrelemeyi desteklemeyen eski istemciler (Windows 7, Server 2008 R2) bağlanamaz hale gelir. Ortamınızda bu tür istemciler varsa dikkatli olun.
Güvenlik Duvarı Kuralları ile SMB’yi Sınırlandırma
SMB’yi tüm kapatıp açma işlemlerinin yanında, güvenlik duvarı seviyesinde de kontrol altına almak kritik önem taşır. SMB portu olan 445’in internete açık olmaması kesinlikle şart.
# Windows Firewall ile SMB'yi sadece belirli ağlardan kabul et
New-NetFirewallRule -DisplayName "SMB - Sadece Internal" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-RemoteAddress "192.168.0.0/16","10.0.0.0/8" `
-Action Allow `
-Profile Domain,Private
# Dışarıdan gelen tüm SMB trafiğini engelle
New-NetFirewallRule -DisplayName "SMB - Dis Engelle" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-RemoteAddress Internet `
-Action Block
# Mevcut SMB kurallarını listele
Get-NetFirewallRule | Where-Object { $_.DisplayName -like "*SMB*" -or $_.DisplayName -like "*445*" } |
Select-Object DisplayName, Direction, Action, Enabled
Güvenlik duvarı kurallarını uyguladıktan sonra dışarıdan erişilebilirliği test edin:
# Linux/Mac'ten test (nmap gerekli)
nmap -p 445 --script smb-security-mode SUNUCU_IP
# Windows'tan test
Test-NetConnection -ComputerName SUNUCU_IP -Port 445
SMB İmzalama (Signing) Zorunluluğu
SMB imzalama, relay saldırılarına karşı kritik bir koruma katmanıdır. Özellikle NTLM relay saldırıları, SMB imzalamanın olmadığı ortamlarda son derece etkilidir.
# SMB imzalamayı zorunlu kıl
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
Set-SmbServerConfiguration -EnableSecuritySignature $true -Force
# İstemci tarafında da imzalamayı etkinleştir
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanWorkstationParameters" `
-Name "RequireSecuritySignature" -Value 1 -Type DWORD
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanWorkstationParameters" `
-Name "EnableSecuritySignature" -Value 1 -Type DWORD
# Mevcut durumu kontrol et
Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EnableSecuritySignature
Domain Controller’larda SMB imzalama varsayılan olarak zorunludur, ancak member server’larda bu durum farklı olabilir. Özellikle büyük dosya aktarımı yapan ortamlarda imzalama performansı biraz düşürebilir, ama güvenlik her zaman önce gelir.
Sürekli İzleme ve Alarm Sistemi
Kurulum ve yapılandırmanın ardından en önemli kısım izleme ve alarm mekanizmalarını kurmaktır. Bir güvenlik açığını kapattıktan sonra “tamam artık güvendeyiz” moduna geçmek tehlikeli bir yanılsamadır.
# SMB olaylarını izlemek için Event Log yapılandırması
# Önce SMB audit loglarını etkinleştir
Set-SmbServerConfiguration -AuditSmb1Access $true -Force
# SMB bağlantı başarısızlıklarını izle
$query = @"
<QueryList>
<Query Id="0" Path="Microsoft-Windows-SMBServer/Security">
<Select Path="Microsoft-Windows-SMBServer/Security">
*[System[(EventID=551 or EventID=552 or EventID=553)]]
</Select>
</Query>
</QueryList>
"@
# Son 24 saatteki SMB güvenlik olayları
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-SMBServer/Security'
StartTime = (Get-Date).AddHours(-24)
} -ErrorAction SilentlyContinue |
Select-Object TimeCreated, Id, Message |
Sort-Object TimeCreated -Descending
Gerçek bir üretim ortamında bu izleme scriptini Task Scheduler ile düzenli aralıklarla çalıştırıp sonuçları bir log dosyasına veya SIEM sistemine gönderebilirsiniz.
Gerçek Dünya Senaryosu: 200 Sunuculu Bir Ortamda EternalBlue Saldırısı Sonrası Müdahale
2019 yılında bir müşterimin ağında ciddi bir olay yaşandı. Güvenlik ekibi, ağ içindeki anormal SMB trafiğini fark etti. Birkaç sunucu arasında garip port 445 trafiği vardı. Olay müdahale sürecinde şu adımları izledik:
İlk önce etkilenen sistemleri tespit ettik:
# Şüpheli SMB aktivitesini tespit et
$logName = "Microsoft-Windows-SMBServer/Audit"
$events = Get-WinEvent -LogName $logName -MaxEvents 1000 -ErrorAction SilentlyContinue
$events | Where-Object { $_.Id -eq 3000 } |
ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Zaman = $_.TimeCreated
KaynakIP = $xml.Event.EventData.Data |
Where-Object { $_.Name -eq 'ClientName' } |
Select-Object -ExpandProperty '#text'
Kullanici = $xml.Event.EventData.Data |
Where-Object { $_.Name -eq 'UserName' } |
Select-Object -ExpandProperty '#text'
}
} | Sort-Object Zaman -Descending
Sonra acil önlem olarak tüm sunucularda SMBv1’i kapattık ve yamalarını kontrol ettik. 200 sunucunun yaklaşık 30’unda MS17-010 yamasının olmadığını gördük. Bu 30 sunucu, şirkete ait eski bir departmandan devralınmıştı ve güncelleme politikalarının dışında kalmıştı.
Ders: Merge ve acquisition süreçlerinde devralınan sistemlerin güvenlik durum kontrolü hayati önem taşır.
Düzenli Güvenlik Denetimi Script’i
Tüm bu kontrolleri bir araya getiren ve düzenli çalıştırabileceğiniz kapsamlı bir denetim scripti:
# SMB-SecurityAudit.ps1
# Sunucu listesini dışarıdan al veya burada tanımla
$servers = Get-ADComputer -Filter { OperatingSystem -like "*Windows Server*" } |
Select-Object -ExpandProperty Name
$results = @()
foreach ($server in $servers) {
Write-Host "Kontrol ediliyor: $server" -ForegroundColor Cyan
try {
$result = Invoke-Command -ComputerName $server -ScriptBlock {
$smb = Get-SmbServerConfiguration
$patches = Get-HotFix | Select-Object -ExpandProperty HotFixID
$eternalBlue = @('KB4012212','KB4012213','KB4012214','KB4012215',
'KB4012216','KB4012217','KB4012606','KB4013429')
$patchStatus = ($eternalBlue | Where-Object { $patches -contains $_ }).Count -gt 0
[PSCustomObject]@{
Sunucu = $env:COMPUTERNAME
SMBv1Aktif = $smb.EnableSMB1Protocol
SMBv2Aktif = $smb.EnableSMB2Protocol
Sifreleme = $smb.EncryptData
Imzalama = $smb.RequireSecuritySignature
EternalBluePatch = $patchStatus
RiskSeviyesi = if ($smb.EnableSMB1Protocol) { "KRITIK" } elseif (-not $patchStatus) { "YUKSEK" } else { "NORMAL" }
}
} -ErrorAction Stop
$results += $result
}
catch {
$results += [PSCustomObject]@{
Sunucu = $server
SMBv1Aktif = "BILINMIYOR"
RiskSeviyesi = "ERISIM-HATASI"
}
}
}
# Sonuçları görüntüle
$results | Sort-Object RiskSeviyesi | Format-Table -AutoSize
# CSV'ye kaydet
$results | Export-Csv -Path "C:RaporlarSMB-Audit-$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8
Write-Host "`nKritik Sunucular:" -ForegroundColor Red
$results | Where-Object { $_.RiskSeviyesi -eq "KRITIK" } | Select-Object Sunucu, SMBv1Aktif
Sonuç
EternalBlue ve SMB güvenliği konusu, “bir kere yapılır biter” kategorisinde değil. Sürekli dikkat ve düzenli denetim gerektiren bir alan. Özetlemek gerekirse:
- SMBv1’i mutlaka kapatın. Bunu ertelemek için hiçbir geçerli sebep yok. Eski cihazlarınız varsa onları güncelleyin ya da izole edin.
- MS17-010 yamasının tüm sistemlerde olduğundan emin olun. Otomatik güncellemeleri açın ve düzenli olarak kontrol edin.
- SMBv3 şifrelemesini etkinleştirin. Özellikle hassas veri içeren paylaşımlar için bu adım atlanamazı.
- SMB imzalamayı zorunlu kılın. Relay saldırılarına karşı kritik bir koruma.
- Güvenlik duvarında 445 portunu sınırlandırın. İnternete hiçbir zaman açık olmamalı.
- Düzenli audit yapın. Devralınan sistemler, yeni kurulan makineler veya güncellenmeyen sunucular her zaman sürpriz yapabilir.
WannaCry saldırısından sonra geçen yıllara rağmen hala internette SMBv1 açık binlerce sistem var. Siz bu yazıyı okuyorsanız, o istatistiğin bir parçası olmayın. Şimdi PowerShell’i açın ve ilk kontrol komutunu çalıştırın.