Linux環境でのMISP導入・活用ガイド:脅威インテリジェンス(Threat Intelligence)の管理と共有

Security tutorial - IT technology blog
Security tutorial - IT technology blog

背景と課題:膨大なログとコンテキストの欠如

DevOpsチームとともに運用監視を担当していた頃、SIEMやファイアウォールから不審なIPに関するアラートが鳴るたびに対応は難航していました。チーム全体でVirusTotalやAbuseIPDBを20〜30分かけて巡回・調査し、社内のExcelシートへ手動で記録していたのです。しかし、この運用はすぐに破綻しました。データは分散し、次のシフトの担当者は前シフトで何が対処されたのか全く把握できません。さらに深刻だったのは、侵入痕跡(IoC: Indicators of Compromise)をSuricataやiptablesへ自動連携し、迅速にブロックする仕組みがなかったことです。

そこでチームが導入を決めたのが「MISP(Malware Information Sharing Platform)」でした。このオープンソースの脅威情報共有プラットフォームは、以下の3つの大きな課題を解決します。

  • データの一元化: ファイルハッシュ値、IPアドレス、C2ドメイン、CVE、攻撃キャンペーン(脅威アクター)をSTIX/TAXIIに準拠した標準化データベースに集約。
  • 自動同期: CIRCL、AlienVault OTX、abuse.chなどの外部ソースから、毎日5万〜10万件規模のIoCをサーバーへ自動取得。
  • 防御の自動化: REST APIを提供し、SIEM、SOAR、iptablesスクリプト、Snort/Suricataがブラックリストを自動取得してトラフィックを即座に遮断可能に。

MISPの導入:Linux環境における実践的なDocker構成

Linux上にMISPを直接(ベアメタルで)インストールするのは極めて複雑な作業です。PHP 7.4/8.x、Apache/Nginx、MariaDB、Redis、Python仮想環境、各種コンパイル済みCライブラリなど、多くの依存関係が複雑に絡み合っているためです。バージョンのアップデート時にも環境の競合が発生しがちです。そのため、公式のmisp-dockerリポジトリをベースにしたDockerによる導入が最も安全な選択肢となります。環境が完全に分離され、スナップショットによるバックアップも容易で、ホストOSを汚すこともありません。

ステップ1:Ubuntu/Debianサーバーの準備

推奨される最小スペックは2 vCPU、4GB RAMです。URLhausやOTXなどの大規模なフィードを5つ以上有効化する場合は、大量データの処理時にMariaDBやRedisのI/Oボトルネックを防ぐため、最低でも8GB RAMと40GBのSSDを割り当ててください。Docker EngineとComposeプラグインをインストールします。

# リポジトリの更新とDockerエンジンのインストール
sudo apt update && sudo apt install -y curl git docker.io docker-compose-plugin

# Dockerサービスの起動と自動起動の有効化
sudo systemctl enable --now docker

# sudoなしで実行できるよう現在のユーザーをdockerグループに追加
sudo usermod -aG docker $USER
newgrp docker

ステップ2:リポジトリのクローンと環境変数の設定

MISP公式チームが保守している標準のDocker Compose設定を使用します。

git clone https://github.com/MISP/misp-docker.git
cd misp-docker
cp template.env .env

.envファイルを開いて設定を行います。MySQL、暗号化キー、管理者アカウントにデフォルトのパスワードを絶対に使用しないでください。24文字以上のランダムな文字列を生成することを推奨します(例えば、ネットワーク経由でシークレットが漏洩する心配のない toolcraft.app/ja/tools/security/password-generator などのクライアントサイドツールで安全なパスワードを生成できます)。

# .envファイル内の主要な設定項目
MISP_BASEURL="https://misp.yourdomain.local"
MYSQL_USER="misp"
MYSQL_PASSWORD="Dung_Password_Generator_Tao_Chuoi_Phuc_Tap_O_Day_123!"
MYSQL_DATABASE="misp"
MYSQL_ROOT_PASSWORD="Root_Password_Sieu_Dai_456!"
ADMIN_PASSPHRASE="Admin_Initial_Password_789!"

ステップ3:コンテナクラスタの起動

docker compose up -d

初回起動時は約2GBのイメージダウンロードと初期スキーママイグレーションが行われるため、3〜5分ほどかかります。以下のコマンドで初期化ログを監視できます。

docker compose logs -f misp-core

Webサービスの準備完了を示すログが出力されたら、ブラウザからhttps://<サーバーIP>にアクセスします。初期ログインアカウントは[email protected]、パスワードはADMIN_PASSPHRASEに設定した文字列です。初回ログイン時に新しいパスワードへの変更を求められます。

運用設定:MISPの実践的な本番稼働に向けて

1. Base URLの設定とGnuPGキーの確認

