Table of Contents

はじめに

これはMISP(Malware Information Sharing Platform)の基本的な概念と操作をまとめた入門記事です。

そもそもMISPとは

MISPはオープンソースの脅威情報共有プラットフォームです。 MISPを使うことで、脅威情報(怪しいURLやマルウェアのハッシュ値、サンプルなど)を効率的に組織内外に共有することができます。

Imgur

OSSであり、コミュニティドリブンで開発されていますが、主となる開発母体はルクセンブルクのナショナルCSIRTであるCIRCLです。

CIRCLによれば6,000以上の組織がMISPを使用しています。

Part 1. MISPの基本

まず下記のMISPの基本的なデータモデル・用語を解説します。

  • Event
  • Attribute
  • Proposal
  • Object
  • Tag
  • Taxonomy
  • Galaxy

Event(イベント)

イベントはMISPの最も基本的な要素です。

インシデントや(各種ベンダーやリサーチャーが公開した)OSINTレポートなどを1つのイベントとして作成し、管理します。

Imgur

イベントは継承(Extends)関係を持つことができます。 継承をする場合、イベント作成時に継承するイベントのIDまたはUUIDを指定します。

Attribute(アトリビュート)

アトリビュートはイベントに一対多で紐づく要素で、いわゆるIOC(Indicator of Compromise)のことです。IP/ドメイン/ハッシュ値などがこれに当たります。

例えばOSINTレポートの場合、そのレポートへのリンクや記事本文もアトリビュートとして扱うことができます。

Imgur

Proposal(提案)

作成されたイベントに対し、既存のアトリビュートの修正/新しいアトリビュートの追加などを”提案”をすることができます。

Imgur

提案が作成されると、そのイベントの作成者に通知が飛びます。 イベント作成者に提案が承認されると、その提案がイベントに反映されます。

Object(オブジェクト)

イベントにオブジェクトを追加することができます。

オブジェクトとは、アトリビュートの組み合わせによって表現される特定の”もの”のことです。 YaraTor-nodeなど、特定の”もの”をアトリビュートの組み合わせによって表現します。 具体的には、Yaraは以下のアトリビュートによって構成されたオブジェクトになります。

Imgur

Tag(タグ)

各イベントの関連付けをするためにタグが存在します。

TLPをタグとして付与したり、特定のボットの名前をタグ付けしたりすることができます。

Imgur

例えば上記の例にあるNymaimタグをクリックすると、Nymaimとタグ付けされたイベントのみを表示することができます。

Imgur

Taxonomy(タクソノミー)

タクソノミーはタグのライブラリーのようなもので、複数のインスタンス/組織間で共通のタグを使うために使用されます。

タクソノミーは

  • namespace (必須)
  • predicate (必須)
  • value (オプション)

の3つの要素で構成されます。

Imgur

Galaxy(ギャラクシー)

ギャラクシーはタグ(タクソノミ−)を補完するためのものです。

ギャラクシーはCluster(クラスター)という大きなオブジェクトを用いて、より複雑な関連付けを可能にします。

ギャラクシーは

  • Galaxy
  • Cluster
    • Element
    • Reference

の4つの要素で構成されます。

Galaxyの例:

Imgur

Clusterの例:

Imgur

具体的には以下のように使用されます。

Imgur

Imgur

これにより、タグより複雑な関連を表現することができます。

Part 2. MISPの基本操作

Organization(組織)の作成方法

Note: 組織の作成が可能なのは”admin”(管理者)権限を持つユーザーのみです。

上部の”Administration”(管理) => “Add Organization”(組織を追加)をクリックすると、組織の作成画面に遷移します。

Imgur

ここで各項目を入力することで、組織を作成することができます。

注意が必要なのは、UUIDの項目です。UUID(Universally Unique Identifier)はその名の通り、一意である必要があります。 他のMISPインスタンスと同期をする際、UUIDが衝突してしまうと、データの不整合が発生する可能性があります。

これを避けるためには、独自に(= 手動で)UUIDを設定するのではなく、”Generate UUID”(UUIDを生成)をクリックし、システム側にUUIDを生成させましょう。

User(ユーザー)の作成方法

上部の”Administration” => “Add User”(ユーザーを追加)をクリックすると、ユーザーの作成画面に遷移します。

ここで各項目を入力することで、ユーザーを作成することができます。

Imgur

