SMB Güvenliği: EternalBlue Açığını Kapatma ve Sürüm Kontrolü

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.

Yorum yapın