Peer Group Analizi ile İçeriden Tehdit Tespiti
Peer group analizi kullanıcıyı bireysel baseline yerine aynı roldeki çalışanlarla karşılaştırır. Muhasebe departmanından bir kullanıcı geliştirici araçlarına erişiyorsa bu peer anomalisidir: import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.ensemble import IsolationForest user_features = df.groupby(['username','department']).agg( avg_bytes_out=('bytes_out', 'mean'), unique_dst_hosts=('dst_ip', 'nunique'), unique_dst_ports=('dst_port', 'nunique'), off_hours_ratio=('is_off_hours', 'mean'), sensitive_access_count=('is_sensitive', 'sum') ).reset_index() results = [] all_results = pd.concat(results) suspicious = all_results[all_results['peer_anomaly'] == -1] print(suspicious[['username','department','avg_bytes_out','sensitive_access_count']])
Giris ve Temel Akis
Peer group analizi kullanıcıyı bireysel baseline yerine aynı roldeki çalışanlarla karşılaştırır. Muhasebe departmanından bir kullanıcı geliştirici araçlarına erişiyorsa bu peer anomalisidir: import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.ensemble import IsolationForest user_features = df.groupby(['username','department']).agg( avg_bytes_out=('bytes_out', 'mean'), unique_dst_hosts=('dst_ip', 'nunique'), unique_dst_ports=('dst_port', 'nunique'), off_hours_ratio=('is_off_hours', 'mean'), sensitive_access_count=('is_sensitive', 'sum') ).reset_index() results = [] all_results = pd.concat(results) suspicious = all_results[all_results['peer_anomaly'] == -1] print(suspicious[['username','department','avg_bytes_out','sensitive_access_count']])
Bu bölümün pratik akışı şu sırayla ilerler:
- user_features = df.groupby(['username','department']).agg(...).reset_index()
- for dept in user_features['department'].unique():
- group = user_features[user_features['department'] == dept].copy()
- X = group.drop(['username','department'], axis=1)
- X_scaled = StandardScaler().fit_transform(X)
- model = IsolationForest(contamination=0.05, random_state=42)
- group['peer_anomaly'] = model.fit_predict(X_scaled)
- results.append(group)
Temel Kavram Eslesmeleri
İçeriden tehdit kategorileri farklı motivasyon ve davranış örüntülerine sahiptir. CERT Insider Threat modelinde üç temel kategori tanımlanır. Örnek davranış örüntüleri: - Sabotaj: kritik sistemlere erişim + silme operasyonları + işten ayrılma öncesi - Veri hırsızlığı: yüksek bytes_out + USB erişimi + rakip şirket araştırması - Fraud: yetki dışı işlem + küçük miktarlar + uzun süre tespit edilmez
- Sabotaj: İşten ayrılma öncesi kritik dosya silme
- Veri hırsızlığı: Yüksek bytes_out ve USB mass storage erişimi
- Fraud: Yetki dışı küçük tutarlı finansal işlemler
- Espionage: Rakip firmaya ait IP ile iletişim ve kaynak kodu erişimi
Ilk Cekirdek Kavram
Bu bölümde öne çıkan çekirdek kavram 90 olarak verilir. İşten ayrılma sinyali içeriden tehdit riskini artıran en güçlü bağlamsal göstergedir. HR sistemi verisiyle güvenlik logları korelasyonu kritik öneme sahiptir: import pandas as pd from datetime import timedelta resignations = pd.read_csv('hr_resignations.csv') resignations['resignation_date'] = pd.to_datetime(resignations['resignation_date']) resignations['risk_window_start'] = resignations['resignation_date'] - timedelta(days=90) df = df.merge(resignations[['username','resignation_date','risk_window_start']], on='username', how='left') df['in_risk_window'] = ( (df['timestamp'] >= df['risk_window_start']) & (df['timestamp'] <= df['resignation_date']) ) risk_users = df[df['in_risk_window'] == True] high_risk = risk_users.groupby('username').agg( total_bytes_out=('bytes_out','sum'), sensitive_access=('is_sensitive','sum'), usb_events=('usb_event','sum') ).reset_index() print(high_risk.sort_values('total_bytes_out', ascending=False))
Arac, Komut veya Inceleme Akisi
Splunk ile peer group analizi ve içeriden tehdit tespiti. Departman bazlı Z-score hesaplama: | stats avg(bytes_out) as user_bytes, dc(dst_ip) as user_hosts, sum(eval(if(is_sensitive=1,1,0))) as sensitive_count, avg(eval(if(hour(_time)<7 OR hour(_time)>20,1,0))) as off_hours by user, department | eventstats avg(user_bytes) as dept_avg_bytes, stdev(user_bytes) as dept_std_bytes, avg(sensitive_count) as dept_avg_sensitive by department | eval peer_z_sensitive=round((sensitive_count-dept_avg_sensitive)/(dept_avg_sensitive*0.3+1),2) | eval insider_risk=if(peer_z_bytes>3 OR peer_z_sensitive>3, "HIGH", if(peer_z_bytes>2,"MEDIUM","LOW")) | table user, department, user_bytes, dept_avg_bytes, peer_z_bytes, insider_risk
Bu bölümün pratik akışı şu sırayla ilerler:
- index=network earliest=-30d
- | stats avg(bytes_out) as user_bytes, dc(dst_ip) as user_hosts by user, department
- | eventstats avg(user_bytes) as dept_avg_bytes, stdev(user_bytes) as dept_std_bytes by department
- | eval peer_z_bytes=round((user_bytes-dept_avg_bytes)/(dept_std_bytes+1),2)
- | eval insider_risk=if(peer_z_bytes>3, "HIGH", if(peer_z_bytes>2,"MEDIUM","LOW"))
- | where insider_risk!="LOW"
- | table user, department, user_bytes, peer_z_bytes, insider_risk
- | sort -peer_z_bytes
Kanit ve Bilesen Iliskileri
İçeriden tehdit tespitinde kullanılan veri kaynakları farklı risk göstergelerine katkı sağlar. Tek kaynak yetersiz kalır, çok kaynaklı korelasyon zorunludur. Örnek çok kaynaklı risk skoru: DLP alert (+30) + USB erişimi (+20) + off_hours_login (+15) + peer_z_bytes>3 (+35) = 100 → kritik
- DLP sistemi: Hassas belge kopyalama ve e-posta ile gönderme
- Print log: Fiziksel belge çıktısı alma anomalisi
- Badge/access log: Yetkisiz fiziksel alana giriş girişimi
- Cloud storage log: Kurumsal verinin kişisel buluta yüklenmesi
Ikincil Odak Noktasi
Bu bölümde öne çıkan çekirdek kavram betweenness olarak verilir. Graf analizi içeriden tehdit tespitinde iletişim ağı anomalilerini ortaya çıkarır. NetworkX ile kullanıcı-kaynak erişim grafiği oluşturma: import networkx as nx import pandas as pd G = nx.DiGraph() for _, row in df.iterrows(): G.add_edge(row['username'], row['resource'], weight=row['access_count'], sensitive=row['is_sensitive']) degree_centrality = nx.degree_centrality(G) betweenness = nx.betweenness_centrality(G) pagerank = nx.pagerank(G) user_scores = pd.DataFrame({ 'username': list(degree_centrality.keys()), 'degree': list(degree_centrality.values()), 'betweenness': list(betweenness.values()), 'pagerank': list(pagerank.values()) }) suspicious = user_scores[user_scores['betweenness'] > user_scores['betweenness'].quantile(0.95)] print(suspicious.sort_values('betweenness', ascending=False))
Operasyonel Dogrulama ve Raporlama
Elastic EQL ile içeriden tehdit çok adımlı davranış zinciri tespiti. İşten ayrılma öncesi veri sızıntısı örüntüsü: [network where network.bytes > 50000000 and destination.geo.country_iso_code != "TR" and not destination.ip == "10.0.0.0/8"] Bu sorgu 7 gün içinde: 10 kez gizli dosya okuma → sıkıştırma aracı çalıştırma → yurt dışına büyük veri transferi zincirini tespit eder.
Bu bölümün pratik akışı şu sırayla ilerler:
- sequence by user.name with maxspan=7d
- [file where file.path like "confidential" and event.action == "read"] with runs=10
- [process where process.name == "7z.exe" or process.name == "winrar.exe"]
- [network where network.bytes > 50000000 and destination.geo.country_iso_code != "TR"]
Cikti ve Kullanım Amaci
İçeriden tehdit programının operasyonel olgunluk seviyeleri SOC ekibinin hangi teknikleri uyguladığını belirler. Örnek olgunluk modeli: - Seviye 1: sadece kural tabanlı alarm, yüksek FP - Seviye 2: baseline + peer group, azalan FP - Seviye 3: ML tabanlı risk skoru + bağlamsal korelasyon - Seviye 4: davranışsal parmak izi + proaktif hunting
- Eşik tabanlı alarm: Seviye 1 — basit kural, yüksek FP oranı
- Peer group Z-score: Seviye 2 — bağlamsal karşılaştırma
- ML risk skoru + HR korelasyonu: Seviye 3 — çok kaynaklı entegrasyon
- Davranışsal parmak izi + proaktif hunting: Seviye 4 — tam olgun program
Son Kavram ve Cikis
Bu bölümde öne çıkan çekirdek kavram hash olarak verilir. İçeriden tehdit soruşturmasında dijital kanıt zinciri (chain of custody) oluşturmak kritik öneme sahiptir. Python ile otomatik soruşturma raporu oluşturma: import pandas as pd from datetime import datetime def generate_insider_report(username, df_events, risk_score): report = { 'case_id': f'IT-{datetime.now().strftime("%Y%m%d%H%M%S")}', 'subject': username, 'risk_score': risk_score, 'generated_at': datetime.now().isoformat(), 'evidence': [] } for _, event in df_events[df_events['username']==username].iterrows(): report['evidence'].append({ 'timestamp': event['timestamp'].isoformat(), 'event_type': event['event_type'], 'resource': event['resource'], 'bytes': event.get('bytes_out', 0), 'hash': hash(str(event.values)) }) return report report = generate_insider_report('jdoe', df_events, risk_score=87) print(f"Case ID: {report['case_id']}") print(f"Kanıt sayısı: {len(report['evidence'])}")
Bu Egitimden Ne Kazanirsiniz?
Bu icerik, Peer Group Analizi ile İçeriden Tehdit Tespiti 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: Sabotaj, Veri hırsızlığı, Fraud, Espionage, DLP sistemi, Print log, Badge/access log, Cloud storage log, Eşik tabanlı alarm, Peer group Z-score. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.