# önder online
Teknoloji ve siber güvenlik dünyasına hoş geldiniz Güncel siber tehditler ve korunma yöntemleri Yapay zekâ ve otomasyonun güvenliğe etkileri Microsoft 365 ve Active Directory güvenlik rehberleri Yazılım geliştirmede güvenlik odaklı yaklaşımlar Teknoloji ve siber güvenlik dünyasına hoş geldiniz Güncel siber tehditler ve korunma yöntemleri

Menu

Terminal Sunucularında Kullanılmayan Oturumların Yönetimi: Güvenlik, Performans ve Verimlilik İçin Kritik Önlemler

Terminal Sunucularında Kullanılmayan Oturumların Yönetimi: Güvenlik, Performans ve Verimlilik İçin Kritik Önlemler

Terminal Services (TS) veya modern adıyla Remote Desktop Services (RDS), kurumsal ortamlarda uzaktan erişim ve merkezi uygulama yönetimi için vazgeçilmez bir teknoloji haline gelmiştir.

Terminal Services (TS) veya modern adıyla Remote Desktop Services (RDS), kurumsal ortamlarda uzaktan erişim ve merkezi uygulama yönetimi için vazgeçilmez bir teknoloji haline gelmiştir. Ancak, bu güçlü altyapının etkin kullanılabilmesi için kullanılmayan oturumların doğru yönetimi kritik öneme sahiptir. Bu yazıda, terminal sunucularında boşta kalan oturumların neden kapatılması gerektiğini, bunun getirdiği avantajları ve uygulama yöntemlerini detaylıca inceleyeceğiz.

Terminal Server Oturum Yönetiminin Önemi

Modern iş dünyasında, özellikle hibrit çalışma modellerinin yaygınlaşmasıyla birlikte, terminal sunucu kullanımı katlanarak artmıştır. Bir terminal sunucuda aynı anda onlarca, hatta yüzlerce kullanıcı oturum açabilir. Bu yoğun kullanım ortamında, her bir oturumun yaşam döngüsünün doğru yönetilmesi, sistemin sağlıklı işleyişi için hayati önem taşır.

Güvenlik Perspektifinden Oturum Yönetimi

Yetkisiz Erişim Tehditleri ve Önleme Stratejileri

Terminal sunucularda açık bırakılan oturumlar, siber güvenlik açısından en kritik risk faktörlerinden biridir. Bir kullanıcı aktif oturumunu kapatmayı unuttuğunda ve çalışma alanından ayrıldığında, ortaya çıkan güvenlik açıkları zincirleme etkilere yol açabilir.

Gerçek Hayat Senaryosu: Muhasebe departmanından bir çalışan, öğle yemeği için bilgisayarından ayrılıyor ancak terminal sunucu oturumunu kilitlemeden bırakıyor. Bu sırada, yetkisiz bir kişi bu açık oturumu kullanarak finansal verilere erişebilir, kritik işlemler yapabilir veya hassas bilgileri kopyalayabilir.

Oturum Güvenliği İçin Katmanlı Koruma

1. Otomatik Kilit Politikaları:

Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → Security Options
→ Interactive logon: Machine inactivity limit: 900 saniye (15 dakika)

2. Oturum Zaman Aşımı Yapılandırması: Terminal sunucuda Group Policy üzerinden yapılandırma:

Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Session Time Limits

Önerilen ayarlar:

  • Set time limit for disconnected sessions: 10 dakika
  • Set time limit for active but idle sessions: 30 dakika
  • End session when time limits are reached: Enabled

Güvenlik Denetimi ve İzleme

Açık oturumların takibi için PowerShell ile monitoring scripti:

# Aktif RDS oturumlarını listele ve durumlarını kontrol et
Get-RDUserSession | Where-Object {$_.SessionState -eq 'STATE_DISCONNECTED'} | 
    Select-Object UserName, SessionId, IdleTime, CreateTime | 
    Export-Csv "C:\Logs\DisconnectedSessions_$(Get-Date -Format 'yyyyMMdd').csv"

