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.