dfirr

A Note on R How-to in Cybersecurity Investigation

アドホックなログをSplunkに転送する

情報セキュリティ関連業務にはログ分析が付き物であるものの、当該ログが最初からログ基盤に入っているとはかぎりません。システム担当者からログを圧縮ファイルとして受け取ることも多々あります。

そのログをいきなりRで読むのも一興ですが、一度Splunkに取り込ませることも有力です。というのは、フィールド名の正規化や情報付与にはSplunkを使うほうが簡単だからです。

ただ、Splunk GUI画面でのログ入力は、最大500MBを1ファイルずつしかアップロードできないので、使い勝手がよくありません。かわりに利用可能なのが、HEC(HTTP Event Collector)REST APIです。

この記事では、httr2パッケージを使ってHECにアクセスする手法を解説します。ログファイルのアドホックな転送がHeavy Forwarderなどを要さずに実現できるので、なかなか便利なものです。

RPubs「アドホックなログをSplunkに転送する

MSTICPyでSplunkからデータを取り込む

SplunkにはRest APIがあるので、RからAPIを叩いてデータを取得することができます。しかしRate Limitなど、考慮しなくてはいけない事項があります。SplunkにはPython SDKがありますがR用のSDKはないので、このあたりを手作業で解決しなければいけません。面倒です。

そこで、MSTICPyをデータ取り込み機として使うことを考えます。MSTICPyはMicrosoftによる情報セキュリティ実務家向けJupyter Notebookの拡張版みたいな存在ですが、Microsoft SentinelやSplunkにクエリを投げてPandasデータフレームに変換する機能を持っています。ここに便乗するのです。

このためには、RからPythonオブジェクトが透過的に扱えるReticulateパッケージを使います。キワモノっぽく感じるかもしれませんが、TensorFlow for Rでも使われている手法で、Posit社によって積極的に維持されています。

RPubs「MSTICPyでSplunkからデータを取り込む

フィッシングサイトの週次集計グラフを作る

今回は、特定の技法にテーマを絞っていない番外編です。2023年7月15日にISACA名古屋支部のSR分科会にお邪魔したので、そのとき出題されたお題をRで解いた例を示します。tidyverseの特徴が出やすい問題だったからです。

お題は、JPCERT/CCのフィッシングサイトURLリスト(2022年度)から、上位30事業者(残りはOtherとして集計)の週次のグラフを作る――というものでした。線を31本描くと少し見づらいので、ここでは上位5事業者に改変しています。

RPubs「フィッシングサイトの週次集計グラフを作る」

複数データフレームから指定列の星取表を作る

複数のログを分析しているとき、特定のフィールド(たとえばIPアドレス)がどのログに出現しているのかを一覧したいことがあります。簡単な例を作ると、

logA <- tibble(src_ip = c("192.168.1.3", "192.168.1.1", "192.168.1.2"))
logB <- tibble(src_ip = c("192.168.1.5", "192.168.1.3", "192.168.1.4", "192.168.1.5"))
logC <- tibble(src_ip = c("192.168.1.2", "192.168.1.5", "192.168.1.6"))

というデータフレーム群があったとき、

## # A tibble: 6 × 4
##   src_ip      logA  logB  logC 
##   <chr>       <lgl> <lgl> <lgl>
## 1 192.168.1.1 TRUE  FALSE FALSE
## 2 192.168.1.2 TRUE  FALSE TRUE 
## 3 192.168.1.3 TRUE  TRUE  FALSE
## 4 192.168.1.4 FALSE TRUE  FALSE
## 5 192.168.1.5 FALSE TRUE  TRUE 
## 6 192.168.1.6 FALSE FALSE TRUE

のような結果を得たいとします。今回は、このための関数づくりを通して、curly-curlyを使う技法を紹介します。

RPubs「複数データフレームから指定列の星取表を作る」

特定の文字の前後を抜き出す

「April 29, 2023 | 8:45 AM - 9:30 AM」から日付部分や時刻部分を抜き出すような処理は、よくあります。こういう場合、直接的にはstr_extract()関数に正規表現の前後読みを組み合わせることが考えられます。しかし、str_split_i()関数を使えば、もう少し簡単かつ統一的な表現が可能です。

RPubs「特定の文字の前後を抜き出す」

イベントを時系列に変換して視覚化する

イベント(点過程)データであるログを日次・週次・月次などで集計して時系列データとし、これを視覚化することは、情報セキュリティ管理業務(だけでなく管理業務一般かもしれませんが)で日常的に発生します。

この投稿記事では、そうした際のggplot2での慣用表現を取り上げました。ggplot2はデフォルトでも奇麗なグラフを描いてくれますが、「よそ行き」にするためには体裁を整えてやる必要があります。

RPubs「イベントを時系列に変換して視覚化する」

SSL/TLSが復号されるネットワーク環境でのWindows版Rの設定

Windows版R 4.2から、dwonload.file()で使われるライブラリが、従来のwininetからlibcurlに変更されました。結果、UTMなどでSSL/TLSが復号される環境にあると、証明書エラーが発生します。libcurlはWindowsの証明書ストアを使用しないため、企業のIT部門がグループポリシーで展開しているであろう独自のルート証明書を認識しないからです。

この問題のワークアラウンドとして、R_LIBCURL_SSL_REVOKE_BEST_EFFORTという環境変数が提供されています。有効化するには、.Renvironに、

R_LIBCURL_SSL_REVOKE_BEST_EFFORT=TRUE

と記載してください。(curl -kと同じく検証を飛ばしているだけのように見えますが、調べていません。)ユーザーレベルの.Renvironのパスは、環境変数HOMEが設定されていればその場所、なければ%userprifile%Documentsです。