# 30 dakikadan uzun süredir boşta olan oturumları tespit et
$IdleThreshold = New-TimeSpan -Minutes 30
Get-RDUserSession | Where-Object {
    $_.IdleTime -gt $IdleThreshold -and $_.SessionState -eq 'STATE_ACTIVE'
} | ForEach-Object {
    Send-RDUserMessage -HostServer $_.HostServer -UnifiedSessionId $_.SessionId `
        -MessageTitle "Güvenlik Uyarısı" `
        -MessageBody "Oturumunuz 30 dakikadır boşta. 5 dakika içinde kapatılacaktır."
}

Performans ve Kaynak Yönetimi Optimizasyonu

Sistem Kaynaklarının Verimli Kullanımı

Her terminal sunucu oturumu, sistemin değerli kaynaklarını tüketir. Bu kaynakların etkin yönetimi, sunucu performansını doğrudan etkiler.

Kaynak Tüketimi Analizi:

Oturum Durumu Ortalama RAM CPU Kullanımı Disk I/O
Aktif Çalışan 500-800 MB %5-15 Yüksek
Boşta (Idle) 200-400 MB %1-3 Düşük
Disconnected 100-300 MB %0-1 Çok Düşük

Performans İzleme ve Optimizasyon

Performance Monitor ile İzleme:

# Performans sayaçlarını oluştur
$CounterList = @(
    "\Terminal Services\Active Sessions",
    "\Terminal Services\Inactive Sessions",
    "\Memory\Available MBytes",
    "\Processor(_Total)\% Processor Time"
)

Get-Counter -Counter $CounterList -SampleInterval 60 -MaxSamples 60 |
    Export-Counter -Path "C:\PerfLogs\RDSPerformance.blg"

Dinamik Kaynak Yönetimi Stratejisi

Fair Share CPU Scheduling Aktifleştirme:

Computer Configuration → Administrative Templates → Windows Components → 
Remote Desktop Services → Remote Desktop Session Host → Connections
→ Turn on Fair Share CPU Scheduling: Enabled

Bu özellik, CPU kaynaklarını oturumlar arasında adil bir şekilde dağıtır ve tek bir oturumun tüm sistem kaynaklarını tüketmesini engeller.

Lisans Yönetimi ve Maliyet Optimizasyonu

RDS CAL Lisans Kullanımının Optimize Edilmesi

Terminal Server ortamlarında lisans yönetimi, hem yasal uyumluluk hem de maliyet optimizasyonu açısından kritiktir.

Lisans Durumu Kontrolü:

# RDS Lisans kullanımını kontrol et
Import-Module RemoteDesktopServices
Get-RDLicenseConfiguration | Select-Object Mode, LicenseServer

# Kullanılan ve boştaki lisansları görüntüle
$LicenseInfo = Get-WmiObject Win32_TSLicenseReport -ComputerName "LicenseServer"
$LicenseInfo | Select-Object ProductVersion, TotalLicenses, IssuedLicenses, 
    @{Name="AvailableLicenses";Expression={$_.TotalLicenses - $_.IssuedLicenses}}

Lisans Optimizasyon Stratejileri

1. Per-User vs Per-Device Lisanslama:

  • Per-User: Kullanıcı sayısı cihaz sayısından az ise tercih edilmeli
  • Per-Device: Vardiyalı çalışma ortamlarında daha ekonomik

2. Otomatik Lisans Geri Kazanımı:

# 15 gün kullanılmayan lisansları geri al
$StaleDate = (Get-Date).AddDays(-15)
Get-RDLicense | Where-Object {$_.LastUsed -lt $StaleDate} | 
    ForEach-Object {
        Revoke-RDLicense -LicenseId $_.LicenseId
        Write-Log "Lisans geri alındı: $($_.UserName)"
    }

Yönetim Kolaylığı ve Otomasyon

Merkezi Yönetim Konsolu Oluşturma

PowerShell ile özel yönetim aracı geliştirme:

