Sunucu yönetimi sadece servislerin ayakta kalmasını sağlamak değil, aynı zamanda sistemin "kim tarafından, ne zaman ve nasıl" kullanıldığını takip etmektir. Özellikle çok kullanıcılı Windows Sunucu ortamlarında veya uzak masaüstü (RDP) trafiğinin yoğun olduğu yapılarda, oturum izleme operasyonel güvenliğin temel taşıdır.
Bu yazımızda, Windows sunucularınızda kullanıcı girişlerini analiz etmek için kullanabileceğiniz profesyonel yöntemleri ele alıyoruz.
1. Event Viewer: Sistem Günlüklerinin "Kara Kutusu"
Windows tabanlı sistemlerde gerçekleşen her başarılı veya başarısız giriş denemesi, Güvenlik (Security) günlüklerine kaydedilir. Bir siber güvenlik analizi veya denetim sırasında bakmanız gereken ilk yer burasıdır.
-
Yol:
Event Viewer > Windows Logs > Security -
Filtreleme: Sağ paneldeki "Filter Current Log" seçeneğine tıklayarak Event ID: 4624 (Success Logon) kodunu aratın.
Kritik İpucu: Logon Type Parametresi
ID 4624 tek başına yeterli değildir. Detaylar kısmındaki "Logon Type" verisi, girişin türünü söyler:
-
Type 2: Fiziksel klavye ve monitör başındaki giriş.
-
Type 3: Ağ üzerinden (dosya paylaşımı gibi) erişim.
-
Type 10: En kritik olanıdır; Uzak Masaüstü (RDP) bağlantısını temsil eder.
2. PowerShell ile Hızlı Raporlama
Arayüz içinde kaybolmak yerine, PowerShell'in gücünü kullanarak son giriş yapan kullanıcıları saniyeler içinde listeleyebilirsiniz. Aşağıdaki komut, sunucuya en son giriş yapan 5 başarılı oturum açma işlemini kullanıcı adı ve zaman damgasıyla getirir:
Get-EventLog -LogName Security -InstanceId 4624 -Newest 5 |
Select-Object TimeGenerated, @{Name="User"; Expression={$_.ReplacementStrings[5]}}
Bu yöntem, özellikle rutin kontroller sırasında zaman kazanmanızı sağlar.
3. "quser" Komutu: Anlık Durum Analizi
Sunucunuzun performansında bir yavaşlama hissettiğinizde veya "Uzak masaüstü kullanıcı sınırına ulaşıldı" hatası aldığınızda, o an kimlerin sistemde olduğunu bilmeniz gerekir.
Terminali (CMD veya PowerShell) açın ve sadece quser yazın. Bu komut size şu bilgileri verir:
-
Aktif kullanıcı adları.
-
Oturumun durumu (Active / Disconnected).
-
Oturumun başlangıç saati.
Eğer bir kullanıcı oturumunu kapatmak yerine sadece pencereyi çarptıysa, oturumu "Disconnected" olarak göreceksiniz. Bu durum gereksiz kaynak tüketimine neden olabilir.
4. Kayıt Defteri (Registry) Üzerinden Son Kullanıcı Kontrolü
Sunucuda en son hangi kullanıcının işlem yaptığını hızlıca görmek için Registry kayıtlarına da göz atabilirsiniz:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI
Buradaki LastLoggedOnUser anahtarı, sistemin hafızasındaki son kullanıcı bilgisini statik olarak tutar.
blog yazısında bahsettiğim yöntemleri (Event Viewer analizi, aktif kullanıcı sorgulama ve son giriş yapan kullanıcıyı görme) tek bir arayüzde birleştiren, kullanımı kolay bir PowerShell GUI hazırladım.
Bu araç; RDP girişlerini (Logon Type 10), fiziksel girişleri ve anlık aktif kullanıcıları tek tıkla listeler.
PowerShell GUI Kodu
Aşağıdaki kodu bir .ps1 dosyası olarak kaydedip (örneğin: OturumIzleme.ps1) sağ tıklayıp "PowerShell ile Çalıştır" diyebilirsiniz:
# Gerekli kütüphaneleri yükle
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
# Ana Form Ayarları
$form = New-Object System.Windows.Forms.Form
$form.Text = "Ondernet - Windows Oturum İzleme Paneli"
$form.Size = New-Object System.Drawing.Size(850, 650)
$form.StartPosition = "CenterScreen"
$form.BackColor = "#F8F9FA"
$form.F System.Drawing.Font("Segoe UI", 9)
# Başlık Etiketi
$label = New-Object System.Windows.Forms.Label
$label.Text = "Sunucu Erişim ve Güvenlik Analizi"
$label.Location = New-Object System.Drawing.Point(20, 15)
$label.Size = New-Object System.Drawing.Size(400, 30)
$label.F System.Drawing.Font("Segoe UI", 16, [System.Drawing.FontStyle]::Bold)
$label.ForeColor = "#212529"
$form.Controls.Add($label)
# Veri Tablosu (DataGridView)
$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Location = New-Object System.Drawing.Point(20, 110)
$dataGridView.Size = New-Object System.Drawing.Size(790, 430)
$dataGridView.AutoSizeColumnsMode = "Fill"
$dataGridView.BackgroundColor = "White"
$dataGridView.Border
$dataGridView.RowHeadersVisible = $false
$dataGridView.Read
$dataGridView.Selecti
$dataGridView.AlternatingRowsDefaultCellStyle.BackColor = "#F2F2F2"
$form.Controls.Add($dataGridView)
# Fonksiyon: Veriyi Grid'e Güvenli Basma
function Update-Grid {
param($DataList)
$arrayList = New-Object System.Collections.ArrayList
if ($DataList) {
$arrayList.AddRange($DataList)
}
$dataGridView.DataSource = $arrayList
}
# 1. Buton: Aktif Kullanıcılar (quser)
$btnQuser = New-Object System.Windows.Forms.Button
$btnQuser.Text = "Anlık Aktif Kullanıcılar"
$btnQuser.Location = New-Object System.Drawing.Point(20, 60)
$btnQuser.Size = New-Object System.Drawing.Size(250, 40)
$btnQuser.BackColor = "#0078D7"
$btnQuser.ForeColor = "White"
$btnQuser.Flat
$btnQuser.Cursor = [System.Windows.Forms.Cursors]::Hand
$btnQuser.Add_Click({
# quser çıktısını güvenli bir şekilde diziye al (tek sonuç olsa bile)
$rawOutput = @(quser 2>$null)
if ($rawOutput.Count -gt 0) {
$data = @($rawOutput | Select-Object -Skip 1 | ForEach-Object {
# Boşluklara göre böl ve temizle
$line = $_.Trim() -split '\s{2,}'
[PSCustomObject]@{
Kullanici = $line[0].Replace(">","") # Aktif kullanıcı imlecini temizle
Oturum_Adi = if($line[1] -match '^\d+$') { "RDP/None" } else { $line[1] }
ID = if($line[1] -match '^\d+$') { $line[1] } else { $line[2] }
Durum = if($line[1] -match '^\d+$') { $line[2] } else { $line[3] }
Giris_Zamani = if($line[1] -match '^\d+$') { $line[4] } else { $line[5] }
}
})
Update-Grid -DataList $data
} else {
[System.Windows.Forms.MessageBox]::Show("Aktif oturum bulunamadı veya yetki yetersiz.", "Bilgi")
}
})
$form.Controls.Add($btnQuser)
# 2. Buton: Son 15 Başarılı Giriş (Event Log)
$btnLogon = New-Object System.Windows.Forms.Button
$btnLogon.Text = "Son 15 Başarılı Giriş (Event Log)"
$btnLogon.Location = New-Object System.Drawing.Point(285, 60)
$btnLogon.Size = New-Object System.Drawing.Size(250, 40)
$btnLogon.BackColor = "#28A745"
$btnLogon.ForeColor = "White"
$btnLogon.Flat
$btnLogon.Cursor = [System.Windows.Forms.Cursors]::Hand
$btnLogon.Add_Click({
try {
$events = @(Get-WinEvent -FilterHashtable @{LogName='Security';ID=4624} -MaxEvents 15 -ErrorAction SilentlyContinue | ForEach-Object {
[PSCustomObject]@{
Tarih_Saat = $_.TimeCreated
Kullanici = $_.Properties[5].Value
Log # Tip 10: RDP, Tip 2: Yerel
Kaynak_IP = $_.Properties[18].Value
}
})
Update-Grid -DataList $events
} catch {
[System.Windows.Forms.MessageBox]::Show("Olay günlükleri okunurken hata oluştu. Yönetici olarak çalıştırdığınızdan emin olun.", "Hata")
}
})
$form.Controls.Add($btnLogon)
# 3. Buton: Registry Son Kullanıcı Bilgisi
$btnReg = New-Object System.Windows.Forms.Button
$btnReg.Text = "Kayıt Defteri (Son Kayıt)"
$btnReg.Location = New-Object System.Drawing.Point(550, 60)
$btnReg.Size = New-Object System.Drawing.Size(250, 40)
$btnReg.BackColor = "#6C757D"
$btnReg.ForeColor = "White"
$btnReg.Flat
$btnReg.Cursor = [System.Windows.Forms.Cursors]::Hand
$btnReg.Add_Click({
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
$lastUser = (Get-ItemProperty -Path $regPath -ErrorAction SilentlyContinue).LastLoggedOnUser
if ($lastUser) {
[System.Windows.Forms.MessageBox]::Show("Windows Kayıt Defterine Göre Son Giriş Yapan:`n`n$lastUser", "Registry Bilgisi")
} else {
[System.Windows.Forms.MessageBox]::Show("Bilgi alınamadı.", "Hata")
}
})
$form.Controls.Add($btnReg)
# Alt Bilgi (Footer)
$footer = New-Object System.Windows.Forms.Label
$footer.Text = "© 2024 Ondernet.net - Sunucu Güvenlik Analiz Aracı"
$footer.Location = New-Object System.Drawing.Point(20, 560)
$footer.Size = New-Object System.Drawing.Size(500, 20)
$footer.ForeColor = "Gray"
$form.Controls.Add($footer)
# Formu Göster
[void]$form.ShowDialog()
Araç Neleri Kapsıyor?
-
Anlık Aktif Kullanıcılar (quser): Sunucuda o anda "Active" veya "Disconnected" durumda olan tüm kullanıcıları, oturum ID'leri ve giriş saatleriyle birlikte tabloya döker.
-
Son 10 Giriş (Event ID 4624): Güvenlik günlüklerini tarar. Kullanıcı adının yanı sıra, blog yazısında kritik olduğu belirtilen Logon Type ve Kaynak IP bilgilerini gösterir (Örn: Type 10 görüyorsanız RDP ile giriştir).
-
Registry Bilgisi: Windows'un kayıt defterinde tuttuğu "son giriş yapan kullanıcı" bilgisini küçük bir pop-up mesajı olarak ekrana getirir.
Çalıştırmadan Önce Notlar:
-
Yönetici Yetkisi:
Securityloglarını okumak vequserkomutunu çalıştırmak için PowerShell'i Yönetici Olarak Çalıştır seçeneğiyle açmalısınız. -
Execution Policy: Eğer script çalışmazsa, terminale
Set-ExecutionPolicy RemoteSigned -Scope CurrentUserkomutunu yazarak izin verebilirsiniz.
Ondernet Önerisi: Neden İzleme Yapmalısınız?
Sistem güvenliği sadece dışarıdan gelen saldırılara karşı barikat kurmak değildir. İçerideki hareketliliği izlemek, yetkisiz erişimleri erkenden tespit etmenize ve olası bir hata durumunda "sorumlu hesabı" hızlıca bulmanıza olanak tanır.
Sunucu güvenliğinizi bir üst seviyeye taşımak mı istiyorsunuz? Yüksek performanslı ve güvenli Windows VDS çözümlerimizle tanışmak için Ondernet.net adresini ziyaret edebilir, uzman ekibimizden destek alabilirsiniz.
Bu yazı, sistem yöneticilerinin günlük operasyonlarını kolaylaştırmak ve güvenlik farkındalığını artırmak amacıyla hazırlanmıştır.