MISP IOC ログを収集する
このガイドでは、Bindplane を使用して MISP(Malware Information Sharing Platform)IOC(Indicators of Compromise)ログを Google Security Operations に取り込む手順について説明します。パーサーは、JSON または CSV 形式の MISP データから IOC を抽出します。入力を解析し、フィールドを統合データモデル(UDM)にマッピングし、さまざまな IOC タイプ(IP、ドメイン、ファイル ハッシュなど)を処理し、信頼度や重大度などの脅威インテリジェンス コンテキストでデータを拡充します。パーサーは、さまざまなデータ形式の特定のロジックも実行し、フィールドが欠落している場合やサポートされていない場合を処理します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
systemd
を使用する Linux ホスト- プロキシの背後で実行されている場合、ファイアウォール ポートが開いている
- MISP サーバーへの特権アクセス
MISP API キーを取得する
- 管理者として MISP ウェブ UI にログインします。
- [Administration] > [List Auth Keys] に移動します。
- [認証キーを追加] をクリックします。
- 次のキー構成を指定します。
- ユーザー: キーに関連付けられているユーザー アカウントを選択します。
- 許可された IP: 必要に応じて、鍵に対して許可された IP アドレスを指定できます。
- キーをコピーして安全な場所に保存します。
- [鍵をメモしました] をクリックします。
MISP ログのエクスポートを構成する
- SSH を使用して MISP インスタンスにログインします。
次のコマンドを使用して PyMISP をインストールします。
pip3 install pymisp
次のものを使用して
get_csv.py
エクスポート スクリプトを変更します。#!/usr/bin/env python3 # -*- coding: utf-8 -*- import argparse from pymisp import ExpandedPyMISP from keys import misp_url, misp_key, misp_verifycert if __name__ == '__main__': parser = argparse.ArgumentParser(description='Get MISP data in a CSV format.') parser.add_argument("--controller", default='attributes', help="Attribute to use for the search (events, objects, attributes)") parser.add_argument("-e", "--event_id", help="Event ID to fetch. Without it, it will fetch the whole database.") parser.add_argument("-a", "--attribute", nargs='+', help="Attribute column names") parser.add_argument("-o", "--object_attribute", nargs='+', help="Object attribute column names") parser.add_argument("-t", "--misp_types", nargs='+', help="MISP types to fetch (ip-src, hostname, ...)") parser.add_argument("-c", "--context", action='store_true', help="Add event level context (tags...)") parser.add_argument("-f", "--outfile", help="Output file to write the CSV.") parser.add_argument("-l", "--last", required=True, help="can be defined in days, hours, minutes (for example 5d or 12h or 30m).") args = parser.parse_args() pymisp = ExpandedPyMISP(misp_url, misp_key, misp_verifycert, debug=True) attr = [] if args.attribute: attr += args.attribute if args.object_attribute: attr += args.object_attribute if not attr: attr = None print(args.context) response = pymisp.search(return_format='csv', controller=args.controller, eventid=args.event_id, requested_attributes=attr, publish_timestamp=args.last, type_attribute=args.misp_types, include_context=args.context) if args.outfile: with open(args.outfile, 'w') as f: f.write(response) else: print(response)
次のように、
keys.py
ファイルを編集して MISP API の認証情報と URL を含めます。misp_url = 'https://<MISP_URL>' misp_key = '<MISP_API_KEY>' misp_verifycert = False misp_client_cert = ''
<MISP_URL>
は、MISP の IP またはホスト名に置き換えます。<MISP_API_KEY
は、前に生成した実際の API キーに置き換えます。
crontab -e
コマンドを使用して crontab を開き、次のように入力します。0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/url.log -t "url" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/ip-dst.log -t "ip-dst" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/ip-src.log -t "ip-src" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/domain.log -t "domain" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/sha256.log -t "sha256" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/file.log -t "filename" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/registry.log -t "registry" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/mutex.log -t "mutex" -l 1d -c 0 20 * * * python3 /opt/misp/<YOUR_EXPORT_SCRIPT_PATH> -f /opt/misp/ioc_export/threat-actor.log -t "threat-actor" -l 1d -c
- 実際のエクスポート スクリプトの場所に合わせて
<YOUR_EXPORT_SCRIPT_PATH>
を更新します。
- 実際のエクスポート スクリプトの場所に合わせて
Google SecOps の取り込み認証ファイルを取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [コレクション エージェント] に移動します。
- Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。
Google SecOps のお客様 ID を取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [プロファイル] に移動します。
- [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。
MISP サーバーに Bindplane エージェントをインストールする
Linux のインストール
- root 権限または sudo 権限でターミナルを開きます。
次のコマンドを実行します。
sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
その他のインストール リソース
その他のインストール オプションについては、インストール ガイドをご覧ください。
MISP ログファイルを取り込んで Google SecOps に送信するように Bindplane エージェントを構成する
- 構成ファイルにアクセスします。
config.yaml
ファイルを見つけます。通常、Linux では/etc/bindplane-agent/
ディレクトリにあります。- テキスト エディタ(
nano
、vi
、メモ帳など)を使用してファイルを開きます。
config.yaml
ファイルを次のように編集します。receivers: filelog: file_path: /opt/misp/ioc_export/*.log log_type: 'file' exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <customer_id> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization ingestion_labels: log_type: 'MISP_IOC' raw_log_field: body service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - filelog exporters: - chronicle/chronicle_w_labels
- 自社のインフラストラクチャでの必要性に応じて、ポートと IP アドレスを置き換えます。
<customer_id>
は、実際のお客様 ID に置き換えます。/path/to/ingestion-authentication-file.json
の値を、Google SecOps の取り込み認証ファイルを取得するで認証ファイルを保存したパスに更新します。
Bindplane エージェントを再起動して変更を適用する
Linux で Bindplane エージェントを再起動するには、次のコマンドを実行します。
sudo systemctl restart bindplane-agent
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
Attribute.category |
event.idm.entity.metadata.threat.category_details |
「data」フィールド内のネストされた JSON オブジェクトの Attribute.category から直接マッピングされます。JSON 解析パスで使用されます。 |
Attribute.comment |
event.idm.entity.metadata.threat.summary |
「data」フィールド内のネストされた JSON オブジェクトの Attribute.comment から直接マッピングされます。JSON 解析パスで使用されます。 |
Attribute.deleted |
event.idm.entity.metadata.threat.detection_fields.value |
Attribute.deleted から直接マッピングされ、「Attribute deleted」キーの検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Attribute.event_id |
event.idm.entity.metadata.threat.detection_fields.value |
Attribute.event_id から直接マッピングされ、「Attribute event_id」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Attribute.first_seen |
event.idm.entity.metadata.threat.detection_fields.value |
Attribute.first_seen から直接マッピングされ、キー「Attribute first_seen」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Attribute.id |
event.idm.entity.metadata.threat.detection_fields.value |
Attribute.id から直接マッピングされ、解析パスに応じて「Attribute id」または「Attribute id $$」キーの検出フィールドとして追加されます。CSV と JSON の両方の解析パスで使用されます。 |
Attribute.timestamp |
event.idm.entity.metadata.threat.detection_fields.value |
Attribute.timestamp から直接マッピングされ、「Attribute timestamp」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Attribute.to_ids |
event.idm.entity.metadata.threat.detection_fields.value |
Attribute.to_ids から直接マッピングされ、「Attribute to_ids」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Attribute.type |
log_type |
「data」フィールド内のネストされた JSON オブジェクトの Attribute.type から直接マッピングされます。中間フィールドとして使用され、後で他の UDM フィールドへの入力に使用されます。JSON 解析パスで使用されます。 |
Attribute.uuid |
event.idm.entity.metadata.product_entity_id |
「data」フィールド内のネストされた JSON オブジェクトの Attribute.uuid から直接マッピングされます。JSON 解析パスで使用されます。 |
Attribute.value |
複数 | このフィールドの値は、Attribute.type (Attribute.type から派生した場合は log_type )に応じて、複数の UDM フィールドに入力するために使用されます。- type が「domain」の場合の event.idm.entity.entity.hostname 。type が「md5」の場合、- event.idm.entity.entity.file.md5 。type が「sha1」の場合、- event.idm.entity.entity.file.sha1 。- type が「sha256」の場合、event.idm.entity.entity.file.sha256 。- type が「mutex」の場合の event.idm.entity.entity.resource.name 。- type が「regkey」の場合の event.idm.entity.entity.registry.registry_key 。- type が「threat-actor」の場合の event.idm.entity.entity.user.email_addresses 。- type が uri または url の場合は event.idm.entity.entity.url 。- type が「filename」の場合、event.idm.entity.entity.file.full_path 。- type が「ip-dst|port」、「ip-dst」、「ip-src」の場合、IP とポートを解析しました。JSON 解析パスで使用されます。 |
column1 |
event.idm.entity.metadata.product_entity_id |
CSV 解析パスの column1 から直接マッピングされます。 |
column14 |
event.idm.entity.metadata.threat.description 系列 |
description と連結して、脅威メタデータの最終的な説明を形成します。CSV 解析パスで使用されます。 |
column16 |
event.idm.entity.metadata.threat.threat_feed_name 、event.ioc.feed_name |
column16 から直接マッピングされます。CSV 解析パスで使用されます。 |
column18 |
event.idm.entity.metadata.threat.severity_details 、event.ioc.raw_severity |
column18 から直接マッピングされます。CSV 解析パスで使用されます。 |
column21 |
event.idm.entity.metadata.threat.description 、event.ioc.description の一部 |
説明のベースとして使用され、後で event_info と連結されます。CSV 解析パスで使用されます。 |
column3 |
event.ioc.categorization 系列 |
column3 から直接マッピングされ、「IOCs」と連結されて最終的な分類が形成されます。CSV 解析パスで使用されます。 |
column4 |
event.idm.entity.metadata.description |
column4 から直接マッピングされます。CSV 解析パスで使用されます。 |
column5 |
複数 | このフィールドの値は、column4 フィールド(type にマッピング)に応じて、複数の UDM フィールドに入力するために使用されます。- type が「domain」の場合の event.idm.entity.entity.hostname 。- type が「ip-dst|port」、「ip-dst」、「ip-src」の場合、IP とポートを解析しました。type が「md5」の場合、- event.idm.entity.entity.file.md5 。type が「sha1」の場合、- event.idm.entity.entity.file.sha1 。- type が「sha256」の場合、event.idm.entity.entity.file.sha256 。- type が「mutex」の場合の event.idm.entity.entity.resource.name 。- type が「regkey」の場合の event.idm.entity.entity.registry.registry_key 。- type が「threat-actor」の場合の event.idm.entity.entity.user.email_addresses 。- type が uri または url の場合は event.idm.entity.entity.url 。- type が「filename」の場合、event.idm.entity.entity.file.full_path 。CSV 解析パスで使用されます。 |
column6 |
event.idm.entity.metadata.threat.summary |
column6 から直接マッピングされます。CSV 解析パスで使用されます。 |
column8 |
event.ioc.active_timerange.start 、event.idm.entity.metadata.interval.start_time |
UNIX タイムスタンプとして解析されます。CSV 解析パスで使用されます。 |
date description |
event.idm.entity.metadata.threat.description |
「data」フィールド内のネストされた JSON オブジェクトの description から直接マッピングされます。JSON 解析パスで使用されます。 |
event_creator_email |
event.idm.entity.entity.labels.value |
event_creator_email から直接マッピングされ、キー「event_creator_email」のラベルとして追加されます。JSON 解析パスで使用されます。 |
event_id Feed.publish |
event.idm.entity.metadata.threat.detection_fields.value |
Feed.publish から直接マッピングされ、「Feed publish」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
first_seen |
event.ioc.active_timerange.start 、event.idm.entity.metadata.interval.start_time |
「yyyy-MM-ddTHH:mm:ssZZ」形式のタイムスタンプとして解析されます。JSON 解析パスで使用されます。 |
id info |
event.idm.entity.metadata.description |
「data」フィールド内のネストされた JSON オブジェクトの info から直接マッピングされます。JSON 解析パスで使用されます。 |
last_seen |
event.ioc.active_timerange.end |
「yyyy-MM-ddTHH:mm:ssZZ」形式のタイムスタンプとして解析されます。JSON 解析パスで使用されます。 |
Org.name |
event.idm.entity.metadata.threat.detection_fields.value |
Org.name から直接マッピングされ、「Org name」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
published |
event.idm.entity.metadata.threat.detection_fields.value |
published から直接マッピングされ、「published」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.colour |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.colour から直接マッピングされ、キー「tag colour」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.exportable |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.exportable から直接マッピングされ、キー「tag exportable」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.hide_tag |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.hide_tag から直接マッピングされ、キー「tag hide_tag」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.id |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.id から直接マッピングされ、キー「tag id」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.is_custom_galaxy |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.is_custom_galaxy から直接マッピングされ、「tag is_custom_galaxy」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.is_galaxy |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.is_galaxy から直接マッピングされ、「tag is_galaxy」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.isinherited |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.isinherited から直接マッピングされ、キー「tag isinherited」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.name |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.name から直接マッピングされ、キー「タグ名」の検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.numerical_value |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.numerical_value から直接マッピングされ、「tag numerical_value」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
Tag.user_id |
event.idm.entity.metadata.threat.detection_fields.value |
Tag.user_id から直接マッピングされ、「tag user_id」キーを持つ検出フィールドとして追加されます。JSON 解析パスで使用されます。 |
threat_level_id |
event.idm.entity.entity.labels.value |
threat_level_id から直接マッピングされ、キー「threat_level_id」のラベルとして追加されます。JSON 解析パスで使用されます。 |
timestamp |
event.idm.entity.metadata.collected_timestamp 、event.idm.entity.metadata.interval.start_time |
UNIX タイムスタンプとして解析されます。CSV 解析パスで使用されます。 |
uuid |
event.idm.entity.metadata.vendor_name |
パーサーによって「MISP」に設定されます。パーサーによって「MISP」に設定されます。デフォルト値は、かなり先の未来(エポックからの経過秒数 253402300799 秒)に設定されます。type フィールドまたは log_type フィールドに基づいてパーサーによって決定されます。「FILE」、「DOMAIN_NAME」、「IP_ADDRESS」、「MUTEX」、「RESOURCE」、「USER」のいずれか。Attribute.type に応じて、Attribute.comment または Attribute.value から導出できます。タイプが IP 関連の場合は、Attribute.value または column5 から解析されます。タイプが「ip-dst|port」の場合、Attribute.value または column5 から解析されます。CSV 解析の column3 または JSON 解析の Attribute.category から取得されます。CSV 解析の column21 と column14 から派生します。column8 または first_seen から取得されます。last_seen から取得されます。grok パターンを使用して description から派生します。column16 から派生するか、「MISP」に設定されます。column18 から取得されます。タイプが IP 関連の場合は、Attribute.value または column5 から解析されます。タイプが「ip-dst|port」の場合、Attribute.value または column5 から解析されます。タイプが「domain」の場合、Attribute.value または column5 から派生します。description フィールドから抽出された confidence フィールドから派生します。値は、「HIGH_CONFIDENCE」、「MEDIUM_CONFIDENCE」、「LOW_CONFIDENCE」、「UNKNOWN_CONFIDENCE」のいずれかです。description フィールドから抽出された confidence フィールドから直接マッピングされます。threat_level フィールドから直接マッピングされます。このフィールドは、CSV 解析パスの column18 から派生します。feed_name フィールドから直接マッピングされます。このフィールドは、CSV 解析パスの column16 から派生します。CSV 解析の column21 と column14 から派生します。CSV 解析の column6 または JSON 解析の Attribute.comment から取得されます。いくつかのフィールドが、対応するキーを持つ検出フィールドとして追加されます。複数のフィールドが、対応するキーとともにラベルとして追加されます。未加工ログの最上位の timestamp フィールドからコピーされます。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。