Threat Intelligence Verisiyle ML Modellerini Zenginleştirme
Threat intelligence verisi ML modellerine özellik olarak eklenerek tespit doğruluğu artırılır. VirusTotal ve AbuseIPDB API'leri ile IP ve hash zenginleştirme: import requests import pandas as pd import time VT_API_KEY = 'your_vt_api_key' ABUSEIPDB_KEY = 'your_abuseipdb_key' def enrich_ip_vt(ip): url = f'https://www.virustotal.com/api/v3/ip_addresses/{ip}' headers = {'x-apikey': VT_API_KEY} r = requests.get(url, headers=headers) if r.status_code == 200: data = r.json()['data']['attributes'] return { 'vt_malicious': data['last_analysis_stats']['malicious'], 'vt_suspicious': data['last_analysis_stats']['suspicious'], 'vt_reputation': data.get('reputation', 0), 'as_owner': data.get('as_owner', '') } return {'vt_malicious': 0, 'vt_suspicious': 0, 'vt_reputation': 0, 'as_owner': ''} for ip in df_unique_ips: result = enrich_ip_vt(ip) result['src_ip'] = ip print(df[['src_ip','vt_malicious','vt_reputation']].head())
Giris ve Temel Akis
Threat intelligence verisi ML modellerine özellik olarak eklenerek tespit doğruluğu artırılır. VirusTotal ve AbuseIPDB API'leri ile IP ve hash zenginleştirme: import requests import pandas as pd import time VT_API_KEY = 'your_vt_api_key' ABUSEIPDB_KEY = 'your_abuseipdb_key' def enrich_ip_vt(ip): url = f'https://www.virustotal.com/api/v3/ip_addresses/{ip}' headers = {'x-apikey': VT_API_KEY} r = requests.get(url, headers=headers) if r.status_code == 200: data = r.json()['data']['attributes'] return { 'vt_malicious': data['last_analysis_stats']['malicious'], 'vt_suspicious': data['last_analysis_stats']['suspicious'], 'vt_reputation': data.get('reputation', 0), 'as_owner': data.get('as_owner', '') } return {'vt_malicious': 0, 'vt_suspicious': 0, 'vt_reputation': 0, 'as_owner': ''} for ip in df_unique_ips: result = enrich_ip_vt(ip) result['src_ip'] = ip print(df[['src_ip','vt_malicious','vt_reputation']].head())
Bu bölümün pratik akışı şu sırayla ilerler:
- df_unique_ips = df['src_ip'].unique()
- enrich_results = []
- for ip in df_unique_ips: result = enrich_ip_vt(ip); result['src_ip'] = ip
- enrich_results.append(result)
- time.sleep(0.25)
- df_enriched = pd.DataFrame(enrich_results)
- df = df.merge(df_enriched, on='src_ip', how='left')
- print(f'Zenginleştirilen IP: {len(df_enriched)}')
Temel Kavram Eslesmeleri
Threat intelligence kaynakları ML modeline farklı özellik boyutları katar. Her kaynak farklı bir risk sinyali üretir. Örnek TI zenginleştirme özellikleri: - VirusTotal: vt_malicious_count, vt_reputation_score - AbuseIPDB: abuse_confidence_score, total_reports - Shodan: open_ports_count, is_tor_exit, is_proxy - AlienVault OTX: pulse_count, threat_score - Greynoise: is_scanner, classification, intent
- VirusTotal: Antivirus motor sonuçları ve itibar skoru
- Shodan: Açık port sayısı, servis parmak izi, TOR çıkış noktası
- AbuseIPDB: Kötüye kullanım güven skoru ve rapor sayısı
- Greynoise: Internet tarayıcısı sınıflandırması ve niyet analizi
Ilk Cekirdek Kavram
Bu bölümde öne çıkan çekirdek kavram to_ids olarak verilir. MISP (Malware Information Sharing Platform) tehdit istihbaratını yapılandırılmış formatta depolar ve Python API ile ML pipeline'a entegre edilir: import pymisp import pandas as pd from pymisp import PyMISP misp = PyMISP('https://misp.example.com', 'api_key', ssl=False) def get_misp_score(ioc_value, ioc_type='ip-dst'): results = misp.search( controller='attributes', type_attribute=ioc_type, value=ioc_value, to_ids=True ) if results: events = results.get('Attribute', []) threat_levels = [e.get('Event', {}).get('threat_level_id', 4) for e in events] tags = [t['name'] for e in events for t in e.get('Tag', [])] return { 'misp_hit': 1, 'misp_event_count': len(events), 'min_threat_level': min(threat_levels) if threat_levels else 4, 'misp_tags': ','.join(set(tags)) } return {'misp_hit': 0, 'misp_event_count': 0, 'min_threat_level': 4, 'misp_tags': ''} df['misp_features'] = df['src_ip'].apply(lambda ip: get_misp_score(ip)) df = pd.concat([df, df['misp_features'].apply(pd.Series)], axis=1) df.drop('misp_features', axis=1, inplace=True)
Arac, Komut veya Inceleme Akisi
TI zenginleştirmesi yapılmış veri üzerinde XGBoost modelini eğitme ve SHAP ile özellik önemini analiz etme: import pandas as pd import xgboost as xgb import shap from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report features = [ 'bytes_out','duration','unique_ports','failed_logins', 'vt_malicious','vt_reputation','abuse_confidence_score', 'shodan_open_ports','is_tor_exit','greynoise_is_scanner', 'misp_hit','misp_event_count','min_threat_level' ] y = df['label'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42) neg = (y_train==0).sum() pos = (y_train==1).sum() model = xgb.XGBClassifier( scale_pos_weight=neg/pos, n_estimators=200, max_depth=6, learning_rate=0.05, random_state=42 ) shap.summary_plot(shap_values, X_test, feature_names=features, show=False)
Bu bölümün pratik akışı şu sırayla ilerler:
- X = df[features].fillna(0)
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
- neg=(y_train==0).sum(); pos=(y_train==1).sum()
- model = xgb.XGBClassifier(scale_pos_weight=neg/pos, n_estimators=200)
- model.fit(X_train, y_train)
- print(classification_report(y_test, model.predict(X_test)))
- explainer = shap.TreeExplainer(model)
- shap_values = explainer.shap_values(X_test)
Kanit ve Bilesen Iliskileri
TI zenginleştirmesinin ML modeli üzerindeki etkisi ölçülmeli ve doğrulanmalıdır. Zenginleştirme her zaman performans artışı sağlamayabilir. Örnek ablation study: - Baseline (sadece ağ özellikleri): F1=0.78 - + VirusTotal: F1=0.84 - + AbuseIPDB: F1=0.86 - + MISP: F1=0.89 - + Shodan: F1=0.88 (düşüş — gürültü ekledi) - + Greynoise: F1=0.91
- vt_malicious_count > 5: Yüksek kesinlik sinyali, precision artırır
- greynoise_is_scanner: FP azaltır — meşru tarayıcıları eleme
- misp_hit = 1: Bilinen tehdit aktörü IOC, recall artırır
- abuse_confidence_score: Sürekli değerli özellik, model kalibrasyonunu iyileştirir
Ikincil Odak Noktasi
Bu bölümde öne çıkan çekirdek kavram setex olarak verilir. TI verisi gerçek zamanlı zenginleştirme için önbellekleme (caching) kritiktir. Her API çağrısı maliyetli ve rate-limited olduğundan Redis ile TTL tabanlı cache: import redis import json import requests import hashlib r = redis.Redis(host='localhost', port=6379, db=0) def get_vt_with_cache(ip, ttl_seconds=86400): cache_key = f'vt:ip:{hashlib.md5(ip.encode()).hexdigest()}' cached = r.get(cache_key) if cached: return json.loads(cached) result = enrich_ip_vt(ip) r.setex(cache_key, ttl_seconds, json.dumps(result)) return result for ip in df['src_ip'].unique(): features = get_vt_with_cache(ip) print(f'{ip}: vt_malicious={features["vt_malicious"]}') print(f'Cache hit oranı: {r.info()["keyspace_hits"] / (r.info()["keyspace_hits"] + r.info()["keyspace_misses"]):.1%}')
Operasyonel Dogrulama ve Raporlama
Splunk ile threat intelligence zenginleştirmesi. MISP lookup ve VirusTotal özelliklerini SIEM alarmlarına ekleme: | lookup misp_ioc_lookup src_ip AS src_ip OUTPUT misp_hit, threat_level, misp_tags | eval ti_score=( (if(misp_hit=1, 40, 0)) + (if(vt_malicious>5, 30, if(vt_malicious>0, 15, 0))) + (if(abuse_score>75, 20, if(abuse_score>25, 10, 0))) + (if(vt_reputation<-50, 10, 0)) ) | eval risk_level=case( ti_score>=70, "CRITICAL", ti_score>=40, "HIGH", ti_score>=20, "MEDIUM", true(), "LOW" ) | table src_ip, bytes_out, misp_hit, vt_malicious, abuse_score, ti_score, risk_level, misp_tags
Bu bölümün pratik akışı şu sırayla ilerler:
- index=network earliest=-24h
- | lookup misp_ioc_lookup src_ip AS src_ip OUTPUT misp_hit, threat_level
- | lookup vt_ip_lookup src_ip AS src_ip OUTPUT vt_malicious, vt_reputation
- | lookup abuseipdb_lookup src_ip AS src_ip OUTPUT abuse_score, total_reports
- | eval ti_score=((if(misp_hit=1,40,0))+(if(vt_malicious>5,30,if(vt_malicious>0,15,0)))+(if(abuse_score>75,20,0)))
- | eval risk_level=case(ti_score>=70,"CRITICAL",ti_score>=40,"HIGH",true(),"LOW")
- | where risk_level IN ("CRITICAL","HIGH")
- | table src_ip, bytes_out, misp_hit, vt_malicious, abuse_score, ti_score, risk_level
- | sort -ti_score
Cikti ve Kullanım Amaci
TI zenginleştirmesinde karşılaşılan operasyonel zorluklar ML pipeline kalitesini etkiler. Bu zorlukları önceden yönetmek L3 analistin sorumluluğundadır. Örnek zorluklar: - Rate limiting: VirusTotal ücretsiz API 4 istek/dakika ile sınırlı - Stale intel: 6 ay önce kötücül olan IP artık temiz olabilir - False enrichment: paylaşılan NAT IP'si tüm arkadaki kullanıcıları etkiler - Intel overlap: birden fazla kaynak aynı IOC'yi raporlarsa çift sayım
- Rate limiting: Redis cache + batch processing ile API çağrısı azalt
- Stale intel: TTL tabanlı cache ve TI feed'e last_seen filtresi ekle
- Paylaşılan NAT IP: RFC1918 ve bilinen CDN IP'lerini zenginleştirme dışı tut
- Intel overlap: Kaynak ağırlıklandırma ile normalize edilmiş skor hesapla
Son Kavram ve Cikis
Bu bölümde öne çıkan çekirdek kavram vt_enrichment_rate olarak verilir. TI zenginleştirmeli ML modelinin üretim performansını izlemek için model monitoring pipeline kurulur. Zenginleştirme kalitesi düşünce model drift başlar: import pandas as pd import numpy as np from datetime import datetime, timedelta def monitor_ti_enrichment_quality(df_recent): metrics = { 'timestamp': datetime.now().isoformat(), 'total_ips': len(df_recent['src_ip'].unique()), 'vt_enrichment_rate': df_recent['vt_malicious'].notna().mean(), 'misp_hit_rate': df_recent['misp_hit'].mean(), 'avg_ti_score': df_recent['ti_score'].mean(), 'high_risk_pct': (df_recent['risk_level']=='CRITICAL').mean(), 'cache_hit_rate': df_recent['from_cache'].mean() } if metrics['vt_enrichment_rate'] < 0.8: print('UYARI: VT zenginleştirme oranı düşük — API sorunu olabilir') if metrics['avg_ti_score'] < 5: print('UYARI: Ortalama TI skoru anormal düşük — feed kalitesi kontrol et') return pd.DataFrame([metrics]) daily_report = monitor_ti_enrichment_quality(df_last_24h) print(daily_report.T)
Bu Egitimden Ne Kazanirsiniz?
Bu icerik, Threat Intelligence Verisiyle ML Modellerini Zenginleştirme 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: VirusTotal, Shodan, AbuseIPDB, Greynoise, vt_malicious_count > 5, greynoise_is_scanner, misp_hit = 1, abuse_confidence_score, Rate limiting, Stale intel. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.