管理者アカウントでログインし、Administration → Server Settings & Maintenance → MISP settingsタブを開きます。

  • パラメータMISP.baseurlを探し、アクセス用の正確なFQDN(例: https://misp.company.com)を入力します。設定が誤っていると、メール認証リンク、ノード間同期のWebhook、エクスポートURLが正常に機能しなくなります。
  • GnuPG settingsタブに切り替え、GPGキーのステータスを確認します。MISPはこのキーペアを使用して、参加組織間でやり取りされるアラートデータの暗号化および電子署名を行います。

2. パブリック脅威フィード(Threat Feeds)の有効化

構築直後のMISPは空のデータベースです。オープンソースのインテリジェンスフィード(OSINT Feeds)を取り込む必要があります。

  1. Sync Actions → List Feedsにアクセスします。
  2. Load default feed metadataをクリックします。世界中の信頼性の高い60以上のフィード一覧が自動的に読み込まれます。
  3. 適切なフィードを選択します。推奨としてCIRCL OSINT Feedとabuse.ch URLhausを有効にするため、歯車アイコンをクリックしてEnableを選択します。
  4. Fetch and capture all feedsをクリックして、ワーカーによる脅威データのダウンロードを開始します。初回同期では数万件のレコードを取得するため、ネットワーク環境に応じて5〜10分程度かかります。

3. 最初のイベント登録とIDSフラグの設定

SOCの監視チームが、社内ネットワークと通信したランサムウェア拡散用のC2サーバーを検知したとします。痕跡を記録するために以下の手順でイベントを作成します。

  • Event Actions → Add Eventを開きます。
  • 情報を入力します: DistributionにはThis Community Only(社内限定)、Threat LevelにはHigh、AnalysisにはInitialを指定します。
  • イベント作成後、Add Attributeをクリックします: CategoryにNetwork activity、Typeにip-dstを選択し、不審なIPアドレス(例: 198.51.100.23)を入力します。
  • 重要: IDSのチェックボックスをオンにします。このフラグは、ファイアウォールや防御スクリプトに対して、自動ブロックルールを適用すべきIoCであることを示すシグナルとなります。

4. 自動連携用APIキーの生成

外部ツールからMISPを呼び出してデータを取得するには、専用の認証キーを作成する必要があります。

Administration → List Users → 自身のユーザーを選択 → View Auth Keys → Add Authentication Keyをクリックします。発行された40文字のトークン文字列をパスワードマネージャーに保存してください。この文字列はページを離れるとMISP上で再表示されなくなります。

検証と運用管理:データフローの安定稼働を維持する

1. ワーカー(Worker)ステータスの確認

IoCの抽出、ハッシュの分析、フィードの取得といったタスクは、すべてRedisキューおよびCakePHPワーカーを通じてバックグラウンドで実行されます。ワーカーが停止すると、新しいデータがキュー内に滞留してしまいます。

確認するには、Administration → Server Settings & Maintenance → Workersタブを開きます。default、email、cache、prioのすべてのキューが緑色のOK (Active)状態になっていることを確認してください。

2. 自動ブロックリスト抽出用Pythonスクリプトの作成

以下は、API接続を確認し、過去7日間にIDSフラグが付与された悪意のあるIPアドレスを自動抽出してiptablesやファイアウォールに連携するためのサンプルスクリプトです。

import requests
import json

MISP_URL = "https://misp.yourdomain.local"
AUTH_KEY = "YOUR_MISP_API_KEY_HERE"

headers = {
    "Authorization": AUTH_KEY,
    "Accept": "application/json",
    "Content-Type": "application/json"
}

# 過去7日間にIDSフラグが付与された悪意あるIPを取得するクエリ
payload = {
    "returnFormat": "json",
    "type": "ip-dst",
    "to_ids": 1,
    "last": "7d"
}

response = requests.post(
    f"{MISP_URL}/attributes/restSearch",
    headers=headers,
    data=json.dumps(payload),
    verify=False  # 社内の自己署名証明書を使用している場合はSSL検証をスキップ
)

if response.status_code == 200:
    data = response.json()
    attributes = data.get("response", {}).get("Attribute", [])
    print(f"[+] MISPから悪意あるIPを {len(attributes)} 件正常に抽出しました:")
    for item in attributes[:5]:
        print(f" - {item['value']} (Event ID: {item['event_id']})")
else:
    print(f"[-] API接続エラー: {response.status_code} - {response.text}")

3. リソースの保守と定期的なクリーンアップ

複数のフィードを有効にして2〜3週間連続稼働させると、MariaDBデータベースやDockerのデータディレクトリが10〜20GB規模に肥大化することがあります。安定したパフォーマンスを維持するために、ホストサーバー上で定期的なcronジョブを設定することをお勧めします。

# MariaDBデータベースを格納しているボリュームの容量を確認
docker exec -it misp-docker-misp-db-1 df -h /var/lib/mysql

# coreコンテナ内で30日以上経過した完了済みジョブログを削除
docker exec -it misp-docker-misp-core-1 /var/www/MISP/app/Console/cake Admin cleanupLogs 30

設定が完了すれば、新たな攻撃指標を検知してからネットワークインフラ全体で遮断ルールが適用されるまでの所要時間は、従来の手動調査で数時間かかっていた状態から5分未満へと大幅に短縮されます。

Share: