CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

Kullanıcı Baseline Profili Oluşturma

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

Kullanıcı Baseline Profili Oluşturma konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda blog formatinda ogrenin. Temel akis, kavram eslestirmeleri ve analiz mantigi tek bir yapida birlestirildi.

Kullanıcı Baseline Profili Oluşturma

Kullanıcı baseline profili belirli bir zaman dilimindeki normal davranışın istatistiksel özetidir. 30 günlük geçmiş veri üzerinden temel profil oluşturma: import pandas as pd import numpy as np df['timestamp'] = pd.to_datetime(df['timestamp']) baseline = df.groupby('username').agg( mean_bytes_out=('bytes_out', 'mean'), std_bytes_out=('bytes_out', 'std'), mean_login_hour=('hour', 'mean'), std_login_hour=('hour', 'std'), weekend_ratio=('is_weekend', 'mean'), unique_src_ips=('src_ip', 'nunique'), unique_dst_hosts=('dst_ip', 'nunique'), mean_session_dur=('duration', 'mean') ).reset_index()

Giris ve Temel Akis

Kullanıcı baseline profili belirli bir zaman dilimindeki normal davranışın istatistiksel özetidir. 30 günlük geçmiş veri üzerinden temel profil oluşturma: import pandas as pd import numpy as np df['timestamp'] = pd.to_datetime(df['timestamp']) baseline = df.groupby('username').agg( mean_bytes_out=('bytes_out', 'mean'), std_bytes_out=('bytes_out', 'std'), mean_login_hour=('hour', 'mean'), std_login_hour=('hour', 'std'), weekend_ratio=('is_weekend', 'mean'), unique_src_ips=('src_ip', 'nunique'), unique_dst_hosts=('dst_ip', 'nunique'), mean_session_dur=('duration', 'mean') ).reset_index()

Bu bölümün pratik akışı şu sırayla ilerler:

  • df['hour'] = df['timestamp'].dt.hour
  • df['dayofweek'] = df['timestamp'].dt.dayofweek
  • df['is_weekend'] = df['dayofweek'].isin([5,6]).astype(int)
  • baseline = df.groupby('username').agg(mean_bytes_out=('bytes_out','mean'), std_bytes_out=('bytes_out','std')).reset_index()
  • print(baseline.head())

Temel Kavram Eslesmeleri

Baseline profil boyutları kullanıcı davranışının farklı yönlerini yakalar. Her boyut farklı bir tehdit kategorisine karşı görünürlük sağlar. Örnek profil boyutları: - Zaman boyutu: hangi saatlerde aktif, hafta içi/sonu oranı - Ağ boyutu: tipik bytes_out, bağlandığı host sayısı - Kimlik boyutu: kullandığı cihazlar, kaynak IP'ler - Uygulama boyutu: eriştiği servisler, HTTP metodları

  • Zaman boyutu: Mesai saati dışı erişim ve impossible travel
  • Ağ boyutu: Veri sızıntısı ve lateral movement
  • Kimlik boyutu: Hesap ele geçirme ve yeni cihaz kullanımı
  • Uygulama boyutu: Yetkisiz servis erişimi ve privilege abuse

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram cold start olarak verilir. Peer group analizi kullanıcıyı bireysel baseline yerine benzer rolündeki kullanıcılarla karşılaştırır. Yeni çalışanlar veya az veri olan kullanıcılar için cold start problemini çözer: import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans baseline['job_title'] = df.groupby('username')['job_title'].first() peer_groups = baseline.groupby('job_title').agg( peer_mean_bytes=('mean_bytes_out', 'mean'), peer_std_bytes=('mean_bytes_out', 'std'), peer_mean_hosts=('unique_dst_hosts', 'mean') ).reset_index() baseline = baseline.merge(peer_groups, on='job_title') baseline['peer_z_bytes'] = ( (baseline['mean_bytes_out'] - baseline['peer_mean_bytes']) / (baseline['peer_std_bytes'] + 1) ) suspicious_peers = baseline[baseline['peer_z_bytes'].abs() > 3] print(suspicious_peers[['username','job_title','mean_bytes_out','peer_mean_bytes']])

Arac, Komut veya Inceleme Akisi

Splunk ile kullanıcı baseline profili oluşturma ve anlık sapma tespiti. summary index kullanılarak baseline veri verimli depolanır: | stats avg(bytes_out) as baseline_bytes, stdev(bytes_out) as std_bytes, avg(duration) as baseline_dur, dc(dst_ip) as baseline_hosts, avg(eval(if(hour(_time)<7 OR hour(_time)>20,1,0))) as off_hours_ratio by user | join type=left user [ index=network earliest=-1h | stats avg(bytes_out) as current_bytes, dc(dst_ip) as current_hosts by user ] | table user, baseline_bytes, current_bytes, deviation

Bu bölümün pratik akışı şu sırayla ilerler:

  • index=network earliest=-30d
  • | stats avg(bytes_out) as baseline_bytes, stdev(bytes_out) as std_bytes by user
  • | outputlookup user_baseline.csv
  • | inputlookup user_baseline.csv
  • | join type=left user [index=network earliest=-1h | stats avg(bytes_out) as current_bytes by user]
  • | eval deviation=round((current_bytes-baseline_bytes)/(std_bytes+1),2)
  • | where abs(deviation) > 3
  • | sort -deviation

