CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

Zaman Serisi Analizi — Dönemsel Anomaliler

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

Zaman Serisi Analizi — Dönemsel Anomaliler 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.

Zaman Serisi Analizi — Dönemsel Anomaliler

Zaman serisi analizi güvenlik verisindeki dönemsel örüntüleri ve sapmalarını tespit eder. Pandas ile temel zaman serisi hazırlama ve decomposition: import pandas as pd from statsmodels.tsa.seasonal import seasonal_decompose df['timestamp'] = pd.to_datetime(df['timestamp']) print(f'Trend bileşeni: {result.trend.dropna().mean():.2f}') print(f'Seasonal bileşeni max: {result.seasonal.max():.2f}') print(f'Residual std: {result.resid.dropna().std():.2f}')

Giris ve Temel Akis

Zaman serisi analizi güvenlik verisindeki dönemsel örüntüleri ve sapmalarını tespit eder. Pandas ile temel zaman serisi hazırlama ve decomposition: import pandas as pd from statsmodels.tsa.seasonal import seasonal_decompose df['timestamp'] = pd.to_datetime(df['timestamp']) print(f'Trend bileşeni: {result.trend.dropna().mean():.2f}') print(f'Seasonal bileşeni max: {result.seasonal.max():.2f}') print(f'Residual std: {result.resid.dropna().std():.2f}')

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

  • ts = df.set_index('timestamp').resample('1H')['bytes_out'].sum().fillna(0)
  • result = seasonal_decompose(ts, model='additive', period=24)
  • residual = result.resid.dropna()
  • anomalies = residual[residual.abs() > residual.std() * 3]
  • print(f'Anomali sayısı: {len(anomalies)}')
  • print(anomalies.sort_values(ascending=False).head(10))

Temel Kavram Eslesmeleri

Zaman serisi bileşenlerine ayrıştırma (decomposition) anomali tespitinin temel adımıdır. Her bileşen farklı bir örüntüyü temsil eder. Örnek: Saatlik ağ trafiği incelendiğinde: - Trend: son 30 günde genel trafik artışı - Seasonal: her gün 09:00-17:00 arası yoğun, gece düşük - Residual: trend ve seasonal çıkarıldıktan sonra kalan gürültü - Anomali: residual bileşeninde 3σ üzeri ani sıçramalar

  • Trend: Uzun vadeli artış veya azalış yönü
  • Seasonality: Saatlik veya günlük tekrar eden dönemsel örüntü
  • Residual: Trend ve seasonal çıkarıldıktan sonra kalan sapma
  • Cyclic: Sabit periyot olmayan uzun dönemli dalgalanma

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram robust olarak verilir. STL (Seasonal and Trend decomposition using Loess) klasik decomposition'a göre daha sağlamdır. Aykırı değerlere dayanıklı ve değişen mevsimsellik örüntülerine adapte olur: import pandas as pd from statsmodels.tsa.stl import STL ts = df.set_index('timestamp').resample('1H')['conn_count'].sum().fillna(0) stl = STL(ts, period=24, robust=True) result = stl.fit() residual = result.resid residual_iqr = residual.quantile(0.75) - residual.quantile(0.25) upper = residual.quantile(0.75) + 3 * residual_iqr lower = residual.quantile(0.25) - 3 * residual_iqr anomalies = ts[(residual > upper) | (residual < lower)] print(f'STL anomali sayısı: {len(anomalies)}')

Arac, Komut veya Inceleme Akisi

ARIMA modeli zaman serisi tahmininde kullanılır. Tahmin edilen değerden sapma anomali olarak işaretlenir. SOC'ta ağ trafik anomalisi tespitinde uygulanır: import pandas as pd from statsmodels.tsa.arima.model import ARIMA import numpy as np train = ts[:-24] test = ts[-24:] print(f'ARIMA tahmin hatası (RMSE): {np.sqrt(((test-forecast)**2).mean()):.2f}') print(anomalies)

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

  • model = ARIMA(train, order=(2, 1, 2))
  • fitted = model.fit()
  • forecast = fitted.forecast(steps=24)
  • residuals = test - forecast
  • threshold = residuals.std() * 3
  • anomalies = test[residuals.abs() > threshold]
  • print(f'Anomali sayısı: {len(anomalies)}')

Kanit ve Bilesen Iliskileri

