dfirr

A Note on R How-to in Cybersecurity Investigation

esquisseでApacheログを概観する

むかし計量経済学を学習していたころに最初に教わった事柄の1つに、データを概観することの重要性があります。いきなり回帰を試すのではなく、まずプロットしてみること。それだけで何か得るものがあるかもしれないし、外れ値などデータの異常に気づくかもしれない。

DFIRの現場でも、ログを入手したら、まず概要を把握することが大切です。そして、可視化は概要把握の有力な手段です。

私はこの目的でesquisseというパッケージを使っています。このパッケージはRStudioのAddinになっていて、GUI操作で可視化を実現してくれるものです。

材料としては、「SecRepo」に掲載されているApacheのCombinedログを使用します。

準備

パッケージをインストールする

esquisseはCRANに登録されているので、

install.packages("esquisse")

でインストール可能です。

サンプルデータを読み込む

Apache Combinedログをパースするための関数を作り、取り込みます。webreadrパッケージを使ってもかまいません。tidyverseに収録されているreadrパッケージは、読み込み先がファイルでもURLでもよく、圧縮ファイルにも対応しています。今回は、適当に9月28日のアクセスログを取得することにしました。

library(tidyverse)

read_combined <- function(file) {
  names <- c("ip_address", "remote_user_ident", "local_user_ident", "timestamp", 
             "request", "status_code", "bytes_sent", "referer", "user_agent")
  col_types <- list(col_character(), col_character(), col_character(), 
                    col_datetime("%d/%b/%Y:%H:%M:%S %z"), col_character(), 
                    col_character(), col_integer(), col_character(), col_character())
  data <- read_log(file = file, col_names = names, col_types = col_types)
  return(data)
}

x1 <- read_combined("https://www.secrepo.com/self.logs/access.log.2020-09-28.gz")

esquisseを起動する

esquisseの起動は、以下のようにします。(ToolsメニューのAddinsから行うこともできます。)

esquisse::esquisser(x1)

使ってみる

esquisseを起動すると、画面写真のようなウインドウが表示されます。ウインドウタイトルにある「きみがバラのために費やした時間こそが、そのバラを大切なものにしている」とは、『星の王子さま』でのキツネの有名なセリフ「大切なものは目には見えない」につづく言葉。可視化ツールで引用しますか、そこ……。

f:id:dfirr:20201223073320p:plain

気を取り直してパレットの上段を見ると、各変数が型で色分けされていることがわかります。この変数を下段の小部屋にドラッグして放り込むことで、変数の型に応じて適当にグラフを作ってくれます。

まずはtimestampをX軸にとり、ついでにstatus_codeで色分け(fill)します。1変数グラフなので、自動的にカウントが選択されます。

f:id:dfirr:20201223075230p:plain

次に、今回のログで唯一の数値型であるbytes_sentをY軸にとってみます。いくつか飛び跳ねているところがあります。このIPアドレスはなんでしょう?

f:id:dfirr:20201223075243p:plain

そこで今度はY軸をip_addressにして、bytes_sentをcolorにまわします。これで、サイズに応じて色分けしてくれます。赤色になっているところが、サイズが大きなところです。このウインドウサイズではIPアドレスが重なってしまっていますが、あとで調整できます。数分で概観する分には、これくらいで十分でしょう。

f:id:dfirr:20201223075256p:plain

ここまではグラフの種類はesquisseにお任せしていましたが、手動で選ぶこともできます。

f:id:dfirr:20201223075308p:plain

下のほうにメニューがある通り、タイトルや凡例をつけたり、見た目を変えたりすることも可能です。

汎用グラフィックス文法

esquisseの本当の価値は、「目に見えない」ところにあると思います。すなわち、可視化したものをggplot2のコードとして出力する機能です。このおかげで、二度目以降はGUIをいっさい使わずに再現できます。軸や解像度、サイズなどの調整も、コード化すれば簡単です。下の画面写真が実際のコードですが、とても簡潔だと私は思っています。

f:id:dfirr:20201223075319p:plain

ggplot2は汎用グラフィックス文法を実装したもので、tidyverseの中核をなすパッケージです。どんなグラフが描けるかは、下のリンクをご参照ください。

Squidログを取り込む

