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を起動すると、画面写真のようなウインドウが表示されます。ウインドウタイトルにある「きみがバラのために費やした時間こそが、そのバラを大切なものにしている」とは、『星の王子さま』でのキツネの有名なセリフ「大切なものは目には見えない」につづく言葉。可視化ツールで引用しますか、そこ……。
気を取り直してパレットの上段を見ると、各変数が型で色分けされていることがわかります。この変数を下段の小部屋にドラッグして放り込むことで、変数の型に応じて適当にグラフを作ってくれます。
まずはtimestampをX軸にとり、ついでにstatus_codeで色分け(fill)します。1変数グラフなので、自動的にカウントが選択されます。
次に、今回のログで唯一の数値型であるbytes_sentをY軸にとってみます。いくつか飛び跳ねているところがあります。このIPアドレスはなんでしょう?
そこで今度はY軸をip_addressにして、bytes_sentをcolorにまわします。これで、サイズに応じて色分けしてくれます。赤色になっているところが、サイズが大きなところです。このウインドウサイズではIPアドレスが重なってしまっていますが、あとで調整できます。数分で概観する分には、これくらいで十分でしょう。
ここまではグラフの種類はesquisseにお任せしていましたが、手動で選ぶこともできます。
下のほうにメニューがある通り、タイトルや凡例をつけたり、見た目を変えたりすることも可能です。
汎用グラフィックス文法
esquisseの本当の価値は、「目に見えない」ところにあると思います。すなわち、可視化したものをggplot2のコードとして出力する機能です。このおかげで、二度目以降はGUIをいっさい使わずに再現できます。軸や解像度、サイズなどの調整も、コード化すれば簡単です。下の画面写真が実際のコードですが、とても簡潔だと私は思っています。
ggplot2は汎用グラフィックス文法を実装したもので、tidyverseの中核をなすパッケージです。どんなグラフが描けるかは、下のリンクをご参照ください。