# RDS Yönetim Dashboard
function Show-RDSDashboard {
    $Sessi
    
    $Dashboard = @{
        TotalSessi
        ActiveSessi | Where-Object {$_.SessionState -eq 'STATE_ACTIVE'}).Count
        Disc | Where-Object {$_.SessionState -eq 'STATE_DISCONNECTED'}).Count
        IdleSessi | Where-Object {$_.IdleTime -gt (New-TimeSpan -Minutes 15)}).Count
    }
    
    # HTML Rapor oluştur
    $HTMLReport = @"
    
    
        
        
    
    
        

Terminal Server Oturum Durumu


        
$($Dashboard.TotalSessions)
Toplam Oturum

        
$($Dashboard.ActiveSessions)
Aktif Oturum

        
$($Dashboard.DisconnectedSessions)
Bağlantısı Kesilmiş

        
$($Dashboard.IdleSessions)
Boşta Bekleyen

    
    
"@
    
    $HTMLReport | Out-File "C:\inetpub\wwwroot\RDSDashboard.html"
}

Otomatik Bakım ve Temizlik Rutinleri

Zamanlanmış Görev ile Otomatik Temizlik:

# CleanupRDSSessions.ps1
param(
    [int]$Disc  # Dakika
    [int]$IdleTimeout = 60,          # Dakika
    [string]$LogPath = "C:\Logs\RDSCleanup.log"
)

function Write-Log {
    param($Message)
    "$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')): $Message" | 
        Add-Content -Path $LogPath
}

