Windows Server Güncellemeleri: WSUS ile Merkezi Yama Yönetimi

Şirket ortamında yüzlerce Windows makinesini tek tek güncellemek, sysadmin olarak yaşayabileceğin en sinir bozucu deneyimlerden biridir. Kim uğraşır ki her sunucuya RDP açıp Windows Update çalıştırmakla? İşte tam bu noktada WSUS devreye giriyor ve hayatını kurtarıyor.

WSUS (Windows Server Update Services), Microsoft’un ücretsiz sunduğu merkezi yama yönetim çözümüdür. Temel mantık basit: Güncellemeler internetten bir kez indirilir, onaylama sürecinden geçirilir ve iç ağdaki tüm makinelere dağıtılır. Hem bant genişliğinden tasarruf edersin hem de hangi makinenin güncel olup olmadığını merkezi olarak takip edebilirsin.

WSUS Neden Önemli?

Üretim ortamında yamalar körü körüne uygulanmaz. Her güncelleme test edilmeden canlıya alınırsa, sabah 3’te “sunucu açılmıyor” diye telefon açılması kaçınılmaz hale gelir. WSUS sana şu avantajları sağlar:

  • Kontrollü dağıtım: Güncellemeleri önce test ortamında, sonra production’a uygularsın
  • Bant genişliği tasarrufu: Her makine Microsoft sunucularından çekmek yerine tek noktadan alır
  • Merkezi raporlama: Hangi makine kaç gündür güncellenmemiş, bir bakışta görürsün
  • Offline ortam desteği: İnternete çıkamayan izole ağlarda da çalışır
  • Onay mekanizması: Sorunlu güncellemeleri bekletebilir veya reddedebilirsin

Özellikle “kritik altyapı” denilen hastane, fabrika, banka gibi ortamlarda yamayı onaylamadan dağıtmak büyük risk taşır. WSUS bu süreci disipline sokar.

WSUS Kurulumu

Sunucu Gereksinimleri

WSUS’u kuracağın sunucunun boyutu, kaç istemci yöneteceğine göre değişir. 500 istemciye kadar olan ortamlar için 4 GB RAM ve dual-core işlemci yeterlidir. Güncelleme deposu için ise en az 100 GB disk alanı ayarla, zamanla bu alan dolacak.

Disk boyutu konusunda gerçekçi ol. Sadece Windows güncellemelerini tutacaksan 100 GB yetebilir, ama Office, SQL Server ve diğer Microsoft ürünlerini de eklersen bu rakam 500 GB’a kolayca çıkar.

Rol Kurulumu

WSUS’u PowerShell ile kurmak, GUI’den çok daha hızlı ve tekrarlanabilir. Şu komutla kurulumu başlatabilirsin:

# WSUS rolünü ve gerekli özelliklerini kur
Install-WindowsFeature -Name UpdateServices -IncludeManagementTools

# WID (Windows Internal Database) ile kurulum
Install-WindowsFeature -Name UpdateServices-WidDB, UpdateServices-Services, UpdateServices-RSAT, UpdateServices-API, UpdateServices-UI

Eğer WID yerine SQL Server kullanmak istiyorsan, özellikle büyük ortamlarda bunu tercih et çünkü WID 10.000 istemcinin üzerinde performans sorunları çıkarabilir:

# SQL Server ile WSUS kurulumu
Install-WindowsFeature -Name UpdateServices-DB, UpdateServices-Services, UpdateServices-RSAT, UpdateServices-API, UpdateServices-UI

Post-Kurulum Yapılandırması

Rol kurulumundan sonra WSUS’u yapılandırman gerekiyor. Bu adım atlanırsa servis düzgün çalışmaz:

# Güncelleme deposu için klasör oluştur
New-Item -Path "D:WSUS" -ItemType Directory

# Post-install yapılandırmasını çalıştır
& "C:Program FilesUpdate ServicesToolswsusutil.exe" postinstall CONTENT_DIR=D:WSUS

