Pazartesi 02:17 — başarılı login, sessiz tehlike
Pazartesi sabahı 02:17'de user: murat.yilmaz için event_type: AUTH_SUCCESS kaydı düşüyor. Active Directory sorunsuz yanıt verdi, Firewall forward etti, VPN tüneli kuruldu. Başarılı giriş. Log analiz platformunda yeşil; saldırı tespiti motoru sessiz. Klasik SIEM kuralları başarısız login sayısını (failed_count > 10) arar — burada fail yok, dolayısıyla alarm yok.
Çarşamba öğleden sonra Finans ekibi Muavin Müdür'ü arıyor: "Murat'ın hesabından beklenmeyen ödeme talimatı geldi, onaylar mısınız?" IT ekibi log'lara bakar: Pazartesi 02:17'deki login İspanya IP'sinden gelmiş, Murat normalde İstanbul ofisten 08:00-18:00 aralığında giriş yapıyordu. Hesap phishing ile ele geçmiş, saldırgan geçerli credential kullandığı için fail event'i oluşturmamış, klasik brute-force kuralları tetiklememiş. Kompromize hesap saldırıları bu yüzden başarılı login olduğu için "invisible" kalır.
ShamashAi Baselines modülü bu senaryoya çözüm sunar: her kullanıcı için son 30 günün login fingerprint'ini öğrenir — hangi saatte, hangi günde, hangi IP/ülke/cihaz kombinasyonundan giriş yapıyor. Login pattern'i dışına çıkan oturum anında event_type: BEHAVIORAL_ANOMALY composite event'i oluşturur, severity=high ile SOAR pipeline'a iletir. Başarılı ama anormal login'i yakalamak, kompromize hesap savunmasının temel taşı.
Davranış baseline'ı — "bu kullanıcı normalde böyle giriş yapmaz"
Klasik kural mantığı statik eşik kullanır: "10 failed login → alert", "şu IP listesinde varsa → block". Baseline mantığı ise dinamik referans noktası oluşturur: her kullanıcının geçmiş davranışını profil olarak saklar, yeni davranışı profille karşılaştırır. Sapma varsa anomali.
ShamashAi dbo.behavior_baselines tablosunda her kullanıcı için şu veriyi tutar:
- hours_bitmap: 24-bit integer, her bit bir saati temsil eder. Kullanıcı o saatte en az bir login yaptıysa bit=1. Örneğin
hours_bitmap=0b000000111111110000000000→ kullanıcı sadece 08:00-15:59 arası login yapıyor. - days_bitmap: 7-bit integer, Pazartesi=bit0, Pazar=bit6.
days_bitmap=0b0011111→ sadece hafta içi login. - top_src_ips: JSON array, en sık kullanılan 5 kaynak IP.
- top_countries: JSON array, en sık login yapılan 3 ülke kodu (GeoIP enrichment sonrası).
- top_devices: JSON array, en sık kullanılan 3 cihaz hostname veya User-Agent hash.
sql -- behavior_baselines tablosunu yeniden kur MERGE INTO dbo.behavior_baselines AS target USING ( SELECT username, -- 24 saatlik bitmap: her saat için OR işlemi SUM(POWER(2, DATEPART(HOUR, event_time))) AS hours_bitmap, -- 7 günlük bitmap: Pazartesi=1, Salı=2, ... SUM(POWER(2, DATEPART(WEEKDAY, event_time) - 1)) AS days_bitmap, -- En sık 5 IP STRING_AGG(src_ip, ',') WITHIN GROUP (ORDER BY ip_count DESC) AS top_src_ips, -- En sık 3 ülke STRING_AGG(geo_country, ',') WITHIN GROUP (ORDER BY country_count DESC) AS top_countries, -- En sık 3 cihaz STRING_AGG(device_name, ',') WITHIN GROUP (ORDER BY device_count DESC) AS top_devices FROM ( SELECT username, event_time, src_ip, geo_country, device_name, COUNT(*) OVER (PARTITION BY username, src_ip) AS ip_count, COUNT(*) OVER (PARTITION BY username, geo_country) AS country_count, COUNT(*) OVER (PARTITION BY username, device_name) AS device_count FROM dbo.events WHERE event_type IN ('AUTH_SUCCESS', 'M365_SIGNIN') AND event_time >= DATEADD(day, -30, GETDATE()) ) sub GROUP BY username ) AS source ON target.username = source.username WHEN MATCHED THEN UPDATE SET target.hours_bitmap = source.hours_bitmap, target.days_bitmap = source.days_bitmap, target.top_src_ips = source.top_src_ips, target.top_countries = source.top_countries, target.top_devices = source.top_devices, target.updated_at = GETDATE() WHEN NOT MATCHED THEN INSERT ( username, hours_bitmap, days_bitmap, top_src_ips, top_countries, top_devices, updated_at ) VALUES ( source.username, source.hours_bitmap, source.days_bitmap, source.top_src_ips, source.top_countries, source.top_devices, GETDATE() );
İşlem süresi: ~50 ms × kullanıcı sayısı. 500 kullanıcılık tenant'ta rebuild ~25 saniye sürer. Manuel rebuild butonu Web UI'da Filter user + Rebuild panelinde; belirli kullanıcı seçilip "Baseline'ı şimdi yeniden kur" basılabilir — örneğin kullanıcı yeni işe başladı veya role değişti, 30 günlük geçmiş yanıltıcı olabilir.
Anomali tipleri ve tetikleyici mantık
Yeni login eventi geldiğinde ShamashAi event pipeline şu kontrolleri yapar:
1. Yeni saat: Login saati hours_bitmap içinde temsil edilen saatlerden değilse → anomali. Örneğin kullanıcı hiç gece 02:00'de login yapmamışsa ve yeni event 02:17'de gelirse anomaly_reason: new_hour. 2. Yeni gün: Login günü days_bitmap içinde yoksa → anomali. Kullanıcı hiç Cumartesi login yapmamışsa ve yeni event Cumartesi gelirse anomaly_reason: new_day. 3. Yeni ülke: geo_country değeri top_countries array'inde yoksa → anomali. Kullanıcı hiç İspanya'dan login yapmamışsa ve yeni event ES gelirse anomaly_reason: new_country. 4. Yeni cihaz: device_name veya User-Agent hash top_devices array'inde yoksa → anomali anomaly_reason: new_device. 5. Yeni IP: src_ip değeri top_src_ips array'inde yoksa → anomali anomaly_reason: new_ip. Bu threshold genelde daha toleranslı; dinamik IP kullanan kullanıcılar için IP havuzu geniş olabilir. ShamashAi konfigürasyonda "Yeni IP anomali sayılsın mı?" toggle'ı var; kapalıysa sadece ülke/saat/gün/cihaz sapmalarına bakar.
Herhangi bir anomaly_reason varsa ShamashAi yeni composite event oluşturur:
{ "event_type": "BEHAVIORAL_ANOMALY", "severity": "high", "username": "murat.yilmaz", "src_ip": "185.220.102.xxx", "geo_country": "ES", "device_name": "unknown-linux-curl", "event_time": "2026-10-21T02:17:33Z", "anomaly_reasons": ["new_hour", "new_country", "new_device"], "baseline_summary": { "expected_hours": "08-18", "expected_days": "Mon-Fri", "expected_countries": ["TR"], "expected_devices": ["murat-laptop", "murat-phone"] }, "parent_event_id": 98234571 }
Bu event dbo.events tablosuna yazılır ve SOAR pipeline tetiklenir. Örnek SOAR action:
javascript // Node.js Fastify route: POST /soar/block fastify.post('/soar/block', async (request, reply) => { const { event_id, username, block_duration_minutes } = request.body; // Active Directory hesabı geçici disable et const adResult = await adClient.disableUser(username, block_duration_minutes); // SOAR aksiyonunu logla await sql.query` INSERT INTO dbo.soar_actions (event_id, action_type, target_user, duration_minutes, result, created_at) VALUES (${event_id}, 'account_block', ${username}, ${block_duration_minutes}, ${adResult.success}, GETDATE()) `; // Incident_groups tablosuna ekle — BEHAVIORAL_ANOMALY eventlerini grupla await sql.query` INSERT INTO dbo.incident_groups (event_id, group_key, severity, created_at) VALUES (${event_id}, ${'behavioral_anomaly_' + username}, 'high', GETDATE()) `; return { success: true, action_id: adResult.action_id }; });
SOAR motoru aynı username için 5 dakika içinde gelen tüm BEHAVIORAL_ANOMALY eventlerini tek incident altında gruplar (dbo.incident_groups tablosu, group_key olarak username kullanır). SOC analisti Web UI'da tek ticket görür, içinde tüm anomali detayları listelenir.
Baseline güncelliği ve "yeni normal" adaptasyonu
Kullanıcı davranışı zamanla değişir: terfi aldı, uzaktan çalışmaya geçti, yeni cihaz aldı. 30 günlük pencere bu değişimi yakalar — ama hemen değil, kademeli olarak. Örnek:
- 1-7. gün: Kullanıcı yeni laptop ile login yapmaya başladı. İlk login'de
new_deviceanomali tetiklenir. SOC analisti inceler, meşru cihaz olduğunu onaylar, anomali kapatılır. - 8-14. gün: Yeni laptop login'leri artık
top_devicesarray'ine girdi (frekans arttı). Artık anomali tetiklenmez. - 15-30. gün: Eski laptop kullanım frekansı düştü,
top_devicesarray'inden çıktı. Artık eski laptop login'denew_deviceanomali tetiklenebilir (frekans düşük olduğu için top-3'e girmiyor).
Manuel müdahale senaryosu: IT Admin, murat.yilmaz kullanıcısının remote çalışmaya kalıcı geçtiğini biliyor. Web UI → Baselines → Filter user: murat.yilmaz → Rebuild butonuna basar. ShamashAi sadece bu kullanıcı için son 30 günü yeniden tarar, baseline'ı günceller. İşlem ~50 ms sürer. Manuel rebuild özellikle role değişimi, yeni işe başlama, uzun tatil dönüşü gibi durumlarda kullanılır.
Compliance ve kanıt zinciri
ISO 27001:2022 Annex A.9.4.1 (Bilgi sistemlerine erişimin kısıtlanması) ve KVKK Madde 12 (Veri güvenliği) uyarınca kuruluşlar hesap güvenliğini kanıtlamak zorunda. Baselines modülü şu evidence'ları sağlar:
- GET /compliance/evidence?username=X&date_range=Y: Belirtilen kullanıcının baseline özeti + anomali geçmişi JSON formatında döner. Örnek response:
{ "username": "murat.yilmaz", "baseline_last_updated": "2026-10-26T02:00:11Z", "expected_hours": [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "expected_days": ["Mon", "Tue", "Wed", "Thu", "Fri"], "expected_countries": ["TR"], "anomaly_count_last_30_days": 2, "anomalies": [ { "event_time": "2026-10-21T02:17:33Z", "reasons": ["new_hour", "new_country"], "soar_action": "account_blocked_15min", "analyst_resolution": "confirmed_compromise" } ] }
- GET /reports/evidence-pack: Tüm kullanıcılar için baseline raporu PDF formatında indirilir. ISO 27001 denetiminde "Hesap anomalilerini nasıl tespit ediyorsunuz?" sorusuna bu rapor sunulur.
dbo.audit_log tablosu her baseline rebuild işlemini kaydeder:
sql SELECT TOP 10 action_type, target_user, performed_by, timestamp FROM dbo.audit_log WHERE action_type = 'baseline_rebuild' ORDER BY timestamp DESC;
Bu log, "Baseline ne zaman güncellendi, kim tetikledi?" sorusuna yanıt verir. Otomatik rebuild'ler performed_by = 'system', manuel rebuild'ler performed_by = 'admin_username' olarak kaydedilir.
AI destekli anomali yorumlama
ShamashAi AI modülü POST /ai/investigate-event endpoint'i ile BEHAVIORAL_ANOMALY eventi bağlam analizi yapar:
javascript // Next.js frontend: Anomali detay sayfasında "AI Yorumla" butonu const handleAIInvestigate = async (eventId) => { const response = await fetch('/api/ai/investigate-event', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ event_id: eventId }) }); const result = await response.json(); // result.summary: "Kullanıcı normalde İstanbul ofisten Pazartesi-Cuma 08:00-18:00 arası login yapar..." setAiSummary(result.summary); };
AI modülü şu verileri analiz eder:
- Kullanıcının son 30 günlük baseline özeti
- Anomali eventinin detayları (saat, ülke, cihaz)
- Aynı kullanıcının son 7 günlük diğer eventleri (başarılı/başarısız login'ler, dosya erişimleri)
- Aynı kaynak IP'nin diğer kullanıcılarda görülüp görülmediği (lateral movement şüphesi)
"murat.yilmaz kullanıcısı son 30 günde sadece İstanbul (TR) lokasyonundan, Pazartesi-Cuma 08:00-18:00 arası, murat-laptop ve murat-phone cihazlarından login yapmıştır. 21 Ekim 02:17'deki login İspanya (ES) lokasyonundan, saat 02:17'de, bilinmeyen Linux cihazından gelmiştir. Aynı kaynak IP (185.220.102.xxx) son 7 günde başka kullanıcıda görülmemiştir. Risk değerlendirmesi: Yüksek — phishing veya credential theft şüphesi. Önerilen aksiyon: Hesabı geçici blokla, kullanıcıyla iletişime geç, şifre sıfırlama zorunlu kıl."
Bu özet SOC analistine 30 saniyelik manuel inceleme yerine 5 saniyelik okuma sunar. AI yorumu dbo.incident_groups tablosuna ai_summary kolonu olarak kaydedilir, raporlarda yer alır.
.NET 8 agent entegrasyonu
ShamashAi agent (C# .NET 8) endpoint cihazlarda çalışır, yerel login eventlerini toplar. Baseline modülü agent'tan şu verileri bekler:
csharp // ShamashAgent.Core/Models/LoginEvent.cs public class LoginEvent { public string Username { get; set; } public DateTime EventTime { get; set; } public string SourceIP { get; set; } public string DeviceName { get; set; } public string UserAgent { get; set; } // RDP/SSH/VPN client bilgisi public bool IsSuccess { get; set; } }
// Agent → API: POST /events/bulk var events = new List<LoginEvent> { /* ... */ }; var json = JsonSerializer.Serialize(events); var response = await httpClient.PostAsync( "https://shamashai.local/api/events/bulk", new StringContent(json, Encoding.UTF8, "application/json") );
Agent her 60 saniyede bir Windows Security Event Log (Event ID 4624, 4625), Linux auth.log, SSH log'larını parse eder, LoginEvent objeleri oluşturur, toplu olarak API'ye gönderir. API bu eventleri dbo.events tablosuna yazar, GeoIP enrichment yapıp geo_country kolonu ekler, ardından baseline kontrolü tetiklenir.
Agent konfigürasyonunda "Baseline gönderimi aktif" toggle'ı var; kapalıysa sadece failed login'ler gönderilir (klasik brute-force tespiti için yeterli), açıksa tüm login'ler gönderilir (baseline için gerekli). 500 cihazlı tenant'ta tüm login gönderimi günlük ~50-100 MB log trafiği oluşturur.
Limitler ve dürüst notlar
- 30 günden eski baseline yok: Kullanıcı 30 günden uzun süre login yapmamışsa baseline boş kalır, ilk login'de anomali tetiklenmez. Bu durum "yeni işe başlayan kullanıcı" ile "6 ay login yapmayan eski hesap" arasında ayrım yapmayı zorlaştırır. Çözüm: IT Admin manuel olarak "Bu hesap yeni, baseline bekleme" işareti koyabilir.
- VPN havuzu IP'leri sorun çıkarabilir: Kurumsal VPN dinamik IP havuzu kullanıyorsa her login farklı IP'den gelir,
top_src_ipsarray'i şişer, "yeni IP" anomali mantığı çalışmaz. Çözüm: VPN subnet'lerini whitelist olarak işaretle, IP anomali kontrolünü bu subnet'ler için atla. - User-Agent parse sınırlı: SSH/RDP login'lerinde User-Agent genelde boş gelir. Agent sadece
device_name(hostname) gönderir. Web/M365 login'lerinde User-Agent zengin, masaüstü login'lerinde yok. Bu durum "yeni cihaz" tespitini web login'lerde güçlü, RDP login'lerde zayıf kılar. - Rol değişimi false positive üretir: Kullanıcı operasyon ekibinden NOC ekibine geçti, artık 7/24 vardiya sistemi var. Eski baseline hafta içi 08-18 saat, yeni davranış gece 22:00-06:00 vardiya. İlk 7-10 gün sürekli anomali tetiklenir. Çözüm: Role değişimi sonrası manuel baseline sıfırlama (Clear + Rebuild) yapılmalı.
- GeoIP hassasiyeti şehir düzeyinde değil: ShamashAi GeoIP enrichment sadece ülke kodu döner. İstanbul-Ankara arası seyahat anomali tetiklemez (ikisi de TR). Şehir bazlı baseline için ShamashAi dokümantasyonu daha fazla bilgi vermiyor; pilot kapsamında detay paylaşılır.
Pilot programı
ShamashAi Baselines modülü 30 günlük pilot kapsamında ücretsiz test edilebilir. Pilot süresince behavior_baselines tablosu canlı ortamınızda kurulur, 30 günlük veri toplandıktan sonra ilk anomali tespitleri başlar. Pilot programı başvurusu: shamashai.com.tr/iletisim