ユーザーの”Role”(ロール)は以下から選択することができます。

  • admin(管理者)
    • MISPインスタンスの管理者用のロール
  • Org Admin(組織管理者)
    • 特定の組織の管理者用のロール、1つのMISPインスタンス上に複数の組織が同居する際などに使用
  • Publisher
  • User
  • Sync User(同期用ユーザー)
  • Read Only

各ロールが持つ権限の詳細については、”Administartion” => “List Roles”(ロールの一覧)で確認することができます。

Imgur

イベントの作成方法

左側の”Add Event”(イベントを追加)または上部の“Event Actions”(イベントアクション)をクリックすると、イベントの作成画面に遷移します。

Imgur

イベント作成時に重要となるのは”Distribution”(ディストリビューション)の設定です。 ディストリビューションは、イベントの公開範囲を定めるものです。

Imgur

  • Your organization only(あなたの組織のみ)
    • 自分と同じ所属組織に属しているユーザーのみがこのイベントを閲覧することができます。
  • This community only(このコミュニティのみ)
    • 同じコミュニティに属しているユーザーのみがこのイベントを閲覧することができます。
    • 同じコミュニティとは、同じ所属組織、同じMISPインスタンス上に存在する組織、同期する別のインスタンス上に存在する組織を指します。
  • Connected communities(接続されたコミュニティ)
    • 前述した”同期する別のインスタンス”をインスタンスAとします。Connected communitiesを選択するとインスタンスAと同期をする別のインスタンス上の組織もこのイベントを閲覧することができます。
    • つまり、2ホップ先のインスタンス上の組織までイベントが閲覧可能になります。
  • All communities(すべてのコミュニティ)
    • 2ホップ先を超えて、接続するすべてのMISPインタンス上の組織がこのイベントを閲覧することができます。
    • インスタンスからインスタンスへとイベントがpropagete(伝播)していきます。

タグで設定できるTLP(RED/AMBER/GREEN/WHITE)とは、このディストリビューションの設定とは何の関係もないことに注意してください。 TLP:REDとタグ付けしたとしても、ディストリビューションが”All communites”なら、TLPのタグに関係なく伝播してしまいます。

アトリビュートの作成方法

イベントの作成後、”Add Attribute”(アトリビュートを追加)をクリックするとアトリビュートを追加することができます。

Imgur

カテゴリー、タイプを選び、それに該当する値を入力することでアトリビュートを追加することができます。

Imgur

ここでもイベントと同じようにディストリビューションを選択することができます。

イベントとアトリビュートで、異なるディストリビューションを設定した場合、どうなるでしょうか? この場合、最も厳しいディストリビューションが適用されます。 例えば、イベントが”All communities”で、それに属するアトリビューションが”Your organization only”の場合、”Your organization only”が該当するアトリユートに適用されます。

カテゴリーとタイプを選択しながら値を入力していくのは、手間がかかる作業です。 これを効率化するため、MISPには”Freetext import”(フリーテキストインポート)という機能があります。 これを使用すると、フリーテキスト(自由記述のテキスト)から、自動的にIOCの抽出ができます。カテゴリーとタイプも自動的に選択されます。

Imgur

Imgur

この機能は、左側メニューの”Populate from…“をクリックし”Freetext Import”(フリーテキストインポート)を選択すると使用することができます。

タグの追加方法

これを行うとタクソノミー(= タグ)をイベントとアトリビュートに追加することが可能になります。

イベントもアトリビュートも同じく、”Tags”欄にある+ボタンをクリックするとドロップダウンメニューからタグを追加することができます。

Imgur

Imgur

選択できるタグがない場合、自分でタグを追加するか、タクソノミーからタグを追加することができます。 “Event Actions” => “List Taxonomies”(タクソノミーの一覧)に遷移し、有効化したいタクソノミーの”Actions”欄にある+ボタンをクリックすると、そのタクソノミーが有効化され、タグとして使用可能になります。

Imgur

Part 3. MISPインスタンス間の同期

MISPはMISPインスタンス間でイベント/アトリビューとを同期できる機能を持っています。

ここでは、インスタンスAとインスタンスBという2つのMISPインスタンスがあると仮定して話を進めます。

インスタンスBがインスタンスAと同期したい場合(インスタンスA上のイベント/アトリビュートをインスタンスB上に取得したい場合)はの流れは以下のようになります。

  1. インスタンスA上に同期用のアカウントを作成する
  2. インスタンスB上で、インスタンスAをサーバーを登録する
  3. 2.で登録したサーバーとの同期

