脅威インテリジェンスのアプローチを比較する
サイバー脅威インテリジェンス(CTI)の世界に飛び込むと、中央ハブがなければ生データフィードは混沌とした混乱状態であるという厳しい現実にすぐに気づくでしょう。通常、二つの選択肢に直面します。高額なSaaSプロバイダーと契約するか、独自のインスタンスを構築するかです。商用プラットフォームは便利ですが、ユーザーごと、あるいはインジケーター(IOC)ごとに課金されることが多く、データが増えるにつれてコストが急騰します。さらに、内部の調査パターンをサードパーティベンダーと共有することにもなります。
OpenCTIをセルフホストすることで、主導権を握ることができます。データ、インフラ、転送のプライバシーを自ら所有できます。STIX2標準に基づいて構築されているため、ほぼすべての最新セキュリティツールと同じ言語で対話可能です。エンジニアにとって、このセットアップはモダンなアーキテクチャを学ぶ絶好の機会です。検索用のElasticsearch、メッセージング用のRabbitMQ、キャッシュ用のRedisを直接扱うことになります。これは、箱に入った完全なセキュリティエコシステムと言えます。
OpenCTIをセルフホストする現実
独自のスタックを運用することはやりがいがありますが、トレードオフを冷静に見極める必要があります。
メリット
- 完全なデータの主権: 内部調査や機密性の高いインジケーターがネットワーク外に出ることはありません。
- 予測可能なコスト: 月額40ドル程度のVPSで、SaaSプロバイダーが数千ドル請求するような処理をこなせることがよくあります。
- 無制限のカスタマイズ: 特定の業界フィードや内部の独自ログ用にカスタムコネクタを構築できます。
- 高度なマッピング: プラットフォームのナレッジグラフにより、単一のIPから特定のAPTグループやマルウェアファミリーが関与する一連のキャンペーンへと分析を展開できます。
課題
- 高いリソース要求: OpenCTIはマイクロサービスの塊です。5ドルのRaspberry Piで動かせるようなものではありません。
- 運用オーバーヘッド: あなたがDBA(データベース管理者)でありSysAdmin(システム管理者)になります。バックアップ、スキーマ更新、データベースのチューニングはすべてあなたの責任です。
- 複雑さ: 単純なCSV形式のブラックリストからSTIX2グラフモデルへ移行するには、急峻な学習曲線が必要です。
ハードウェア要件
RAMを節約しようとしてセットアップに失敗する例を多く見てきました。OpenCTIのサブサービスはメモリを大量に消費します. 頻繁なクラッシュや「Out of Memory (OOM)」エラーを避けるために、以下の最小構成を守ってください。
- CPU: 4コア以上。AlienVaultやOSINTなどの重いフィードを毎日取り込む場合は8コアを推奨。
- RAM: 16GBがベースラインです。Elasticsearchだけでも、クエリを高速に保つために4GBから8GBを必要とします。
- ストレージ: 50GB以上のNVMeまたはSSD。データベースのパフォーマンスには高いIOPSが不可欠です。
- OS: Dockerベースのデプロイには、Ubuntu 22.04 LTSが最も安定した選択肢です。
ステップバイステップの実装ガイド
Docker Composeは、このスタックをオーケストレートするのに最適な方法です。OpenCTI API、フロントエンド、そして4つの必須依存サービス(Redis、Elasticsearch、MinIO、RabbitMQ)を管理します。
1. 環境の初期化
まずはクリーンなワークスペースを作成します。整理しておくことで、将来のアップデート時のトラブルを防げます。
mkdir opencti-docker && cd opencti-docker
2. 認証情報のセキュリティ確保
OpenCTIは、サービスを連携させるために複数のUUIDとパスワードを使用します。ここではセキュリティが不可欠です。キーの生成には、toolcraft.appのようなブラウザベースのツールをお勧めします。ローカルで処理されるため、シークレットがネットワークに流れることはありません。管理者ID用の**UUID v4**と、RabbitMQおよびMinIO用のユニークな文字列が必要です。
3. 環境ファイル (.env) の設定
ロジックファイルから機密データを分離するために、.envファイルを使用します。これは標準的なDevOpsのベストプラクティスです。nano .envでファイルを作成し、内容を記述します。
[email protected]
OPENCTI_ADMIN_PASSWORD=your_strong_password
OPENCTI_ADMIN_TOKEN=your_uuid_v4_here
OPENCTI_BASE_URL=http://localhost:8080
# データベースのチューニング
ELASTICSEARCH_MEMORY=4G
REDIS_HOST=redis
MINIO_ROOT_USER=opencti
MINIO_ROOT_PASSWORD=your_secure_minio_pass
# RabbitMQの認証情報
RABBITMQ_DEFAULT_USER=opencti
RABBITMQ_DEFAULT_PASS=your_secure_rabbit_pass
4. Docker Composeスタックの定義
docker-compose.ymlファイルは設計図として機能します。APIが接続を試みる前に、データベースとメッセージブローカーが起動することを保証します。バージョン管理に注意してください。最新の安定版イメージ(現在は6.0.x)の使用を推奨します。
version: '3'
services:
redis:
image: redis:7.2.4
restart: always
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms${ELASTICSEARCH_MEMORY} -Xmx${ELASTICSEARCH_MEMORY}"
restart: always
minio:
image: minio/minio
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
command: server /data
restart: always
rabbitmq:
image: rabbitmq:3.12-management
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
restart: always
opencti:
image: opencti/platform:6.0.10
environment:
- APP__ADMIN__EMAIL=${OPENCTI_ADMIN_EMAIL}
- APP__ADMIN__PASSWORD=${OPENCTI_ADMIN_PASSWORD}
- APP__ADMIN__TOKEN=${OPENCTI_ADMIN_TOKEN}
- REDIS__HOSTNAME=redis
- ELASTICSEARCH__URL=http://elasticsearch:9200
- MINIO__ENDPOINT=minio
- MINIO__PORT=9000
- RABBITMQ__HOSTNAME=rabbitmq
ports:
- "8080:8080"
depends_on:
- redis
- elasticsearch
- minio
- rabbitmq
5. 起動と監視
コマンド一つでスタックを起動します。Elasticsearchのインデックス作成とプラットフォームのマイグレーションが実行されるため、最初の起動には3〜5分かかる場合があります。
docker-compose up -d
起動プロセスを監視して、初期エラーを特定します。
docker-compose logs -f opencti
[OPENCTI] Platform readyというメッセージが表示されたら、ブラウザで http://your-server-ip:8080 にアクセスしてください。.envファイルの認証情報を使用してログインします。
プラットフォームへのデータ投入
空のCTIプラットフォームは、価値のない単なる豪華なダッシュボードに過ぎません。活用するには「コネクタ(Connectors)」をデプロイする必要があります. これらは、OpenCTIと外部データソースを橋渡しする軽量なコンテナです。100以上の公式コネクタが利用可能です。
まずはMITRE ATT&CKとAbuse.chのコネクタから始めることをお勧めします。これらにより、既知の攻撃者の戦術やアクティブな悪意のあるURLのベースラインをすぐに構築できます。ディスク使用量に注意してください。稼働率の高いインスタンスでは、最初の1週間で簡単に10GBのインデックスデータが生成されることがあります。

