CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

Elastic Stack'te Anomali Tespiti (ML Jobs)

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

Elastic Stack'te Anomali Tespiti (ML Jobs) 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.

Elastic Stack'te Anomali Tespiti (ML Jobs)

Elastic ML single metric job belirli bir alanın istatistiksel anomalilerini otomatik tespit eder. REST API ile job oluşturma ve başlatma: curl -X PUT 'http://localhost:9200/_ml/anomaly_detectors/network_bytes_anomaly'
-H 'Content-Type: application/json' -d ' { "analysis_config": { "bucket_span": "15m", "detectors": [{ "function": "high_sum", "field_name": "network.bytes", "by_field_name": "source.ip", "partition_field_name": "destination.port" }], "influencers": ["source.ip","destination.ip","destination.port"] }, "data_description": { "time_field": "@timestamp" }, "model_plot_config": { "enabled": true, "annotations_enabled": true }, "analysis_limits": { "model_memory_limit": "512mb" } }' curl -X POST 'http://localhost:9200/_ml/anomaly_detectors/network_bytes_anomaly/_open' curl -X POST 'http://localhost:9200/_ml/datafeeds/datafeed-network_bytes_anomaly/_start'

Giris ve Temel Akis

Elastic ML single metric job belirli bir alanın istatistiksel anomalilerini otomatik tespit eder. REST API ile job oluşturma ve başlatma: curl -X PUT 'http://localhost:9200/_ml/anomaly_detectors/network_bytes_anomaly'
-H 'Content-Type: application/json' -d ' { "analysis_config": { "bucket_span": "15m", "detectors": [{ "function": "high_sum", "field_name": "network.bytes", "by_field_name": "source.ip", "partition_field_name": "destination.port" }], "influencers": ["source.ip","destination.ip","destination.port"] }, "data_description": { "time_field": "@timestamp" }, "model_plot_config": { "enabled": true, "annotations_enabled": true }, "analysis_limits": { "model_memory_limit": "512mb" } }' curl -X POST 'http://localhost:9200/_ml/anomaly_detectors/network_bytes_anomaly/_open' curl -X POST 'http://localhost:9200/_ml/datafeeds/datafeed-network_bytes_anomaly/_start'

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

  • PUT /_ml/anomaly_detectors/network_bytes_anomaly ile job tanımı oluştur
  • analysis_config: bucket_span=15m, detectors=[{function:high_sum, field_name:network.bytes, by_field_name:source.ip}]
  • data_description: {time_field:@timestamp} ve analysis_limits: {model_memory_limit:512mb} ekle
  • POST /_ml/anomaly_detectors/network_bytes_anomaly/_open ile job'u aç
  • POST /_ml/datafeeds/datafeed-network_bytes_anomaly/_start ile datafeed başlat
  • GET /_ml/anomaly_detectors/network_bytes_anomaly/_stats ile durumu kontrol et

Temel Kavram Eslesmeleri

Elastic ML detector fonksiyonları farklı anomali tiplerini tespit etmek için tasarlanmıştır. Doğru fonksiyon seçimi tespit kalitesini belirler. Örnek fonksiyon kullanımları: - high_mean: normalden yüksek ortalama değer - rare: beklenmedik nadir değer görünümü - freq_rare: düşük frekanslı kombinasyon - time_of_day: olağandışı saatte aktivite - count: beklenenden fazla olay sayısı

  • high_sum: Normalden yüksek toplam değer — veri sızıntısı
  • rare: Daha önce görülmemiş nadir değer — yeni araç
  • time_of_day: Olağandışı saatte aktivite — off-hours erişim
  • freq_rare: Düşük frekanslı alan kombinasyonu — anormal davranış

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram model_prune_window olarak verilir. Elastic ML multi-metric job birden fazla alanı aynı anda analiz eder. Kullanıcı davranış anomalisi için çok boyutlu model: PUT _ml/anomaly_detectors/ueba_multi_metric { "analysis_config": { "bucket_span": "1h", "detectors": [ { "function": "high_mean", "field_name": "network.bytes", "by_field_name": "user.name" }, { "function": "high_count", "by_field_name": "user.name" }, { "function": "rare", "by_field_name": "user.name", "over_field_name": "source.ip" }, { "function": "time_of_day", "by_field_name": "user.name" }, { "function": "time_of_week", "by_field_name": "user.name" } ], "influencers": ["user.name","source.ip","destination.ip"], "model_prune_window": "30d" }, "data_description": { "time_field": "@timestamp" } } model_prune_window 30 gündür, bu parametre eski kullanıcı profillerini temizler.

Arac, Komut veya Inceleme Akisi

Elastic ML anomali sonuçlarını Python ile sorgulama ve SOAR entegrasyonu için işleme: from elasticsearch import Elasticsearch import pandas as pd from datetime import datetime, timedelta es = Elasticsearch(['https://localhost:9200'], http_auth=('user','pass'), verify_certs=False) query = { "query": { "bool": { "must": [ { "range": { "timestamp": { "gte": "now-24h", "lte": "now" } } }, { "range": { "record_score": { "gte": 75 } } } ], "filter": [ { "term": { "job_id": "ueba_multi_metric" } } ] } }, "sort": [{"record_score": {"order": "desc"}}], "size": 100 } print(df_anomalies[['timestamp','job_id','record_score','by_field_value','influencers']].head(10))

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

  • es = Elasticsearch(['https://localhost:9200'], http_auth=('user','pass'))
  • query = {'query':{'bool':{'must':[{'range':{'timestamp':{'gte':'now-24h'}}},{'range':{'record_score':{'gte':75}}}],'filter':[{'term':{'job_id':'ueba_multi_metric'}}]}},'sort':[{'record_score':{'order':'desc'}}]}
  • results = es.search(index='.ml-anomalies-*', body=query)
  • hits = results['hits']['hits']
  • df_anomalies = pd.DataFrame([h['_source'] for h in hits])
  • print(f'Yüksek skorlu anomali: {len(df_anomalies)}')
  • print(df_anomalies[['timestamp','record_score','by_field_value']].head(10))

