Problem
Bir Windows Server'a 3 farklı kullanıcı RDP ile bağlanıyordu. Belirli bir tarih aralığında kimin ne kadar bağlı kaldığını ve hangi programları açtığını raporlamak gerekiyordu. Sunucu loglarına erişim vardı ama analiz aracı yoktu.
Windows Event Log Okuma
Python'un win32evtlog kütüphanesiyle Windows Security loglarını okumak mümkün. Admin yetkisi gerekiyor.
import win32evtlog
import win32evtlogutil
from datetime import datetime
def read_security_events(start_date, end_date, event_ids, target_users):
handle = win32evtlog.OpenEventLog(None, "Security")
flags = win32evtlog.EVENTLOG_BACKWARDS_READ | win32evtlog.EVENTLOG_SEQUENTIAL_READ
events = []
while True:
records = win32evtlog.ReadEventLog(handle, flags, 0)
if not records:
break
for event in records:
# Tarih filtresi
ev_time = datetime(*event.TimeGenerated.timetuple()[:6])
if ev_time < start_date:
break # Geriye doğru okuyoruz, daha eskiye gerek yok
if event.EventID in event_ids and ev_time <= end_date:
events.append(parse_event(event, target_users))
win32evtlog.CloseEventLog(handle)
return [e for e in events if e] # None'ları filtrele
Giriş-Çıkış Eşleştirme
Event 4624 = Başarılı giriş, Event 4634/4647 = Çıkış. Her giriş ile bir sonraki çıkışı eşleştirmek için stack yapısı kullandım.
def match_sessions(events):
sessions = []
open_logins = {} # user → [login_time, ...]
for event in sorted(events, key=lambda e: e['time']):
user = event['user']
if event['type'] == 'LOGIN':
if user not in open_logins:
open_logins[user] = []
open_logins[user].append(event['time'])
elif event['type'] == 'LOGOUT':
if user in open_logins and open_logins[user]:
login_time = open_logins[user].pop(0) # FIFO
duration = event['time'] - login_time
sessions.append({
'user': user,
'login': login_time,
'logout': event['time'],
'duration_min': duration.total_seconds() / 60
})
return sessions
Açılan Programları Çekme
Event 4688 = Yeni process başlatıldı, 4689 = Process sonlandı. Bu eventler sadece Audit Process Tracking aktifse kaydediliyor.
# Event 4688: Process oluşturma logunu parse et
def parse_process_event(event):
msg = win32evtlogutil.SafeFormatMessage(event, "Security")
lines = msg.split("\n")
data = {}
for line in lines:
if "New Process Name:" in line:
data['process'] = line.split(":")[-1].strip()
elif "Account Name:" in line and 'user' not in data:
data['user'] = line.split(":")[-1].strip()
elif "Process ID:" in line:
data['pid'] = line.split(":")[-1].strip()
# Sistem processlerini filtrele
skip = ["svchost.exe", "csrss.exe", "lsass.exe", "smss.exe"]
if any(s in data.get('process','') for s in skip):
return None
return data
Excel Çıktısı
openpyxl ile 4 sekmeli Excel dosyası: Özet, Oturum Detayları, RDP Logları ve Program Takibi.
from openpyxl import Workbook
from openpyxl.styles import PatternFill, Font
GREEN = PatternFill(fill_type="solid", fgColor="C6EFCE")
RED = PatternFill(fill_type="solid", fgColor="FFC7CE")
def write_rdp_sheet(wb, events):
ws = wb.create_sheet("RDP LOGLARI")
ws.append(["Zaman", "Kullanıcı", "Olay", "IP"])
for row_idx, ev in enumerate(events, start=2):
ws.append([ev['time'], ev['user'], ev['type'], ev['ip']])
fill = GREEN if ev['type'] == 'LOGIN' else RED
for col in range(1, 5):
ws.cell(row=row_idx, column=col).fill = fill
# Kolon genişlikleri
ws.column_dimensions['A'].width = 20
ws.column_dimensions['B'].width = 18
ws.column_dimensions['C'].width = 12
Security loglarını okumak için uygulamayı Yönetici olarak çalıştır. Audit Process Tracking etkin değilse 4688/4689 eventleri kayıt edilmez — bunu Yerel Güvenlik İlkesi → Gelişmiş Denetim İlkesi'nden aktif edin.