フィッシングサイトの調査をしてみた - elasticsearch+kibanaを使ってデータの可視化

このブログは、数年前にN高等学校を卒業し株式会社Armorisにやってきたアルバイト Kaepi が書いています。

あるもりすぶろぐの内容は個人の意見です。

概要

今回はフィッシングサイトの情報について、twitterで投稿をしている2つのアカウントからデータを取得し、IPや地域情報などの様々な要素の傾向を調べるために、elasticsearch+kibanaでデータの分析と可視化をしてみました。
また、今回は記事を3回に分けて投稿します。
1. フィッシングサイトの調査をしてみた - データ収集とパース編
2. フィッシングサイトの調査をしてみた - elasticsearch+kibanaを使ってデータの可視化(この記事)
3. フィッシングサイトの調査をしてみた - 可視化したデータの分析

この記事は2回目になります。
・前回の内容まとめ
前回はtwitterからツイートを収集して、データの追加とパース・elasticsearchに投入するところまでをnode.jsを使って自動化しました。

情報元にさせていただいたアカウント
@secbird1
@pingineer_jp

目次

  1. elasticsearch+kibanaのインストール
  2. elasticsearchの基本操作
  3. kibanaのdashboardを使ったデータの可視化
  4. まとめ

elasticsearch+kibanaのインストール

elasticsearchのインストール

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
$ sudo apt-get update && sudo apt-get install elasticsearch
$ sudo systemctl start elasticsearch

動作確認

$ curl http://localhost:9200
{
  "name" : "test",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "███████████████",
  "version" : {
    "number" : "7.15.1",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "83c34f456ae29d60e94d886e455e6a3409bba9ed",
    "build_date" : "2021-10-07T21:56:19.031608185Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

kibanaのインストール

$ sudo apt-get install kibana
$ sudo vim /etc/kibana/kibana.yml

# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
server.host: 0.0.0.0

$ sudo systemctl start kibana

http://ubuntuのip:5601でkibanaの画面を開くことができれば構築は完了です。 f:id:Armoris:20211105154153p:plain

elasticsearchの基本操作

Indexの作成

elasticsearchの操作はcurlなどで行うこともできますが、kibanaのDev Toolsでも同じことができます。

PUT /indexの名前?pretty

上記の内容をelasticsearchに送ることでindexが作成されます。

mappingについて

mappingとは、Indexに入るデータの構造を設定することを指します。 基本的には、名前とデータ型がセットになっていてjsonに似ています。
こちらは今回の調査で作成したindexです。

PUT /secbird1/_mapping
{
      "properties" : {
        "country" : {
          "type" : "keyword"
        },
        "created_at" : {
          "type" : "date"
        },
        "ip" : {
          "type" : "keyword"
        },
        "whois": {
          "type" : "text"
        },
        "location" : {
          "type" : "geo_point"
        },
        "name" : {
          "type" : "keyword"
        },
        "org" : {
          "type" : "keyword"
        },
        "url" : {
          "type" : "keyword"
        }
      }
}

ここで注意しないといけないことは、keywordtextの違いです。 どちらも文字列が入りますが、後述のdashboardを使ったグラフの作成にはtextは使うことができません。
また、可視化することを踏まえて座標データが入るようにするなどの工夫をしました。

kibanaのdashboardを使ったデータの可視化

左側にあるハンバーガーメニューを開くとAnalyticsの項目の下にDashboardがあります。
Dashboardを開くと右側にCreate dashboardのボタンがあり、ここからDashboardを作成することができます。

f:id:Armoris:20211119145223p:plain
作成後のDashboard
Create visualizationをクリックするとグラフを作成する画面になります。 f:id:Armoris:20211110133523p:plain グラフの作成は非常に簡単で、グラフにしたいデータをドラッグアンドドロップするだけで作成できます。 f:id:Armoris:20211119135819p:plain グラフの種類は下に表示されているサジェスト以外にも、上にあるプルダウンメニューから使用できるタイプを選ぶことができます。
f:id:Armoris:20211124123511p:plain
今回の分析で作成したグラフ
このような機能を使って、今回収集したデータを可視化してみました。
それぞれのパネルは、

  1. Table
  2. Pie
  3. Map
  4. Area stacked

というvisualizationを使用しています。
Tableには名前を騙られたサービスを報告が多い順に並べて表示しています。
地域情報(国名)と、フィッシングサイトをホストしているサービス名の比率がわかりやすいようにPie(円グラフ)を選択しました。
また、フィッシングサイトがどこでホストされているのかがわかりやすいようにMapを使って投入された座標データの地点にマークを表示させ、Heat mapで分布がわかりやすくなるようにしました。
最後のArea stackedは、取得したツイートの数を時間ごとに表示しています。

まとめ

今回はelasticsearch・kibanaの構築と前回用意したデータの可視化をしました。
自分で構築やデータの投入・可視化をするのは初めてだったので、調べながら手探りで可視化までできましたが、慣れるといろいろなデータの分析が簡単にできそうな便利なツールなので、勉強しておいて損はないと思いました。
次の記事では今回可視化したデータについて分析した結果について書くので、次回もよろしくお願いします。