收集 MISP IOC 日志

支持的语言:

本指南概述了使用 Bindplane 将 MISP(恶意软件信息共享平台)IOC(入侵指标)日志注入到 Google Security Operations 的步骤。解析器从以 JSON 或 CSV 格式设置的 MISP 数据中提取 IOC。它会解析输入内容,将字段映射到统一数据模型 (UDM),处理各种 IOC 类型(例如 IP、网域和文件哈希),并使用置信度和严重程度等威胁情报上下文来丰富数据。解析器还会针对不同的数据格式执行特定逻辑,并处理缺少字段或字段不受支持的情况。

准备工作

请确保满足以下前提条件:

  • Google SecOps 实例
  • 搭载 systemd 的 Linux 主机
  • 如果在代理后运行,防火墙端口处于开放状态
  • 对 MISP 服务器的特权访问权限

获取 MISP API 密钥

  1. 以管理员身份登录 MISP 网页界面。
  2. 依次前往管理 > 列出授权密钥
  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 凭据和网址,如下所示:

    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. 下载注入身份验证文件。将该文件安全地保存在将要安装 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
    

其他安装资源

如需了解其他安装选项,请参阅安装指南

配置 Bindplane 代理以注入 MISP 日志文件并将其发送到 Google SecOps

  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 映射,并添加为检测字段,键为“属性时间戳”。用于 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 多个 此字段的值用于填充多个 UDM 字段,具体取决于 Attribute.type(如果派生自 Attribute.type,则为 log_type):
- 如果 type 为“网域”,则为 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
- event.idm.entity.entity.user.email_addresses(如果 type 为“威胁正文”)。
- 如果 typeuriurl,则为 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 映射,并与“IOC”串联以形成最终的分类。用于 CSV 解析路径。
column4 event.idm.entity.metadata.description 直接从 column4 映射。用于 CSV 解析路径。
column5 多个 此字段的值用于填充多个 UDM 字段,具体取决于 column4 字段(映射到 type):
- 如果 type 为“网域”,则为 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
- event.idm.entity.entity.user.email_addresses(如果 type 为“威胁正文”)。
- 如果 typeuriurl,则为 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 映射,并添加为键为“组织名称”的检测字段。用于 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 映射,并添加为键为“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 秒)的默认值。由解析器根据 typelog_type 字段确定。可以是“FILE”“DOMAIN_NAME”“IP_ADDRESS”“MUTEX”“RESOURCE”或“USER”。可以根据 Attribute.typeAttribute.commentAttribute.value 派生。如果类型与 IP 相关,则从 Attribute.valuecolumn5 解析。如果类型为“ip-dst|port”,则从 Attribute.valuecolumn5 解析。派生自 CSV 解析中的 column3 或 JSON 解析中的 Attribute.category。在 CSV 解析中派生自 column21column14。派生自 column8first_seen。派生自 last_seen。使用 grok 模式从 description 派生。派生自 column16 或设置为“MISP”。派生自 column18。如果类型与 IP 相关,则从 Attribute.valuecolumn5 解析。如果类型为“ip-dst|port”,则从 Attribute.valuecolumn5 解析。如果类型为“网域”,则派生自 Attribute.valuecolumn5。派生自 confidence 字段,该字段提取自 description 字段。值可以是“HIGH_CONFIDENCE”“MEDIUM_CONFIDENCE”“LOW_CONFIDENCE”或“UNKNOWN_CONFIDENCE”。直接从 confidence 字段映射,该字段是从 description 字段中提取的。直接从 threat_level 字段映射,该字段派生自 CSV 解析路径中的 column18。直接从 feed_name 字段映射,该字段派生自 CSV 解析路径中的 column16。在 CSV 解析中派生自 column21column14。派生自 CSV 解析中的 column6 或 JSON 解析中的 Attribute.comment。添加了多个字段作为检测字段,并附带了相应的键。添加了多个字段作为标签,并附带了相应的键。从原始日志中的顶级 timestamp 字段复制。

需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。