# WSUS servisinin durumunu kontrol et
Get-Service -Name WsusService | Select-Object Status, StartType

Bu komut çalıştıktan sonra birkaç dakika bekle. WSUS ilk senkronizasyon için gerekli veritabanı yapısını oluşturuyor.

İlk Senkronizasyon ve Ürün Seçimi

WSUS konsolunu açtığında seni bir “Configuration Wizard” karşılayacak. Burada dikkat etmen gereken en kritik nokta ürün ve sınıflandırma seçimi. Her şeyi seçersen hem disk dolar hem de senkronizasyon sonsuza kadar sürer.

Gerçekçi bir yaklaşım şu şekilde olabilir:

  • Ürünler: Windows Server 2019, Windows Server 2022, Windows 10, Windows 11, Office 2019/2021
  • Sınıflandırmalar: Critical Updates, Security Updates, Service Packs, Definition Updates
  • Diller: Sadece Turkish ve English, geri kalanını devre dışı bırak

Definition Updates (Defender imza güncellemeleri) konusunda dikkatli ol. Bunlar günde birkaç kez güncelleniyor ve disk alanını hızla tüketiyor. Ayrı bir WSUS grubu oluşturup sadece bu makinelere dağıtabilirsin.

# PowerShell ile WSUS sunucusuna bağlanıp ürün seçimi yapabilirsin
[void][reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("localhost", $false, 8530)

# Tüm kategorileri listele
$wsus.GetUpdateCategories() | Select-Object Title | Sort-Object Title

# Senkronizasyonu başlat
$subscription = $wsus.GetSubscription()
$subscription.StartSynchronization()

İlk senkronizasyon ağ hızına ve seçtiğin ürün sayısına göre saatler alabilir. Bu işlemi gece başlatman en doğrusu.

Bilgisayar Grupları Oluşturma

WSUS’un en güçlü yanlarından biri bilgisayar gruplarıdır. Tüm makinelere aynı anda aynı yamayı göndermek felakete davetiye çıkarır. Düzgün bir yapı şöyle kurulabilir:

  • Test Grubu: 2-3 adet kritik olmayan test makinesi, her yama buraya önce gider
  • Pilot Grubu: Bir kaç departman makinesi veya önemsiz sunucular
  • Production Servers: Kritik sunucular, en son onaylanan yamalar buraya gelir
  • Workstations: Kullanıcı bilgisayarları
  • Domain Controllers: DC’ler ayrı grupta, çok dikkatli yama yapılır
# PowerShell ile bilgisayar grupları oluştur
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("localhost", $false, 8530)

# Grup oluştur
$wsus.CreateComputerTargetGroup("Test-Ortami")
$wsus.CreateComputerTargetGroup("Pilot-Grup")
$wsus.CreateComputerTargetGroup("Production-Servers")
$wsus.CreateComputerTargetGroup("Workstations")
$wsus.CreateComputerTargetGroup("Domain-Controllers")

Write-Host "Bilgisayar grupları başarıyla oluşturuldu."

Group Policy ile İstemci Yapılandırması

Makinelerin WSUS sunucusuna yönlendirilmesi için Group Policy kullanırsın. Bu adımı atlarsan makineler Microsoft sunucularına gitmeye devam eder.

GPO yolunu aç: Computer Configuration > Administrative Templates > Windows Components > Windows Update

Ayarlanması gereken temel politikalar:

  • Specify intranet Microsoft update service location: WSUS sunucunun adresi (örn: http://wsus-srv:8530)
  • Configure Automatic Updates: 4 – Auto download and schedule the install
  • Enable client-side targeting: Makineyi otomatik olarak hangi WSUS grubuna atayacağını belirtir
  • No auto-restart with logged on users: Kullanıcı aktifken restart engellenir
# GPO'yu PowerShell ile de oluşturabilirsin
Import-Module GroupPolicy

# Yeni GPO oluştur
New-GPO -Name "WSUS-Client-Settings" -Comment "WSUS istemci yapılandırması"

# GPO'yu domain'e bağla
New-GPLink -Name "WSUS-Client-Settings" -Target "DC=sirket,DC=local"

# WSUS adresini registry üzerinden ayarla
Set-GPRegistryValue -Name "WSUS-Client-Settings" `
    -Key "HKLMSOFTWAREPoliciesMicrosoftWindowsWindowsUpdate" `
    -ValueName "WUServer" `
    -Type String `
    -Value "http://wsus-srv.sirket.local:8530"

Set-GPRegistryValue -Name "WSUS-Client-Settings" `
    -Key "HKLMSOFTWAREPoliciesMicrosoftWindowsWindowsUpdate" `
    -ValueName "WUStatusServer" `
    -Type String `
    -Value "http://wsus-srv.sirket.local:8530"

Set-GPRegistryValue -Name "WSUS-Client-Settings" `
    -Key "HKLMSOFTWAREPoliciesMicrosoftWindowsWindowsUpdateAU" `
    -ValueName "UseWUServer" `
    -Type DWord `
    -Value 1

GPO uygulandıktan sonra istemcilerde politikanın aktif olup olmadığını kontrol etmek için:

# İstemci makinede çalıştır
gpupdate /force

# WSUS'a kayıt ol
wuauclt /detectnow
wuauclt /reportnow

# Windows Update servisini yeniden başlat
Restart-Service -Name wuauserv

# Hangi WSUS sunucusuna bağlandığını kontrol et
Get-ItemProperty "HKLM:SOFTWAREPoliciesMicrosoftWindowsWindowsUpdate" | Select-Object WUServer, WUStatusServer

Güncelleme Onaylama Süreci

Senkronizasyon tamamlandıktan sonra güncellemeler “Unapproved” durumunda gelir. Sen onaylamadan hiçbir makineye dağıtılmaz. Bu mekanizma çok kritik.

Gerçek dünya senaryosu: Microsoft Salı günü (Patch Tuesday) yeni yamalar yayınladı. Sen hemen onaylama yapmamalısın. Bir veya iki gün bekle, toplulukta sorun raporlarını takip et, sonra test grubuna onayla. Test ortamında 3-5 gün bekle, sorun yoksa production’a geç.

# PowerShell ile güncelleme onaylama
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("localhost", $false, 8530)

# Onaysız güncellemeleri listele
$updates = $wsus.GetUpdates() | Where-Object {
    $_.IsApproved -eq $false -and
    $_.IsDeclined -eq $false -and
    $_.UpdateClassificationTitle -eq "Security Updates"
}

Write-Host "Onaysız güvenlik güncellemesi sayısı: $($updates.Count)"

# Test grubunu bul
$testGroup = $wsus.GetComputerTargetGroups() | Where-Object { $_.Name -eq "Test-Ortami" }

# İlk güncellemeyi test grubuna onayla (örnek)
foreach ($update in $updates | Select-Object -First 5) {
    $update.Approve([Microsoft.UpdateServices.Administration.UpdateApprovalAction]::Install, $testGroup)
    Write-Host "Onaylandı: $($update.Title)"
}

WSUS Temizliği ve Bakım

WSUS zaman içinde devasa bir boyuta ulaşabilir. Gereksiz dosyalar ve eski güncellemeler sistemi yavaşlatır. Aylık bakım rutinine şunları ekle:

# WSUS Server Cleanup Wizard'ı PowerShell ile çalıştır
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("localhost", $false, 8530)

$cleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope
$cleanupScope.DeclineSupersededUpdates = $true
$cleanupScope.DeclineExpiredUpdates = $true
$cleanupScope.CleanupObsoleteUpdates = $true
$cleanupScope.CompressUpdates = $true
$cleanupScope.CleanupObsoleteComputers = $true
$cleanupScope.CleanupUnneededContentFiles = $true

$cleanupManager = $wsus.GetCleanupManager()
$results = $cleanupManager.PerformCleanup($cleanupScope)

Write-Host "Temizlenen dosya boyutu: $($results.DiskSpaceFreed) bytes"
Write-Host "Silinen güncelleme sayısı: $($results.ExpiredUpdatesDeclined)"
Write-Host "Silinen eski bilgisayar sayısı: $($results.ObsoleteComputersDeleted)"

Veritabanı bakımını da unutma. WID kullananlar için WSUS veritabanını düzenli olarak optimize et:

# WSUS veritabanı bakım scripti
# Bu scripti aylık çalıştır

$SqlCmd = @"
USE SUSDB;

-- Index'leri yeniden oluştur
EXEC sp_msforeachtable 'ALTER INDEX ALL ON ? REBUILD'

-- İstatistikleri güncelle  
EXEC sp_updatestats

-- Eski log kayıtlarını temizle
DELETE FROM tbEventInstance WHERE TimeAtServer < DATEADD(month, -3, GETDATE())
"@

# WID bağlantısı için
Invoke-Sqlcmd -ServerInstance "\.pipeMICROSOFT##WIDtsqlquery" -Query $SqlCmd
Write-Host "Veritabanı bakımı tamamlandı: $(Get-Date)"

Uyumluluk Raporları ve Takip

WSUS’un raporlama özelliği sysadminlerin en çok sevdiği özelliklerden biridir. Hangi makinenin ne kadar geride kaldığını görmek için:

# Güncel olmayan bilgisayarları raporla
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("localhost", $false, 8530)

# Son 30 gün içinde iletişim kurmayan makineler
$scope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope
$allComputers = $wsus.GetComputerTargets($scope)

$staleComputers = $allComputers | Where-Object {
    $_.LastReportedStatusTime -lt (Get-Date).AddDays(-30) -or
    $_.LastReportedStatusTime -eq $null
}

Write-Host "30 gündür rapor gelmeyen makine sayısı: $($staleComputers.Count)"
$staleComputers | Select-Object FullDomainName, LastReportedStatusTime, IPAddress | 
    Format-Table -AutoSize

# Kritik güncelleme bekleyen makineler
$criticalPending = $allComputers | Where-Object {
    ($wsus.GetUpdatesForComputerTarget($_, $false) | 
     Where-Object { $_.UpdateClassificationTitle -eq "Critical Updates" }).Count -gt 0
}

Write-Host "Kritik güncelleme bekleyen makine sayısı: $($criticalPending.Count)"

Bu raporu bir zamanlanmış görev ile haftalık otomatik çalıştırıp e-posta ile gönderebilirsin. Pazartesi sabahı e-postayı açtığında kaç makinenin güncelleme beklediğini görmek, haftaya daha kontrollü başlamanı sağlar.

Downstream WSUS ile Hiyerarşik Yapı

Birden fazla lokasyonun olduğu şirketlerde her noktaya ayrı WSUS kurabilirsin. Merkez WSUS (upstream) internetten çeker, şube WSUS sunucuları (downstream) ise merkez WSUS’tan senkronize olur. Şube internet bant genişliği boşa harcanmaz.

Bu yapıda dikkat etmen gerekenler:

  • Autonomous mode: Her şube bağımsız onay yapabilir, merkez sadece güncelleme sağlayıcısıdır
  • Replica mode: Merkezdeki onaylar otomatik şubelere yansır, tek elden yönetim sağlanır
  • Downstream sunucuların senkronizasyon saatlerini, upstream’in senkronizasyonu bitmesinden sonraya ayarla
  • Şubeler arası WAN bağlantısı yavaşsa, senkronizasyonu hafta sonlarına programla

Yaygın Sorunlar ve Çözümleri

Problem 1: Makineler WSUS’a görünmüyor

Bu genellikle GPO’nun uygulanmadığı veya Windows Update servisinin doğru çalışmadığı anlamına gelir:

# İstemci makine üzerinde çalıştır
# SID sıfırlama - makinenin WSUS'a yeniden kayıt olması için
Stop-Service wuauserv
Remove-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdate" -Name AccountDomainSid -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdate" -Name PingID -ErrorAction SilentlyContinue
Remove-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdate" -Name SusClientId -ErrorAction SilentlyContinue
Start-Service wuauserv
wuauclt /resetauthorization /detectnow

Problem 2: WSUS konsolu yavaş açılıyor veya timeout veriyor

Bu genellikle veritabanının şişmesinden kaynaklanır. Cleanup Wizard’ı çalıştır ve veritabanı bakımını yap. Ayrıca IIS application pool’u recycle etmek de yardımcı olabilir:

# IIS WSUS uygulama havuzunu yeniden başlat
Import-Module WebAdministration
Restart-WebAppPool -Name "WsusPool"

# WsusPool memory limitini artır (varsayılan 1.8 GB, büyük ortamlarda yetersiz)
Set-ItemProperty -Path "IIS:AppPoolsWsusPool" -Name "recycling.periodicRestart.privateMemory" -Value 0

Problem 3: Senkronizasyon başarısız oluyor

Proxy arkasındaysanız veya güvenlik duvarı kuralları eksikse senkronizasyon hata verir:

# WSUS proxy ayarlarını kontrol et
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer("localhost", $false, 8530)
$proxyConfig = $wsus.GetProxyConfiguration()
Write-Host "Proxy kullanılıyor mu: $($proxyConfig.UseProxy)"
Write-Host "Proxy adresi: $($proxyConfig.ProxyName):$($proxyConfig.ProxyServerPort)"

# Bağlantıyı test et
Test-NetConnection -ComputerName "windowsupdate.microsoft.com" -Port 443
Test-NetConnection -ComputerName "update.microsoft.com" -Port 443

Patch Tuesday Rutini

Her ayın ikinci Salı günü Microsoft güvenlik yamaları yayınlar. Bu günü bir rutine bağlamak seni çok kurtarır:

Salı akşamı: Senkronizasyonu başlat, yeni güncellemeleri incele

Çarşamba-Perşembe: Microsoft’un ve üçüncü taraf güvenlik bloglarının raporlarını oku, sorunlu güncelleme var mı kontrol et

Cuma: Kritik güncellemeleri test grubuna onayla

Ertesi hafta Pazartesi: Test ortamında sorun yoksa pilot gruba yay

İki hafta sonra: Production ortamına uygula, bakım penceresi belirle ve sorumlu kişileri bilgilendir

Bu rutin biraz yavaş görünebilir ama bir güncelleme exchange sunucunu çökerttiğinde bu iki haftanın ne kadar değerli olduğunu anlarsın.

Sonuç

WSUS, kurumsal Windows ortamlarında yama yönetiminin temel taşıdır. Ücretsiz olması ve Windows Server ile entegre gelmesi büyük avantaj. Evet, bakım gerektiriyor ve zaman zaman sinir bozucu davranıyor, ama alternatifi olan “elle güncelle” veya “hiç güncelleme” senaryolarına kıyasla çok daha iyi bir noktada seni tutuyor.

Kurumun büyüklüğüne ve ihtiyaçlarına göre WSUS yeterli olmayabilir. Microsoft SCCM/Endpoint Configuration Manager veya üçüncü taraf araçlar (ManageEngine, Ivanti gibi) daha gelişmiş özellikler sunar. Ama küçük ve orta ölçekli işletmeler için WSUS, doğru kurulduğunda ve düzenli bakımı yapıldığında yıllarca güvenilir biçimde çalışır.

En önemli tavsiye: Düzenli bakımı atlama. Aylık cleanup, haftalık raporlar ve Patch Tuesday rutini seni büyük olaylardan korur. Ve unutma, test etmeden production’a gönderdiğin her yama bir bomba gibidir; ne zaman patlayacağını bilemezsin.

Yorum yapın