Exchange Server Güvenlik Sertleştirme Rehberi
Yıllar içinde onlarca Exchange ortamı yönetmiş biri olarak şunu rahatlıkla söyleyebilirim: Exchange Server, kutudan çıktığı haliyle production ortamına alınacak kadar güvenli değil. Microsoft bunu bilerek böyle tasarlıyor, kurulum kolaylığı için pek çok şeyi açık bırakıyor. Asıl iş, kurulumdan sonra başlıyor. Bu yazıda size gerçek dünyada işe yarayan, test ettiğim ve production ortamlarında uyguladığım sertleştirme adımlarını anlatacağım.
Neden Exchange Sertleştirme Bu Kadar Kritik?
2021’deki ProxyLogon, 2022’deki ProxyNotShell, 2023’teki OWASSRF zafiyetleri… Exchange Server’ın her yıl nasıl bir saldırı hedefi haline geldiğini hepimiz gördük. Ransomware gruplarından devlet destekli APT aktörlerine kadar herkesin ilk hedeflerinden biri Exchange oluyor çünkü posta sunucusu bir organizasyonun kalbi gibidir: kimlik bilgileri, hassas yazışmalar, iç ağa açılan kapılar… Hepsi burada.
Güvenlik sertleştirme tek seferlik bir iş değil. Bir süreç, bir olgunluk seviyesi. Ama bir yerden başlamak gerekiyor ve bu rehber tam olarak o başlangıç noktasını sunmayı amaçlıyor.
Ön Hazırlık: Mevcut Durumu Değerlendirme
Bir şeyi sertleştirmeye başlamadan önce ne durumda olduğunuzu bilmeniz gerekiyor. Microsoft’un sağladığı HealthChecker.ps1 scripti bu işin olmazmazı:
# Exchange Health Checker indirme ve çalıştırma
Invoke-WebRequest -Uri "https://github.com/microsoft/CSS-Exchange/releases/latest/download/HealthChecker.ps1" -OutFile "HealthChecker.ps1"
# Exchange Management Shell üzerinden çalıştırın
.HealthChecker.ps1 -Server EXCH01
.HealthChecker.ps1 -Server EXCH01 -AnalyzeDataOnly
Bu script size mevcut güvenlik açıklarını, eksik yamaları ve yanlış yapılandırmaları raporluyor. Çıktıyı HTML formatında alıp rahatça inceleyebilirsiniz. Müşteri ziyaretlerinde her zaman buradan başlıyorum ve çoğunlukla sonuçlar oldukça ürkütücü oluyor.
Ayrıca hangi Exchange versiyonunu çalıştırdığınızı ve Cumulative Update (CU) seviyenizi kontrol edin:
# Exchange versiyon kontrolü
Get-ExchangeServer | Select-Object Name, AdminDisplayVersion, Edition
# Kurulu yamaları listele
Get-Command exsetup | ForEach-Object {$_.FileVersionInfo}
Windows Server Temel Sertleştirme
Exchange güvenliği, altındaki işletim sisteminin güvenliğiyle başlıyor. Exchange sunucusunu bir domain controller üzerine kurmayın, bu kritik. Her şeyi ayrı tutun.
SMB Sertleştirme
SMBv1 hala aktifse bu ciddi bir sorun. EternalBlue ve WannaCry saldırıları SMBv1 üzerinden geliyordu ve hala SMBv1 açık Exchange sunucularıyla karşılaşıyorum:
# SMBv1 durumunu kontrol et
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
# SMBv1'i devre dışı bırak
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
# SMB signing'i zorunlu kıl
Set-SmbServerConfiguration -RequireSecuritySignature $true -EnableSecuritySignature $true -Force
NLA ve RDP Güvenliği
# NLA (Network Level Authentication) kontrolü ve aktivasyonu
# Registry üzerinden:
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "UserAuthentication" -Value 1
# RDP encryption level - High olarak ayarla
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "MinEncryptionLevel" -Value 3
TLS Yapılandırması: Günümüzde Zorunluluk
TLS 1.0 ve TLS 1.1 devre dışı bırakmak artık bir öneri değil, zorunluluk. PCI-DSS, HIPAA ve KVKK uyumluluğu için de gerekli. Ancak dikkatli olun: Exchange, bazı eski sistemlerle iletişim kurmak için bu protokolleri kullanıyor olabilir. Değişiklik öncesi uyumluluk testini yapın.
# TLS 1.0 devre dışı bırakma
$TLS10Path = "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0"
New-Item -Path "$TLS10PathServer" -Force
New-Item -Path "$TLS10PathClient" -Force
Set-ItemProperty -Path "$TLS10PathServer" -Name "Enabled" -Value 0 -Type DWord
Set-ItemProperty -Path "$TLS10PathServer" -Name "DisabledByDefault" -Value 1 -Type DWord
Set-ItemProperty -Path "$TLS10PathClient" -Name "Enabled" -Value 0 -Type DWord
Set-ItemProperty -Path "$TLS10PathClient" -Name "DisabledByDefault" -Value 1 -Type DWord
# TLS 1.1 devre dışı bırakma
$TLS11Path = "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.1"
New-Item -Path "$TLS11PathServer" -Force
New-Item -Path "$TLS11PathClient" -Force
Set-ItemProperty -Path "$TLS11PathServer" -Name "Enabled" -Value 0 -Type DWord
Set-ItemProperty -Path "$TLS11PathServer" -Name "DisabledByDefault" -Value 1 -Type DWord
Set-ItemProperty -Path "$TLS11PathClient" -Name "Enabled" -Value 0 -Type DWord
Set-ItemProperty -Path "$TLS11PathClient" -Name "DisabledByDefault" -Value 1 -Type DWord
# TLS 1.2 açık olduğundan emin ol
$TLS12Path = "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2"
New-Item -Path "$TLS12PathServer" -Force
New-Item -Path "$TLS12PathClient" -Force
Set-ItemProperty -Path "$TLS12PathServer" -Name "Enabled" -Value 1 -Type DWord
Set-ItemProperty -Path "$TLS12PathServer" -Name "DisabledByDefault" -Value 0 -Type DWord
Set-ItemProperty -Path "$TLS12PathClient" -Name "Enabled" -Value 1 -Type DWord
Set-ItemProperty -Path "$TLS12PathClient" -Name "DisabledByDefault" -Value 0 -Type DWord
Bu değişikliklerden sonra sunucuyu yeniden başlatmayı unutmayın. Ayrıca Exchange’in TLS 1.2 ile düzgün çalışması için .NET Framework güncellemesi ve ilgili registry değişiklikleri de gerekiyor. Microsoft’un ExchangeExtendedProtectionManagement.ps1 scriptini bu iş için kullanabilirsiniz.
IIS Sertleştirme: OWA ve ECP’yi Koruma Altına Alma
Exchange’in web arayüzleri saldırıların giriş noktası. OWA ve ECP’yi sertleştirmek kritik önem taşıyor.
HTTP Response Header’larını Temizleme
# IIS'te server header'ı gizle
Import-Module WebAdministration
Set-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" -Filter "system.webServer/security/requestFiltering" -Name "removeServerHeader" -Value "True"
# X-Powered-By header kaldırma
Remove-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" -Filter "system.webServer/httpProtocol/customHeaders" -Name "." -AtElement @{name='X-Powered-By'}
ECP Erişim Kısıtlaması
ECP (Exchange Control Panel) yönetim amaçlı. Mümkünse sadece belirli IP aralıklarından erişime açın:
# ECP'ye IP bazlı kısıtlama
# IIS Manager üzerinden ya da appcmd ile:
& "$env:SystemRootSystem32inetsrvappcmd.exe" set config "Default Web Site/ecp" /section:ipSecurity /allowUnlisted:false /commit:apphost
# Yönetim ağınızın IP'sini izin ver
& "$env:SystemRootSystem32inetsrvappcmd.exe" set config "Default Web Site/ecp" /section:ipSecurity /+"[ipAddress='10.10.10.0',subnetMask='255.255.255.0',allowed='True']" /commit:apphost
Extended Protection Aktifleştirme
Extended Protection for Authentication, NTLM relay saldırılarına karşı önemli bir savunma katmanı:
# Exchange Extended Protection Management
.ExchangeExtendedProtectionManagement.ps1
# Mevcut durumu kontrol et
.ExchangeExtendedProtectionManagement.ps1 -ShowExtendedProtection
# Aktifleştir
.ExchangeExtendedProtectionManagement.ps1 -ExchangeServers EXCH01, EXCH02
SMTP Güvenliği ve Relay Kontrolü
Açık relay durumu en tehlikeli Exchange yanlış yapılandırmalarından biri. Spam gönderimi, kara listeye alınma ve reputasyon kaybı yaşamamak için bu adımları uygulayın.
# Tüm Receive Connector'ları listele ve anonymous relay kontrolü yap
Get-ReceiveConnector | Select-Object Name, Bindings, PermissionGroups, RemoteIPRanges
# Anonymous relay açık mı kontrol et
Get-ReceiveConnector | Where-Object {$_.PermissionGroups -match "AnonymousUsers"} | Select-Object Name, RemoteIPRanges
# Sadece belirli IP'lerden relay izni olan connector örneği
# Mevcut bir connector'ı düzenlemek için:
Set-ReceiveConnector -Identity "EXCH01Internal Relay" -RemoteIPRanges "10.10.10.0/24", "192.168.1.0/24"
# Gereksiz anonymous relay iznini kaldır
Get-ReceiveConnector "EXCH01Frontend Default" | Remove-ADPermission -User "NT AUTHORITYAnonymous Logon" -ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient"
SMTP Banner Gizleme
Sunucu banner’ı versiyon bilgisi sızdırıyor. Bunu özelleştirin:
# SMTP banner'ı değiştir
Set-ReceiveConnector -Identity "EXCH01Default Frontend EXCH01" -Banner "220 mail.sirketiniz.com ESMTP"
# Tüm frontend connector'lara uygula
Get-ReceiveConnector -Server EXCH01 | Where-Object {$_.TransportRole -eq "FrontendTransport"} | Set-ReceiveConnector -Banner "220 mail.sirketiniz.com ESMTP"
Anti-Spam ve Anti-Malware Yapılandırması
Exchange’in yerleşik anti-spam ve anti-malware özellikleri genellikle ya hiç aktif edilmiyor ya da varsayılan ayarlarla bırakılıyor.
# Anti-malware motorunu kontrol et
Get-MalwareFilteringServer | Select-Object Name, UpdateFrequency, ForceRescan
# Güncelleme sıklığını artır (varsayılan 60 dakika)
Set-MalwareFilteringServer -Identity EXCH01 -UpdateFrequency 30
# Anti-malware politikasını güçlendir
Set-MalwareFilterPolicy -Identity Default -Action DeleteMessage -EnableInternalSenderAdminNotifications $true -InternalSenderAdminAddress "[email protected]"
# Connection filtering - kara liste servislerini aktif et
Set-IPBlockListProvidersConfig -Enabled $true
Add-IPBlockListProvider -Name "Spamhaus" -LookupDomain "zen.spamhaus.org" -AnyMatch $true -BitmaskMatch 255.255.255.255
# Sender ID filtering aktifleştir
Set-SenderIDConfig -Enabled $true -SpoofedDomainAction StampStatus -TempErrorAction StampStatus
Denetim ve Loglama
Bir saldırıyı fark etmek için ne olduğunu kayıt altına alıyor olmanız gerekiyor. Exchange’in audit logging özellikleri varsayılan olarak oldukça sınırlı.
# Admin audit logging aktifleştir ve yapılandır
Set-AdminAuditLogConfig -AdminAuditLogEnabled $true -AdminAuditLogAgeLimit 180 -AdminAuditLogCmdlets * -AdminAuditLogParameters *
# Mailbox audit logging - tüm kullanıcılar için
Get-Mailbox -ResultSize Unlimited | Set-Mailbox -AuditEnabled $true -AuditLogAgeLimit 90
# Audit edilecek eylemler
Get-Mailbox -ResultSize Unlimited | Set-Mailbox -AuditOwner @{Add="MailboxLogin","HardDelete","SoftDelete","Update","Move"} -AuditDelegate @{Add="SendAs","SendOnBehalf","Create","Update","Move","MoveToDeletedItems","FolderBind"} -AuditAdmin @{Add="Copy","MessageBind","Move","MoveToDeletedItems","SendAs","SendOnBehalf","SoftDelete","HardDelete","Update","FolderBind"}
# Mevcut admin audit loglarına bak
Search-AdminAuditLog -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date) | Select-Object Caller, CmdletName, RunDate | Sort-Object RunDate -Descending | Select-Object -First 20
PowerShell Uzaktan Erişim Kısıtlaması
Remote PowerShell erişimi sadece ihtiyaç duyan yöneticilere açık olmalı:
# Remote PowerShell erişimini devre dışı bırak (son kullanıcılar için)
Get-User -ResultSize Unlimited | Where-Object {$_.UserAccountControl -notmatch "AccountDisabled"} | Where-Object {$_.RemotePowerShellEnabled -eq $true -and $_.RecipientType -eq "UserMailbox"} | Set-User -RemotePowerShellEnabled $false
# Sadece Exchange adminleri için açık tut
# Belirli bir kullanıcıya izin ver
Set-User -Identity "exchAdmin" -RemotePowerShellEnabled $true
# Exchange kontrol paneli erişim raporu
Get-User -ResultSize Unlimited | Where-Object {$_.RemotePowerShellEnabled -eq $true} | Select-Object Name, Title, Department
Güvenlik Açığı Taraması ve Sürekli İzleme
Sertleştirme tek seferlik değil, süregelen bir süreç. Aşağıdaki scripti haftalık çalışacak şekilde zamanlayın:
# Exchange güvenlik durumu özet raporu
$Report = @()
# TLS ayarlarını kontrol et
$TLS10 = (Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -ErrorAction SilentlyContinue).Enabled
$TLS12 = (Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -ErrorAction SilentlyContinue).Enabled
$Report += [PSCustomObject]@{
Check = "TLS 1.0 Disabled"
Status = if ($TLS10 -eq 0) {"PASS"} else {"FAIL"}
}
$Report += [PSCustomObject]@{
Check = "TLS 1.2 Enabled"
Status = if ($TLS12 -eq 1) {"PASS"} else {"FAIL"}
}
# SMBv1 kontrolü
$SMBv1 = (Get-SmbServerConfiguration).EnableSMB1Protocol
$Report += [PSCustomObject]@{
Check = "SMBv1 Disabled"
Status = if ($SMBv1 -eq $false) {"PASS"} else {"FAIL"}
}
# Anti-malware durumu
$Malware = Get-MalwareFilteringServer
$Report += [PSCustomObject]@{
Check = "Anti-Malware Active"
Status = if ($Malware) {"PASS"} else {"FAIL"}
}
# Raporu dosyaya yaz
$Report | Format-Table -AutoSize
$Report | Export-Csv -Path "C:ExchangeSecReport_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
Pratik Gerçek Dünya Notları
Bir finansal kuruluşta Exchange ortamını sertleştirirken yaşadığım bir olayı paylaşayım: TLS 1.0’ı devre dışı bıraktıktan sonra eski bir muhasebe yazılımının mail gönderemediğini fark ettik. Yazılım TLS 1.0 ile çalışıyordu. Bunun gibi uyumluluk sorunları sizi baskıya sokabilir. Bu yüzden değişiklikleri önce test ortamında uygulayın, en az bir hafta gözlemleyin, sonra production’a alın.
Bir diğer önemli nokta: Exchange CU güncellemelerini ihmal etmeyin. Microsoft her CU ile güvenlik düzeltmeleri de sunuyor. CU’ları patching sürecinize dahil edin. “Dokunma dokunma bozulmasın” zihniyeti Exchange için geçerli değil; tam tersi, güncellenmemiş Exchange, saldırganlar için açık davetiye.
Ayrıca WAF (Web Application Firewall) kullanımını değerlendirin. Exchange önüne bir WAF koyduğunuzda OWA ve ECP’ye yönelik saldırıların büyük bölümü sunucuya ulaşmadan engellenebiliyor.
Sonuç
Exchange Server sertleştirmesi katmanlı bir yaklaşım gerektiriyor: işletim sistemi, TLS, IIS, SMTP, audit ve sürekli izleme. Burada ele aldığım adımlar bir başlangıç noktası. Ortamınıza özgü gereksinimlere ve uyumluluk yükümlülüklerine göre bu listeyi genişletmeniz gerekebilir.
En önemli üç şeyi aklınızda tutun: güncel tutun, minimum yetki prensibiyle çalışın ve her şeyi loglayın. Exchange saldırılarının büyük çoğunluğu yamalanmamış sistemleri ya da yanlış yapılandırılmış servisleri hedef alıyor. Bu iki sorunu çözdüğünüzde risk seviyenizi dramatik biçimde düşürüyorsunuz.
Son olarak, bu değişiklikleri uygulamadan önce sisteminizin tam yedeğini alın. Özellikle registry değişiklikleri ve IIS yapılandırmaları bazen beklenmedik etkiler yaratabilir. Değişiklik yönetimi sürecinizi atlamamayı ve change window dışında kritik sistemlere müdahale etmemeyi şiddetle tavsiye ederim.