# Ana temizlik fonksiyonu
function Start-RDSCleanup {
    Write-Log "RDS oturum temizliği başlatıldı"
    
    # Disconnected oturumları kapat
    $Disc | 
        Where-Object {
            $_.SessionState -eq 'STATE_DISCONNECTED' -and 
            $_.DisconnectTime -lt (Get-Date).AddMinutes(-$DisconnectedTimeout)
        }
    
    foreach ($Session in $DisconnectedSessions) {
        try {
            Invoke-RDUserLogoff -HostServer $Session.HostServer `
                -UnifiedSessionId $Session.SessionId -Force
            Write-Log "Oturum kapatıldı: $($Session.UserName) - Sebep: Disconnected timeout"
        }
        catch {
            Write-Log "HATA: $($Session.UserName) oturumu kapatılamadı - $_"
        }
    }
    
    # Idle oturumları kontrol et
    $IdleSessi | 
        Where-Object {
            $_.SessionState -eq 'STATE_ACTIVE' -and 
            $_.IdleTime -gt (New-TimeSpan -Minutes $IdleTimeout)
        }
    
    foreach ($Session in $IdleSessions) {
        # Önce uyarı gönder
        Send-RDUserMessage -HostServer $Session.HostServer `
            -UnifiedSessionId $Session.SessionId `
            -MessageTitle "Oturum Kapatılacak" `
            -MessageBody "Oturumunuz uzun süredir boşta. 5 dakika içinde kapatılacaktır."
        
        # 5 dakika sonra kapat (başka bir task ile)
        Register-ScheduledTask -TaskName "CloseIdleSession_$($Session.SessionId)" `
            -Action (New-ScheduledTaskAction -Execute "powershell.exe" `
                -Argument "-Command `"Invoke-RDUserLogoff -HostServer $($Session.HostServer) -UnifiedSessionId $($Session.SessionId) -Force`"") `
            -Trigger (New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(5)) `
            -RunLevel Highest
    }
    
    Write-Log "Temizlik tamamlandı. Kapatılan: $($DisconnectedSessions.Count), Uyarılan: $($IdleSessions.Count)"
}

# Scripti çalıştır
Start-RDSCleanup

İzleme ve Raporlama Sistemleri

Kapsamlı Oturum Analizi

# Haftalık oturum analiz raporu
function New-WeeklySessionReport {
    $StartDate = (Get-Date).AddDays(-7)
    $EndDate = Get-Date
    
    # Event log'larından oturum verilerini topla
    $Sessi -FilterHashtable @{
        LogName = 'Microsoft-Windows-TerminalServices-LocalSessionManager/Operational'
        StartTime = $StartDate
        EndTime = $EndDate
    }
    
    $Report = [PSCustomObject]@{
        Period = "$StartDate - $EndDate"
        TotalLogins = ($SessionEvents | Where-Object {$_.Id -eq 21}).Count
        TotalLogoffs = ($SessionEvents | Where-Object {$_.Id -eq 23}).Count
        UniqueUsers = ($SessionEvents | Select-Object -ExpandProperty UserId -Unique).Count
        PeakC "\Terminal Services\Total Sessions" -MaxSamples 10080 -SampleInterval 60 | 
            Select-Object -ExpandProperty CounterSamples | 
            Measure-Object -Property CookedValue -Maximum).Maximum
    }
    
    # Excel raporu oluştur
    $Report | Export-Excel -Path "C:\Reports\WeeklyRDSReport_$(Get-Date -Format 'yyyyMMdd').xlsx" `
        -AutoSize -TableName "SessionAnalysis" -ChartType ColumnClustered
}

Gerçek Zamanlı Uyarı Sistemi

# Kritik durumlar için e-posta uyarısı
function Send-RDSAlert {
    param(
        [string]$AlertType,
        [string]$Details
    )
    
    $EmailParams = @{
        To = "it-team@company.com"
        From = "rds-monitor@company.com"
        Subject = "RDS Alert: $AlertType"
        Body = @"
        Terminal Server Uyarısı
        
        Tarih/Saat: $(Get-Date)
        Sunucu: $env:COMPUTERNAME
        Uyarı Tipi: $AlertType
        
        Detaylar:
        $Details
        
        Lütfen gerekli kontrolleri yapınız.
"@
        SmtpServer = "mail.company.com"
    }
    
    Send-MailMessage @EmailParams
}

# İzleme döngüsü
while ($true) {
    $Sessi
    
    # Kritik durum kontrolleri
    if ($Sessions.Count -gt 90) {
        Send-RDSAlert -AlertType "Yüksek Oturum Sayısı" `
            -Details "Aktif oturum sayısı: $($Sessions.Count)/100"
    }
    
    $Disc | Where-Object {$_.SessionState -eq 'STATE_DISCONNECTED'}).Count
    if ($DisconnectedCount -gt 20) {
        Send-RDSAlert -AlertType "Çok Fazla Disconnected Oturum" `
            -Details "Disconnected oturum sayısı: $DisconnectedCount"
    }
    
    Start-Sleep -Seconds 300  # 5 dakikada bir kontrol
}

En İyi Uygulamalar ve Öneriler

1. Proaktif Oturum Yönetimi Politikaları

Kullanıcı Bazlı Özelleştirme: Farklı kullanıcı grupları için farklı timeout değerleri:

# Departman bazlı oturum politikaları
$Policies = @{
    "IT" = @{IdleTimeout = 120; Disc
    "Finance" = @{IdleTimeout = 30; Disc
    "Sales" = @{IdleTimeout = 60; Disc
}

foreach ($Dept in $Policies.Keys) {
    $GP
    New-GPO -Name $GPOName
    Set-GPRegistryValue -Name $GPOName -Key "HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" `
        -ValueName "MaxIdleTime" -Type DWORD -Value ($Policies[$Dept].IdleTimeout * 60000)
}

Kullanıcı Eğitimi ve Farkındalık

Kullanıcılara yönelik otomatik hatırlatıcı sistemi:

# Günlük hatırlatma e-postası
$ReminderHTML = @"


    

Terminal Server Kullanım Hatırlatması


    

Sayın Kullanıcı,


    

Terminal sunucu kaynaklarının verimli kullanımı için lütfen:


    
  •  
  • İşiniz bittiğinde oturumunuzu kapatın (Başlat → Oturumu Kapat)
  •  
  • Kısa süreli ayrılmalarda oturumunuzu kilitleyin (Windows + L)
  •  
  • Gereksiz uygulamaları açık bırakmayın
  •  
  • Büyük dosya transferlerini mesai saatleri dışında yapın
  •  

    

Teşekkürler,
IT Departmanı




"@

Send-MailMessage -To "all-users@company.com" -Subject "Terminal Server Kullanım Hatırlatması" `
    -Body $ReminderHTML -BodyAsHtml -From "it@company.com"

Kapasite Planlama ve Ölçeklendirme

# Kapasite analizi ve tahmin
function Get-CapacityForecast {
    $HistoricalData = Import-Csv "C:\Logs\SessionHistory.csv"
    
    # Trend analizi
    $GrowthRate = ($HistoricalData | Measure-Object -Property SessionCount -Average).Average
    $CurrentCapacity = 100
    $ProjectedUsage = $GrowthRate * 1.2  # %20 güvenlik marjı
    
    if ($ProjectedUsage -gt ($CurrentCapacity * 0.8)) {
        Write-Warning "Kapasite artırımı gerekebilir. Tahmini kullanım: $ProjectedUsage/$CurrentCapacity"
        
        # Ölçeklendirme önerisi
        $Recommendation = @{
            CurrentServers = 2
            RecommendedServers = [Math]::Ceiling($ProjectedUsage / 50)
            EstimatedCost = [Math]::Ceiling($ProjectedUsage / 50) * 1000
        }
        
        return $Recommendation
    }
}

Acil Durum Müdahale Planı

# Emergency session cleanup
function Invoke-EmergencyCleanup {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [switch]$Force,
        [string[]]$ExcludeUsers = @("Administrator", "srv_backup")
    )
    
    Write-Warning "ACİL DURUM TEMİZLİĞİ BAŞLATILIYOR!"
    
    # Tüm disconnected oturumları kapat
    Get-RDUserSession | Where-Object {
        $_.SessionState -eq 'STATE_DISCONNECTED' -and 
        $_.UserName -notin $ExcludeUsers
    } | ForEach-Object {
        if ($PSCmdlet.ShouldProcess("$($_.UserName)", "Force Logoff")) {
            Invoke-RDUserLogoff -HostServer $_.HostServer `
                -UnifiedSessionId $_.SessionId -Force
        }
    }
    
    # Sistem sağlığını kontrol et
    $MemoryAvailable = (Get-Counter "\Memory\Available MBytes").CounterSamples.CookedValue
    $CPUUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
    
    Write-Output "Temizlik sonrası sistem durumu:"
    Write-Output "Kullanılabilir RAM: $MemoryAvailable MB"
    Write-Output "CPU Kullanımı: $([Math]::Round($CPUUsage, 2))%"
}

Terminal sunucularında oturum yönetimi, sadece teknik bir gereklilik değil, aynı zamanda kurumsal verimliliği, güvenliği ve kullanıcı deneyimini doğrudan etkileyen stratejik bir konudur. Doğru yapılandırılmış oturum yönetimi politikaları ile:

  • Güvenlik riskleri %80 oranında azaltılabilir
  • Sistem performansı %40-60 oranında iyileştirilebilir
  • Lisans maliyetleri %25-30 oranında optimize edilebilir
  • IT destek yükü %50 oranında azaltılabilir

Bu yazıda ele aldığımız yöntem ve araçları kullanarak, terminal sunucu altyapınızı daha güvenli, verimli ve yönetilebilir hale getirebilirsiniz. Unutmayın ki, her organizasyonun kendine özgü ihtiyaçları vardır. Bu nedenle, burada sunulan çözümleri kendi ortamınıza uyarlayarak ve test ederek uygulamanız önemlidir.

Düzenli izleme, proaktif bakım ve sürekli iyileştirme yaklaşımıyla, terminal sunucu altyapınız kurumunuzun uzaktan çalışma ihtiyaçlarını en üst düzeyde karşılayabilecektir.


Bu makale, Windows Server 2019/2022 RDS ortamları için hazırlanmıştır. PowerShell scriptleri test ortamında denenmelidir.