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 キーを取得する

  1. 管理者として MISP ウェブ UI にログインします。
  2. [Administration] > [List Auth Keys] に移動します。
  3. [認証キーを追加] をクリックします。
  4. 次のキー構成を指定します。
    • ユーザー: キーに関連付けられているユーザー アカウントを選択します。
    • 許可された IP: 必要に応じて、鍵に対して許可された IP アドレスを指定できます。
    • キーをコピーして安全な場所に保存します。
    • [鍵をメモしました] をクリックします。

MISP ログのエクスポートを構成する

  1. SSH を使用して MISP インスタンスにログインします。
  2. 次のコマンドを使用して PyMISP をインストールします。

    pip3 install pymisp 
    
  3. 次のものを使用して 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)
    
  4. 次のように、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 キーに置き換えます。
  5. 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 の取り込み認証ファイルを取得する

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [コレクション エージェント] に移動します。
  3. Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。

Google SecOps のお客様 ID を取得する

  1. Google SecOps コンソールにログインします。
  2. [SIEM 設定] > [プロファイル] に移動します。
  3. [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。

MISP サーバーに Bindplane エージェントをインストールする

Linux のインストール

  1. root 権限または sudo 権限でターミナルを開きます。
  2. 次のコマンドを実行します。

    sudo sh -c "$(curl -fsSlL https://github.com/observiq/bindplane-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

その他のインストール リソース

その他のインストール オプションについては、インストール ガイドをご覧ください。

MISP ログファイルを取り込んで Google SecOps に送信するように Bindplane エージェントを構成する

  1. 構成ファイルにアクセスします。
    • config.yaml ファイルを見つけます。通常、Linux では /etc/bindplane-agent/ ディレクトリにあります。
    • テキスト エディタ(nanovi、メモ帳など)を使用してファイルを開きます。
  2. 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.typeAttribute.type から派生した場合は log_type)に応じて、複数の UDM フィールドに入力するために使用されます。
- type が「domain」の場合の event.idm.entity.entity.hostnametype が「md5」の場合、
- event.idm.entity.entity.file.md5type が「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
- typeuri または 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_nameevent.ioc.feed_name column16 から直接マッピングされます。CSV 解析パスで使用されます。
column18 event.idm.entity.metadata.threat.severity_detailsevent.ioc.raw_severity column18 から直接マッピングされます。CSV 解析パスで使用されます。
column21 event.idm.entity.metadata.threat.descriptionevent.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.md5type が「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
- typeuri または 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.startevent.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.startevent.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_timestampevent.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 解析の column21column14 から派生します。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 解析の column21column14 から派生します。CSV 解析の column6 または JSON 解析の Attribute.comment から取得されます。いくつかのフィールドが、対応するキーを持つ検出フィールドとして追加されます。複数のフィールドが、対応するキーとともにラベルとして追加されます。未加工ログの最上位の timestamp フィールドからコピーされます。

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。