今回はSquidプロキシのログを取り込む方法を取り上げました。CRANにはwebreadrというパッケージがあり、Squidログが読み込めることが謳われているのですが、mime_typeフィールドが未定義のため、実際にはエラーが生じるケースが多いと思います。Squidのログは出力形式が自在に変更できますから、パース関数を自前で作れたほうがいいでしょう。

ここでは、readrパッケージに含まれるread_log()関数を利用してSquidログを取り込んでいます。

RPubs「Squidログを取り込む」

IPアドレスをCIDRブロックにマッチさせる

情報セキュリティのログ調査では、IPアドレスを頻繁に扱います。私はBob Rudis氏の「iptools」パッケージを利用することが多いです。IPv4/v6に対応していて、IPアドレスを数値やバイナリに変換したり、ホスト名に変換したり、ランダムなアドレスを生成したり、アドレスが特定の範囲に含まれるかどうかをチェックしたりと、一通りの操作を行う関数が用意されています。

先日、同氏が「astools」というツールを公開していることを知りました。この2つのパッケージを使うとIPアドレスからAS番号が簡単に引けるので紹介するとともに、その背景にある基数木に触れることとしました。

RPubs「IPアドレスをCIDRブロックにマッチさせる」

Rのコードや動作例を示す場合は、RPubsに文書を公開し、そこへのリンクを張るようにします。RPubsはRStudioからワンクリックで公開できて、楽なんです。

情報セキュリティ屋がRと再会して

ブログをはじめます

このブログは、情報セキュリティに関連する業務でR言語を使うに際してのコツを整理するために作りました。

Rとの再会

私はむかし大学で統計学を勉強していたので、R(というかS-PLUS)に触れたことがありました。ただ、プログラミング言語が得意でないこともあり、ほとんど上達しませんでした。かわりにMinitabというGUIのツールを使ったりして、お茶を濁していました。

ところで我が国では、Internet Weekというイベントが毎年開催されています。そこではオライリーがいつも出展していて、本を1割引で販売しています。私は会場に足を運ぶたび、業務との関係は別にして個人的に興味深い本を1冊買って勉強することにしていました。そういうきっかけで、何の気もなく手に取って購入したのがHadley Wickham・Garrett Grolemund『Rではじめるデータサイエンス』(オライリージャパン、2017年)でした。

Rではじめるデータサイエンス

Rではじめるデータサイエンス

Tidyverseとの出会い

この本は、tidyverseというデータ分析用パッケージ群の使い方を解説した教則です。Tidyverseについて書かれた優れたサイトは国内にも多数ある(たとえば岩嵜航さんのHeavy Watal | R stats)ので本欄では詳述しませんが、tidyverseに収録されているggplot2(汎用グラフィック文法)、dplyr(データ操作文法)など、私には一種の文法改革運動に映ります。一貫した文法は操作しやすく、忘れにくいのです。

そういうわけで、業務でログやタイムラインを分析ときにもRを使うことが多くなっていきました。たとえば私はSplunkでサーチ文を書いて数GBのデータを大まかに取得し、手元のRで詳細に分析することがよくあります。Rはメモリに載る範囲では非常に高速に動作するからです。もちろん統計ツールとしても使うようになりました。たとえば社内CTFの結果に項目応答理論をあてはめて問題の難易度を分析したり、ある施策の効果を評価するためにロジスティック回帰分析したりすることです。いつの間にか、R+tidyverseは私の日常業務に欠かせない存在になっていました。

題名と題材

このブログの題名「dfirr」は、tidyverseに収録されているパッケージ「purrr」をもじったものです。DFIR(Digital Forensics and Incident Response)業務に関連したRの使用場面に触れることもあると思いますが、それだけにかぎらず、平時における使用例も取り上げるつもりです。

https://d33wubrfki0l68.cloudfront.net/571b056757d68e6df81a3e3853f54d3c76ad6efc/32d37/diagrams/data-science.png

同書はデータサイエンスの業務を図の通り6種類に分解しています。すなわち、取り込み(import)・整然化(tidy)・変換(transform)・可視化(visualise)・モデル作成(model)・伝達(communicate)です。記事を書くときには、上のどこに位置づけられるかラベル付けして示すようにします。

一方、個別具体的な事案や時事的な話題は、このブログでは取り上げません。サイバーセキュリティインシデントに日常的に携わっている関係上、何かについて述べないという行為自体が何かを伝えることになるかもしれないからです。

まだまだ勉強中なうえ、はてなブログに至っては使ったこともないので、無理解な点などありましたら指摘いただければ幸いです。