Kanit ve Bilesen Iliskileri

Elastic ML anomali skoru yorumlanırken farklı skor seviyeleri farklı aksiyon eşiklerine karşılık gelir. Skor 0-100 arasında olup 100 en kritik anomaliyi temsil eder. Örnek skor yorumlama: - 0-25: düşük, gözlem gerektirmez - 25-50: orta, günlük inceleme listesine ekle - 50-75: yüksek, L2 analistine ilet - 75-100: kritik, anında müdahale gerektirir

  • Skor 0-25: Otomatik kapat, gözlem gerektirmez
  • Skor 25-50: Günlük batch inceleme listesine ekle
  • Skor 50-75: L2 analistine otomatik ticket aç
  • Skor 75-100: SOAR playbook tetikle, anında müdahale

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram skip_result olarak verilir. Elastic ML job'da custom rule tanımlamak bilinen FP kaynaklarını filtreleyerek alert yorgunluğunu azaltır: PUT _ml/anomaly_detectors/network_bytes_anomaly/rules { "rules": [ { "actions": ["skip_result"], "conditions": [ { "applies_to": "actual", "operator": "lt", "value": 1000000 } ], "filter_type": "include", "filter_id": "known_backup_servers" }, { "actions": ["skip_model_update"], "conditions": [ { "applies_to": "typical", "operator": "gt", "value": 500000000 } ] } ] } skip_result sonucu anomali olarak işaretlemez, skip_model_update ise model güncellenmesini engeller.

Operasyonel Dogrulama ve Raporlama

Elastic ML datafeed sorgusu anomali analizini belirli log kaynakları ve filtrelerle sınırlandırır. Yalnızca dış trafik için ML job datafeed konfigürasyonu: { "job_id": "network_bytes_anomaly", "indices": ["logs-network-","filebeat-"], "query": { "bool": { "must": [ { "range": { "network.bytes": { "gt": 0 } } } ], "must_not": [ { "terms": { "destination.ip": ["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"] } }, { "term": { "source.ip": "127.0.0.1" } } ] } }, "scroll_size": 1000, "frequency": "10m", "query_delay": "60s", }

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

  • PUT _ml/datafeeds/datafeed-network_bytes_anomaly
  • "job_id": "network_bytes_anomaly", "indices": ["logs-network-*"]
  • "query": {"bool": {"must": [{"range": {"network.bytes": {"gt": 0}}}], "must_not": [{"terms": {"destination.ip": ["10.0.0.0/8"]}}]}}
  • "scroll_size": 1000, "frequency": "10m", "query_delay": "60s"
  • "chunking_config": {"mode": "auto"}
  • POST _ml/datafeeds/datafeed-network_bytes_anomaly/_start

Cikti ve Kullanım Amaci

Elastic ML job yönetiminde karşılaşılan operasyonel sorunlar SOC tespit kalitesini etkiler. Bu sorunları tanımak ve çözmek L3 analistin temel yetkinliğidir. Örnek sorunlar: - Model memory limit aşımı: job durur, anomali tespiti kesilir - Datafeed lag: son 1 saatin verisi henüz işlenmedi - Concept drift: ağ altyapısı değişti, model eskidi - Bucket span çok kısa: gürültülü sonuçlar, yüksek FP

  • Model memory limit aşımı: analysis_limits arttır veya partition azalt
  • Yüksek FP oranı: Bucket span artır veya custom rule ile FP filtrele
  • Concept drift: Job'u sıfırla ve yeni veriyle yeniden eğit
  • Datafeed lag: query_delay değerini artır, scroll_size optimize et

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram compare olarak verilir. Elastic ML anomali alarmlarını Kibana watcher ile SOAR veya SIEM ticket sistemine otomatik iletme: PUT _watcher/watch/ml_critical_anomaly_alert { "trigger": { "schedule": { "interval": "5m" } }, "input": { "search": { "request": { "indices": [".ml-anomalies-*"], "body": { "query": { "bool": { "must": [ {"range": {"timestamp": {"gte": "now-5m"}}}, {"range": {"record_score": {"gte": 75}}} ] } } } } } }, "condition": { "compare": { "ctx.payload.hits.total.value": { "gt": 0 } } }, "actions": { "send_to_soar": { "webhook": { "method": "POST", "url": "https://soar.example.com/api/alerts", "body": "{"score": {{ctx.payload.hits.hits.0._source.record_score}}}" } } } }

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, Elastic Stack'te Anomali Tespiti (ML Jobs) 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: high_sum, rare, time_of_day, freq_rare, Skor 0-25, Skor 25-50, Skor 50-75, Skor 75-100, Model memory limit aşımı, Yüksek FP oranı. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.