SMB Protokolü Yapılandırması ve Güvenli Paylaşım Yönetimi
Üretim ortamında SMB’yi yapılandırmak, teoride basit görünüyor ama sahada her şeyin yanlış gidebileceğini kaçınılmaz şekilde öğreniyorsunuz. Yıllar içinde karşılaştığım en sık sorunların büyük çoğunluğu ya yanlış yapılandırılmış paylaşım izinlerinden ya da SMB sürüm uyumsuzluklarından kaynaklanıyordu. Bu yazıda, Windows Server ortamında SMB protokolünü sıfırdan güvenli bir şekilde yapılandırmayı ve üretim ortamına hazır paylaşım yönetimini ele alacağım.
SMB Protokolü ve Sürüm Farkları
SMB (Server Message Block), Windows ağlarının omurgasını oluşturan dosya paylaşım protokolüdür. Ama “SMB kuralım, çalışır” demek artık yeterli değil. Hangi sürümü kullandığınız, hem güvenlik hem de performans açısından kritik öneme sahip.
SMBv1 artık tarihe karışmalı. WannaCry saldırısının yarattığı hasar hâlâ akıllardayken bile bazı ortamlarda SMBv1’in aktif olduğunu görüyorum. Eski yazıcı sürücüleri veya legacy uygulamalar bahanesiyle canlı tutulmaya devam ediyor. Bu bir güvenlik felaketi reçetesidir.
SMBv2, Windows Vista/Server 2008 ile geldi. Birden fazla isteği tek pakette birleştirme (request compounding), daha az genel gider, büyük dosyalar için daha iyi performans sağladı.
SMBv3, Windows 8/Server 2012 ile hayatımıza girdi. Uçtan uca şifreleme, SMB Direct (RDMA desteği), SMB Multichannel gibi özelliklerle gerçek anlamda kurumsal seviyeye taşındı.
Ortamınızdaki mevcut durumu görmek için:
# Mevcut SMB sunucu yapılandırmasını görüntüle
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol, EncryptData, RequireSecuritySignature
# İstemci tarafını da kontrol et
Get-SmbClientConfiguration | Select-Object EnableBandwidthThrottling, EnableMultiChannel, EncryptionCiphers
Bu çıktıya bakıp EnableSMB1Protocol : True görüyorsanız, önce bunu kapatın. Gerisi ikinci planda kalabilir.
SMBv1’i Devre Dışı Bırakma
SMBv1’i kapatmak için birkaç yol var. PowerShell en temizi:
# SMBv1'i sunucu tarafında devre dışı bırak
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
# Özelliği tamamen kaldır (Server 2012 R2 ve üzeri)
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
# Servis olarak da çalışıyor olabilir, onu da kapat
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" `
-Name SMB1 -Type DWORD -Value 0 -Force
Registry üzerinden de yapılabilir ama PowerShell cmdlet’leri daha tutarlı sonuç veriyor. Özellikle Disable-WindowsOptionalFeature yaklaşımı, özelliği tamamen kaldırdığı için en güvenli seçenek.
Bunu domain genelinde uygulamak istiyorsanız GPO tercih edilir. Computer Configuration > Administrative Templates > Network > Lanman Workstation altında ilgili politikalar bulunuyor. Ama GPO yolu ayrı bir yazı konusu, burada PowerShell üzerinden ilerliyoruz.
Yeni Paylaşım Oluşturma ve Temel Yapılandırma
Pratik bir senaryo üzerinden gidelim: Muhasebe departmanı için sadece yetkili kullanıcıların erişebildiği, geri kalanların göremediği bir paylaşım oluşturacağız.
# Paylaşım dizinini oluştur
New-Item -ItemType Directory -Path "D:SharesMuhasebe" -Force
# Yeni SMB paylaşımı oluştur
New-SmbShare -Name "Muhasebe" `
-Path "D:SharesMuhasebe" `
-Description "Muhasebe Departmani Dosya Paylaşımı" `
-FullAccess "DOMAINMuhasebeYoneticileri" `
-ChangeAccess "DOMAINMuhasebeCalisanlari" `
-ReadAccess "DOMAINMuhasebeReadOnly" `
-FolderEnumerationMode AccessBased `
-EncryptData $true
Burada dikkat çekmek istediğim iki parametre var:
-FolderEnumerationMode AccessBased: Bu, kullanıcıların sadece erişim haklarının olduğu klasörleri görmesini sağlar. Yani Ahmet, erişimi olmayan alt klasörleri göremez bile. ABE (Access-Based Enumeration) olarak da bilinen bu özellik, küçük ama kritik bir güvenlik katmanı ekliyor.
-EncryptData: SMBv3 ile gelen şifreleme özelliği. Aktarım sırasında veri şifrelenir. Performans maliyeti var ama hassas veriler için zorunlu.
SMB Şifreleme ve İmzalama Yapılandırması
Şifreleme ve imzalama, çoğu ortamda ihmal edilen iki güvenlik katmanı. İmzalama, MITM saldırılarına karşı koruma sağlarken şifreleme dinleme (eavesdropping) saldırılarını engeller.
# Sunucu genelinde şifrelemeyi zorunlu kıl
Set-SmbServerConfiguration -EncryptData $true -Force
# Güvenlik imzalamayı zorunlu kıl
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
# İstemci imzalamayı da aktifleştir
Set-SmbClientConfiguration -RequireSecuritySignature $true -Force
# Mevcut oturumları kontrol et
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, Dialect, Signing, Encryption
Get-SmbSession çıktısında Signing : True ve Encryption : True görmeyi hedefliyorsunuz. Eğer bazı istemciler False gösteriyorsa, o istemcilerin desteklemeyen eski bir SMB sürümü kullandığı anlamına gelir.
Dikkat edilmesi gereken bir nokta: RequireSecuritySignature ve EncryptData‘yı aynı anda $true yaparsanız, eski Windows 7 / Server 2008 R2 istemcileri bağlanamaz hale gelebilir. Geçiş sürecini yönetmek için önce EnableSecuritySignature (zorunlu değil, destekleniyor) olarak ayarlayıp gözlem yapın.
NTFS İzinleri ile SMB İzinlerinin Koordinasyonu
Bu konuda yıllar içinde pek çok kişinin kafasının karıştığını gördüm. SMB paylaşım izinleri ile NTFS dosya sistemi izinleri farklı katmanlarda çalışır ve her ikisi de uygulanır. Kullanıcı, ağdan bağlandığında her iki izin de kontrol edilir ve daha kısıtlayıcı olan geçerli olur.
En yaygın pratik yaklaşım: SMB düzeyinde Everyone - Full Control veya Authenticated Users - Full Control ver, NTFS düzeyinde granüler izinleri uygula. Bu sayede yönetim tek noktadan yapılır.
# SMB iznini geniş tut
Grant-SmbShareAccess -Name "Muhasebe" -AccountName "Everyone" -AccessRight Full -Force
# NTFS izinlerini PowerShell ile ayarla
$acl = Get-Acl -Path "D:SharesMuhasebe"
# Mevcut kalıtım kurallarını kaldır ve temiz başla
$acl.SetAccessRuleProtection($true, $false)
# MuhasebeYoneticileri için tam kontrol
$rule1 = New-Object System.Security.AccessControl.FileSystemAccessRule(
"DOMAINMuhasebeYoneticileri",
"FullControl",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
# MuhasebeCalisanlari için okuma ve yazma
$rule2 = New-Object System.Security.AccessControl.FileSystemAccessRule(
"DOMAINMuhasebeCalisanlari",
"ReadAndExecute,Write,Modify",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
# SYSTEM ve Administrators her zaman tam kontrol
$rule3 = New-Object System.Security.AccessControl.FileSystemAccessRule(
"BUILTINAdministrators",
"FullControl",
"ContainerInherit,ObjectInherit",
"None",
"Allow"
)
$acl.AddAccessRule($rule1)
$acl.AddAccessRule($rule2)
$acl.AddAccessRule($rule3)
Set-Acl -Path "D:SharesMuhasebe" -AclObject $acl
Bu yapıda SYSTEM ve Administrators her zaman tam yetkiyle tutulur. Bunları kaldırsanız bazı servislerin dosyalara erişemediğini sonradan keşfedebilirsiniz, bu da oldukça sinir bozucu bir durum.
Mevcut Paylaşımları Denetleme ve Temizlik
Zamanla ortamlarda kimsenin bilmediği, kimin kurduğu belirsiz paylaşımlar birikmesi çok yaygın. Bunları düzenli olarak gözden geçirmek gerekir.
# Sistemdeki tüm paylaşımları listele
Get-SmbShare | Where-Object {$_.Name -notlike "*$"} |
Select-Object Name, Path, Description, EncryptData, FolderEnumerationMode |
Format-Table -AutoSize
# Aktif oturumları gör
Get-SmbSession | Select-Object ClientComputerName, ClientUserName, NumOpens, SecondsIdle |
Sort-Object SecondsIdle -Descending
# Açık dosyaları listele
Get-SmbOpenFile | Select-Object ClientComputerName, ClientUserName, Path |
Where-Object {$_.Path -ne $null}
# Kullanılmayan paylaşımı kaldır
Remove-SmbShare -Name "EskiArşiv" -Force
Where-Object {$_.Name -notlike "*$"} kısmı, ADMIN$, C$, IPC$ gibi gizli sistem paylaşımlarını filtreliyor. Bunlar normal faaliyetin parçası, onları görmek yerine kendi kurduğunuz paylaşımları incelemeniz daha verimli.
SMB Audit ve Loglama
Kimin neye eriştiğini bilmiyorsanız, güvenlik açısından kördünüz demektir. SMB erişim denetimini aktif etmek için:
# Nesne erişim denetimini aktifleştir (Audit Policy)
auditpol /set /subcategory:"File System" /success:enable /failure:enable
auditpol /set /subcategory:"File Share" /success:enable /failure:enable
auditpol /set /subcategory:"Detailed File Share" /failure:enable
# Mevcut audit politikasını kontrol et
auditpol /get /subcategory:"File Share"
Ardından, denetlemek istediğiniz klasör üzerinde NTFS denetim ayarlarını yapılandırın:
# Audit ACE ekle - başarısız erişim girişimlerini kaydet
$auditAce = New-Object System.Security.AccessControl.FileSystemAuditRule(
"Everyone",
"ReadData,WriteData,Delete",
"ContainerInherit,ObjectInherit",
"None",
"Failure"
)
$acl = Get-Acl -Path "D:SharesMuhasebe"
$acl.AddAuditRule($auditAce)
Set-Acl -Path "D:SharesMuhasebe" -AclObject $acl
Bu yapılandırmadan sonra başarısız erişim girişimleri Windows Security event log’una Event ID 4656 ve 5145 olarak düşecek. Bu logları SIEM’inize gönderin veya en azından düzenli gözden geçirme rutini oluşturun.
Performans Ayarları: SMB Multichannel ve Büyük MTU
Birden fazla ağ adaptörü olan sunucularda SMB Multichannel, bant genişliğini ve yedekliliği otomatik olarak artırır. Genellikle varsayılan olarak aktif gelir ama doğrulamak iyi pratik:
# Multichannel durumunu kontrol et
Get-SmbMultichannelConnection
# Sunucu tarafında Multichannel aktif mi?
Get-SmbServerConfiguration | Select-Object EnableMultiChannel
# Aktif değilse aç
Set-SmbServerConfiguration -EnableMultiChannel $true -Force
# Ağ adaptörlerinin Multichannel için uygunluğunu gör
Get-SmbMultichannelConstraint
Get-NetAdapter | Where-Object {$_.Status -eq "Up"} |
Select-Object Name, LinkSpeed, InterfaceDescription
Jumbo Frame yapılandırması olan ortamlarda SMB büyük MTU değerlerinden yararlanabilir. 10GbE ortamında test ettiğimde büyük dosya transferlerinde yaklaşık yüzde 15 ila 20 arası performans artışı gözlemledim.
Bant Genişliği Kısıtlama ve QoS
Paylaşım sunucusu üretim servisleriyle aynı makinedeyse veya aynı ağ segmentindeyse, SMB transferlerinin bant genişliğini tüketmemesi için kısıtlama uygulamak isteyebilirsiniz:
# SMB bant genişliği kısıtlamasını aktifleştir
Set-SmbClientConfiguration -EnableBandwidthThrottling $true -Force
# Kısıtlama pencereleri tanımla (arka plan trafik için)
New-SmbBandwidthLimit -Category Default -BytesPerSecond 104857600 # 100 MB/s
# Farklı kategoriler için farklı limitler
New-SmbBandwidthLimit -Category LiveMigration -BytesPerSecond 52428800 # 50 MB/s
# Mevcut limitleri görüntüle
Get-SmbBandwidthLimit
Bu, özellikle Hyper-V ile SMB’nin aynı altyapıyı paylaştığı ortamlarda gerçek anlamda fark yaratıyor.
Güvenlik Duvarı Kuralları
SMB’nin çalışması için gerekli portları güvenlik duvarında doğru yapılandırmak kritik. Ama “her şeyi aç” yerine, sadece gerekli trafiğe izin verin:
# SMB için gerekli güvenlik duvarı kurallarını kontrol et
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SMB*" -or $_.DisplayName -like "*File*"} |
Select-Object DisplayName, Enabled, Direction, Action | Format-Table
# Belirli bir subnet'ten SMB erişimine izin ver (örnek: 192.168.10.0/24)
New-NetFirewallRule -DisplayName "SMB-Muhasebe-Subnet" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-RemoteAddress "192.168.10.0/24" `
-Action Allow `
-Profile Domain
# İnternet'ten veya güvensiz ağlardan 445 portunu kapat
New-NetFirewallRule -DisplayName "Block-SMB-External" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-RemoteAddress "0.0.0.0/0" `
-Action Block `
-Profile Public
445 portunu public profilde bloklamak zorunludur. Bu port internete açık olmamalı, nokta. Domain profili için de sadece yönetim subnet’lerinden erişime izin vermek, lateral movement saldırılarını önemli ölçüde zorlaştırır.
Yaygın Sorunlar ve Hızlı Teşhis
Sahada en sık karşılaştığım SMB sorunlarını ve hızlı teşhis yöntemlerini paylaşayım:
“Erişim reddedildi” hatası ama izinler doğru görünüyor: Çoğunlukla NTFS izin kalıtım sorunu veya SMB ile NTFS izinlerinin kesişim noktasıdır. Şununla kontrol edin:
# Etkin izinleri kontrol et (hangi kural uygulanıyor?)
$path = "D:SharesMuhasebe"
$user = "DOMAINkullanici"
# Klasör için etkin izinleri göster
$acl = Get-Acl -Path $path
$acl.Access | Where-Object {$_.IdentityReference -like "*kullanici*" -or $_.IdentityReference -like "*Muhasebe*"}
# SMB paylaşım izinlerini de kontrol et
Get-SmbShareAccess -Name "Muhasebe"
# Bağlantı testini doğrudan yap
Test-Path "\SERVERMuhasebe"
Yavaş bağlantı: Genellikle offline dosyalar özelliğinin aktif olmasından kaynaklanır. Büyük paylaşımlar için bu özelliği kapatın:
# Offline dosyaları devre dışı bırak (büyük veri paylaşımları için)
Set-SmbShare -Name "Muhasebe" -CachingMode None -Force
# Mevcut ayarı kontrol et
Get-SmbShare -Name "Muhasebe" | Select-Object CachingMode
SMB bağlantısı zaman aşımı sorunları: Özellikle WAN üzerinden bağlanan kullanıcılarda görülür:
# Session timeout değerini artır
Set-SmbServerConfiguration -AutoDisconnectTimeout 60 -Force # dakika cinsinden
# Keep-alive ayarını düzenle
Set-SmbServerConfiguration -KeepAliveTime 2 -Force
Sonuç
SMB yapılandırması, “kur ve unut” kategorisinde bir iş değil. Ortam büyüdükçe, kullanıcı sayısı arttıkça ve tehdit manzarası değiştikçe yapılandırmayı gözden geçirmek gerekiyor.
Öncelik sırasına göre şunları yapmanızı tavsiye ederim: İlk olarak SMBv1’i kapatın, bu tartışmasız. Sonra şifreleme ve imzalamayı aktifleştirin, özellikle hassas veri barındıran paylaşımlar için. Access-Based Enumeration’ı tüm paylaşımlarda varsayılan hale getirin; ne zaman işe yaradığını, bir güvenlik olayı sonrası log incelediğinizde anlarsınız. Düzenli paylaşım denetimi yapın ve kullanılmayanları temizleyin. Son olarak audit loglama olmadan güvenlik yapılandırması yarım kalır; Security event log’unu aktif tutun ve izleyin.
Bu temel katmanları sağlam kurduğunuzda, üzerine daha gelişmiş konuları olan DFS Namespaces, SMB over QUIC veya Azure dosya paylaşımlarıyla entegrasyonu çok daha rahat inşa edebilirsiniz. Ama her şey sağlam bir temele dayanır.