Güvenlik verisinde karşılaşılan dönemsel örüntüler ve bunlara karşı kullanılacak analiz teknikleri farklılaşır. Yanlış teknik seçimi yüksek FP oranına neden olur. Örnek dönemsel örüntüler: - Günlük: iş saati trafiği, sabah authentication spike - Haftalık: Pazartesi yedekleme, Cuma yüksek email - Aylık: maaş günü finansal sistem yükü - Yıllık: vergi sezonu, yıl sonu kapanış operasyonları

  • Günlük döngü: period=24 ile saatlik STL decomposition
  • Haftalık döngü: period=168 ile saatlik veya period=7 ile günlük pencere
  • Ani spike tespiti: Rolling mean + 3σ band veya ARIMA residual
  • Yavaş drift tespiti: Trend bileşeni eğim analizi veya CUSUM

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram add_country_holidays olarak verilir. Facebook Prophet kütüphanesi tatil günleri ve özel etkinlikleri modelleyerek dönemsel anomali tespitini geliştirir. SOC'ta tatil dönemindeki normal trafik düşüşünü anomali olarak işaretlemez: import pandas as pd from prophet import Prophet df_prophet = ts.reset_index() df_prophet.columns = ['ds', 'y'] model = Prophet( yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True, interval_width=0.99 ) model.add_country_holidays(country_name='TR') model.fit(df_prophet) future = model.make_future_dataframe(periods=24, freq='H') forecast = model.predict(future) forecast['anomaly'] = (forecast['yhat'] - df_prophet['y']).abs() > forecast['yhat_upper'] - forecast['yhat'] print(forecast[forecast['anomaly']][['ds','yhat','yhat_lower','yhat_upper']].tail(10))

Operasyonel Dogrulama ve Raporlama

Splunk ile zaman serisi anomali tespiti predict komutu ile yapılır. Gelecek değer tahmin edilerek mevcut değer karşılaştırılır: | predict actual_bytes algorithm=LLP5 future_timespan=24 upper95=upper_bytes lower95=lower_bytes | eval deviation_pct=round( abs(actual_bytes - 'predicted(actual_bytes)') / ('predicted(actual_bytes)' + 1) * 100, 2 ) | table _time, actual_bytes, 'predicted(actual_bytes)', upper_bytes, lower_bytes, deviation_pct

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

  • index=network earliest=-7d
  • | timechart span=1h sum(bytes_out) as actual_bytes
  • | predict actual_bytes algorithm=LLP5 future_timespan=24 upper95=upper_bytes lower95=lower_bytes
  • | eval is_anomaly=if(actual_bytes>upper_bytes OR actual_bytes<lower_bytes, 1, 0)
  • | eval deviation_pct=round(abs(actual_bytes-'predicted(actual_bytes)')/ ('predicted(actual_bytes)'+1)*100,2)
  • | where is_anomaly=1
  • | table _time, actual_bytes, 'predicted(actual_bytes)', deviation_pct
  • | sort -deviation_pct

Cikti ve Kullanım Amaci

CUSUM (Cumulative Sum) algoritması küçük ama sürekli sapmaları tespit etmek için kullanılır. Ani spike yerine yavaş drift anomalilerini yakalar. SOC'ta C2 beaconing ve yavaş veri sızıntısı tespitinde etkilidir. Python uygulaması: from ruptures import Binseg model = Binseg(model='rbf').fit(ts.values.reshape(-1,1)) breakpoints = model.predict(n_bkps=3) print('Değişim noktaları:', breakpoints)

  • CUSUM: Küçük ve sürekli ortalama kaymasını birikimli tespit eder
  • PELT: Çok sayıda değişim noktasını verimli bulur
  • Binary segmentation: Zaman serisini özyinelemeli olarak ikiye böler
  • Bayesian changepoint: Değişim olasılığını posterior dağılımla hesaplar

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram time_of_day olarak verilir. Elastic ML'de zaman serisi anomali tespiti low_mean ve high_mean detector fonksiyonlarıyla yapılır. Mevsimsel örüntü otomatik öğrenilir: PUT _ml/anomaly_detectors/ts_network_anomaly { "analysis_config": { "bucket_span": "1h", "detectors": [ { "function": "high_sum", "field_name": "network.bytes", "by_field_name": "source.ip" }, { "function": "time_of_day", "by_field_name": "source.ip" }, { "function": "time_of_week", "by_field_name": "source.ip" } ], "influencers": ["source.ip", "destination.port"] }, "data_description": { "time_field": "@timestamp" } } time_of_day ve time_of_week detector'ları mevsimsel örüntüyü otomatik öğrenir.

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, Zaman Serisi Analizi — Dönemsel Anomaliler 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: Trend, Seasonality, Residual, Cyclic, Günlük döngü, Haftalık döngü, Ani spike tespiti, Yavaş drift tespiti, CUSUM, PELT. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.