異常検知の方法(時系列編)
異常検知のソリューション
SIEM(Security Information and Event Management)やUEBA(User behavior analytics)などにより、脅威を早期に発見できる、という話を聞く。
IAM(Identity and Access Management)なども賢いものだと、異常なログインと判断して、追加の認証を求めたりするものもある。
裏側では、従来の統計的な手法や機械学習を用いたものがある、と想像できる。
いろんなログデータから異常を見出す方法は、セキュリティに有益なので、その具体的な方法を見ていく。
異常の発見方法
そもそも異常とは?
一般的には以下の3つに分類される。
-
点(ポイント/グローバル)異常:他からあまりにもかけ離れた単一のデータを指します。
-
文脈(コンテキスト)異常:あるデータセットのコンテキストでは異常であり、別のデータセットのコンテキストでは正常である異常を指します。時系列データのコンテキスト上の異常の中で最も一般的なタイプです。
-
集合的異常:データのサブセット全体が、より広範なデータセットと比較して異常である場合です。集合的異常を特定する際、個々のデータポイントは考慮されません。
引用:https://www.servicenow.com/jp/products/it-operations-management/what-is-anomaly-detection.html
ここでは、一番シンプルな点異常について、時系列データを使用して、検知する方法を見ていく。
時系列分析
時間の経過に沿って観測・記録されたデータは時系列データ、と呼ばれる。
時系列データのもつ傾向を分析する手法が時系列分析となる。
その傾向の基本的な変動要因が4つある。
- 傾向変動(T : Trend)
- 循環変動(C : Cycle)
- 季節変動(S : Seasonal)
- 不規則変動(I : Iregular or Noise)
これらの4つの要因の組み合わせに、2つのモデルがある。
- 加法モデル:T + C + S + I
- 乗法モデル:T x C x S x I
これにより、未来の予測やモデルに当てはまらないものを異常値と判断する根拠にする。
Windowsドメインへのログイン異常検知
Windowsのドメインコントローラーでのログインログから異常値を検出する具体例が以下にある。
この中で、Anomaly detection and visualization using Time Series Decomposition として、サンプルデータとともに、Pythonのコードが紹介されている。
ステップとしては、以下の通り。
1.日付毎のログイン数を集計する。
2.STLによる時系列分析を実施
ここでは、
def tsa_using_stl(data,score_threshold):
という独自関数で定義している。別の方法として、
from msticpy.analysis.timeseries import timeseries_anomalies_stl
STL_df= timeseries_anomalies_stl(timeseriesdemo_agg, seasonal=31)
とすることで同等の結果が得られる。
裏では、STL分解(Seasonal Decomposition Of Time Series By Loess)を実施。
LOESS平滑化(locally estimated scatterplot smoothing)というノンパラメトリック回帰モデルを利用している、らしい。
元データ = トレンド + 季節性 + 残差
3.描画
timeseries_anomalies_plot = display_timeseries_anomolies(data=STL_df, y="TotalLogons",time_column='Date')
として、異常を表示するグラフの出来上がり。
まとめ
ログオンのログが周期性がある、という前提でその周期性からはみ出すログを抽出した。ここまでやらなくても、普通に集計しても分かりそうなもの。
点異常だけでなく文脈異常についての実現方法が気になってくる。