同期用アカウントの作成

まずインスタンスAの管理者にお願いして、同期用のユーザーを作成してもらいましょう。

同期専用のユーザーとして、余計な権限を持たせないために”Sync user”(同期用ユーザー)のロールを割り当てるのが良いでしょう。

Imgur

ユーザーを作成すると、そのユーザー用の”Authkey”(認証キー)が作成されます。これを使用して同期を行います。

Imgur

サーバーの登録

インスタンスB上にて、上部の”Sync Actions”(同期アクション)のメニューから、”List Servers”(サーバーの一覧)をクリックすると、サーバーの一覧画面に遷移します。

左側にある”New Server”(新しいサーバー)をクリックすると、サーバーの新規作成画面に遷移します。

Imgur

ここで、

  • インスタンスAのBase URL
  • インスタンスAの名前
  • (先ほど作成した同期用ユーザーの)認証キー

を入力し、下部にあるオプションから(ここではとりあえず)”Pull”を選択し、”Submit”をクリックすると、サーバーが作成できます。

Note: “Push”にもチェックを入れると、インスタンスBからインスタンスAに対してイベントをプッシュすることができるようになります。

サーバーとの同期

まず”Connection test”の”Run”ボタンをクリックし、インスタンスAのサーバーとのコネクションを確認しましょう。

Imgur

このようにコネクションの確認ができたら、インスタンスAからイベント/アトリビュートを取得してみましょう。

Imgur

サーバーの右側にある”Pull all”(すべてをプル)アイコンをクリックすると、バックグランドジョブが開始されます。

Imgur

このバックグランドジョブの実行状況は”Admnistration” => “Jobs”から確認することができます。

Imgur

上記の手順はインスタンス上のすべての(インスタンスBへの公開が許可された)イベントを取得する手順でした。

特定のイベントのみを取得したい場合はどうすればいいでしょうか?

この場合、サーバーの一覧画面で”Explore”アイコンをクリックしましょう。

Imgur

すると、インスタンスA上のイベントの一覧が表示されます。ここで取得したいイベントの”Fetch the event”アイコンをクリックすると、特定のイベントのみを取得することができます。

Imgur

Part 4. 自動化

MISPはREST APIを提供しており、このAPIを使用して各種操作を自動化することができます。

詳細は公式のドキュメントをご参照ください。

また、このREST API用にPythonのライブラリー(PyMISP)が公開されています。これは以下のコマンドでインストールすることができます。

$ pip install pymisp

例えば特定のパラメーターのタイプを持つイベントを検索するためのスクリプトは以下のようになります。

from pymisp import PyMISP
import argparse
import json

MISP_URL = 'https://YOUR_MISP_URL.com'
MISP_KEY = 'YOUR_MISP_API_KEY'


def init():
    return PyMISP(MISP_URL, MISP_KEY, True, 'json')


def search(m, url, controller, **kwargs):
    result = m.search(controller, **kwargs)
    print(json.dumps(result['response']))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description='Get all the events matching a value for a given param.')

    parser.add_argument("-p", "--param", required=True, help="Parameter to search (e.g. category, org, values, type_attribute, etc.)")
    parser.add_argument("-s", "--search", required=True,
                        help="String to search.")

    args = parser.parse_args()

    misp = init()
    kwargs = {args.param: args.search}
    controller = 'events'

    search(misp, MISP_URL, controller, **kwargs)

参考: MISPの構築方法

開発・検証用

公式でMISPの開発・検証用のVagrantfileが提供されています。

プロダクション用

公式でMISPのインストール手順が紹介されています。

  • https://github.com/MISP/MISP/tree/2.4/INSTALL

その他の選択肢として、公式からはDockerイメージ、AWSにデプロイするためのAMIイメージ及びAnsibleスクリプトが提供されています。

また、公式ではありませんが、Ubuntu 16.04 / 18.04にMISPを自動インストールするためのスクリプトが公開されています。

参考: MISP i18n

MISPはCrowdinを使用してi18nを進めています。

日本語化のルールはninoseki/MISP-japanizationにまとめられています。

ご興味ある方や誤字・誤記を見つけられた方は、日本語化にコントリビュートして見てください。

References

この記事は下記を参考にして書かれました。