Kanit ve Bilesen Iliskileri

Baseline profil oluşturmada zaman penceresi seçimi kritik bir tasarım kararıdır. Çok kısa pencere gürültülü baseline, çok uzun pencere eski davranışları içerir. Örnek pencere etkileri: - 7 gün: haftalık örüntü yakalanır ama mevsimsel etki yok - 30 gün: aylık döngüler dahil, tatil dönemleri sorun olabilir - 90 gün: mevsimsel baseline, concept drift riski artar - Kayan pencere: her gün güncellenir, adaptif ama hesaplama yoğun

  • 7 günlük pencere: Haftalık çalışma ritmi örüntüsünü hızlı yakalar
  • 30 günlük pencere: Aylık döngü ve haftalık örüntüyü dengeler
  • Kayan pencere: Davranış değişikliğine adaptif güncelleme
  • Exponential smoothing: Yeni gözlemlere ağırlık vererek baseline günceller

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram korelasyon olarak verilir. Çok boyutlu baseline sapma skoru tek bir risk değerine indirgenir. Mahalanobis mesafesi korelasyonlu özellikler için Z-score'dan üstündür: import pandas as pd import numpy as np from scipy.spatial.distance import mahalanobis features = ['bytes_out','duration','unique_hosts','failed_logins'] X_baseline = baseline[features].values cov_matrix = np.cov(X_baseline.T) cov_inv = np.linalg.inv(cov_matrix) mean_vec = X_baseline.mean(axis=0) def mahal_score(row): return mahalanobis(row, mean_vec, cov_inv) current_df[features] = current_df[features].fillna(0) current_df['mahal_dist'] = current_df[features].apply(mahal_score, axis=1) suspicious = current_df[current_df['mahal_dist'] > 3.5] print(suspicious[['username','mahal_dist']].sort_values('mahal_dist', ascending=False))

Operasyonel Dogrulama ve Raporlama

Elastic SIEM'de kullanıcı baseline profili transform API ile oluşturulur ve periyodik olarak güncellenir: PUT _transform/user_baseline_transform { "sync": { "time": { "field": "@timestamp", "delay": "60s" } }, "pivot": { "group_by": { "username": { "terms": { "field": "user.name" } } }, "aggregations": { "avg_bytes": { "avg": { "field": "network.bytes" } }, "unique_hosts": { "cardinality": { "field": "destination.ip" } }, "session_count": { "value_count": { "field": "event.id" } } } } }

Bu bölümün pratik akışı şu sırayla ilerler:

  • "source": { "index": "logs-network-*" }
  • "dest": { "index": "user_baseline" }
  • "frequency": "1h"
  • "pivot": { "group_by": { "username": { "terms": { "field": "user.name" } } } }
  • "aggregations": { "avg_bytes": { "avg": { "field": "network.bytes" } } }
  • "std_bytes": { "extended_stats": { "field": "network.bytes" } }

Cikti ve Kullanım Amaci

Baseline profil yönetiminde karşılaşılan operasyonel zorluklar SOC süreçlerini doğrudan etkiler. Bu zorlukları öngörerek çözüm üretmek L3 analistin sorumluluğundadır. Örnek: Bir çalışan 2 haftalık izinden döndüğünde normal davranışı anomali olarak işaretlenir. Bu vacation effect problemidir ve baseline'ın izin dönemlerini dışarıda bırakması gerekir.

  • Vacation effect: İzin dönemlerini baseline hesabından çıkar
  • Role değişikliği: Yeni role göre baseline'ı sıfırla ve yeniden oluştur
  • Shared account: Hesabı bireysel değil servis hesabı olarak profilini al
  • Mevsimsel örüntü: Yıl bazlı pencere veya seasonality decomposition uygula

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram standart sapma olarak verilir. Baseline kalitesini ölçmek için stability score hesaplanır. Yüksek varyasyonlu baseline güvenilmez anomali tespitine yol açar: import pandas as pd import numpy as np baseline['cv_bytes'] = baseline['std_bytes_out'] / (baseline['mean_bytes_out'] + 1) baseline['cv_hosts'] = baseline['std_hosts'] / (baseline['mean_hosts'] + 1) baseline['baseline_quality'] = pd.cut( baseline['cv_bytes'], bins=[0, 0.3, 0.7, 1.5, float('inf')], labels=['STABLE','MODERATE','UNSTABLE','UNRELIABLE'] ) print(baseline['baseline_quality'].value_counts()) unreliable = baseline[baseline['baseline_quality'] == 'UNRELIABLE'] print(f'Güvenilmez baseline kullanıcı sayısı: {len(unreliable)}') CV (Coefficient of Variation) standart sapmanın ortalamaya oranıdır.

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, Kullanıcı Baseline Profili Oluşturma konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda parcali degil, butunlu bir ogrenme akisina donusturur. Yalnizca kavramlari ezberlemek yerine surec sirasini, bilesenler arasi iliskiyi ve hangi kanitin neden onemli oldugunu kavramayi hedefler.

Ozet

Bu ders kapsaminda one cikan basliklar: Zaman boyutu, Ağ boyutu, Kimlik boyutu, Uygulama boyutu, 7 günlük pencere, 30 günlük pencere, Kayan pencere, Exponential smoothing, Vacation effect, Role değişikliği. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.