サーバーへの攻撃を可視化


はじめに

私の所属するサークルのサーバーに対する攻撃を可視化するサイトを作ったので紹介します。 (残念ながらサイト自体はは部内ネットワーク限定公開なので実物を実際に見てもらうことはできないです)

また、この記事は幣サークルの2024年秋号の部誌に載せた記事を編集したものになります。 MMAwiki/Bookletから、誰でも部誌のバックナンバーを閲覧できます。 興味のある方は覗いてみてください。

前提

幣サークルには数多くのサーバーがあります。 そのなかでも moon というサーバーの 22 番ポート(sshのポート)はアクセスを試みる形の攻撃をかなり受けています。 幣サークルにはすでに、攻撃元の IPアドレスからおおまかな場所を割り出し、そのIPからの攻撃回数などと併せて json に出力するシステムがありました。 今回はこのデータをもとに、マップ形式でどこからどれだけ攻撃されたかを可視化しました。

elasticsearch, kibana, logstash を用いた可視化

検索エンジンである elasticsearch, データの編集や可視化に用いる kibana, それらにデータを転送するlogstash を用いて可視化します。 まず、elastic 公式から elasticsearch, kibana, logstash のアーカイブをインストールし、elasticsearch と kibana の初期設定をします。

今回は部内のみの用途なので、それぞれの config でセキュリティオプションdisable にします。(https だと設定が面倒でした)

logstash の config で、json ファイルを読んで elasticsearch に送るように記述します。 この config の要求する json フォーマットがかなり厳しく、コロンの後に空白があると駄目、ファイルの最後に改行がないと駄目、などかなり悩まされました。

  input {
    file {
      path = > "/ path /to/ json / your . json "
      start_position = > " beginning "
      sincedb_path = > "/dev / null "
      codec = > " json "
    }
  }

  filter {

  }

  output {
    elasticsearch {
      hosts = > [" http :// elasticsearch :9200 "]
      index = > " ipdata "
      document_id = > "%{ ip}"
    }
    stdout { codec = > rubydebug }
  }

データが転送できていることを確認したら、kibana で map を作り、埋め込み用の iframe を出力させて、web サイトに張り付けて完成。

ここでの elasticsearch, kibana, logstash は systemd で daemon 化してバックグウンドで実行しています。

kibana等による2Dマップ

webGL を用いた可視化

2Dの次は3Dでの可視化もしたくなったので、webGL(three.js) を用いて可視化してみます。 three.js は 3D 表現に長ける javascript ライブラリで、簡単に 3D 表現が実装できるらしいです。 今回はインターネットの海に浮いていた example を拝借しました。 Google Data Arts チームによる WebGL GLobe というプラットフォームを利用します。3D の地球上の任意の位置に magnitude を持った棒グラフを立てることができるようになっています。 データとして json 形式の以下のようなリストを与えます。


  [
    [ latitude , longitude , magnitude , latitude , logitude , mag ...]
  ]

python で HTTP サーバーを立て、GET リクエストがきたら攻撃データの json を WebGL Globe 用フォーマットに整形して返すコードを書きます。 先ほどの kibana map を張り付けたサイトをホストしているサーバーから、python http サーバーに GET リクエストして、webGL Globe にデータを与えると以下のようなものが完成しました。

webGLによる3Dマップ

今後の展望

やはり攻撃地点から東京までの軌跡を描いたり、グラフ出力などもしたいです。 また、メンテナンス性の向上のために systemd で行っているところをdocker コンテナに置き換えていくつもりです。