Raccogliere i log IOC MISP

Supportato in:

Questa guida illustra i passaggi per importare i log IOC (Indicatori di compromissione) di MISP (Malware Information Sharing Platform) in Google Security Operations utilizzando Bindplane. L'analizzatore estrae gli indicatori di compromissione dai dati MISP formattati come JSON o CSV. Analizza l'input, mappa i campi al modello UDM (Unified Data Model), gestisce vari tipi di IOC (ad esempio hash di IP, domini e file) e arricchisce i dati con il contesto della threat intelligence, come attendibilità e gravità. Il parser esegue inoltre una logica specifica per diversi formati di dati e gestisce i casi con campi mancanti o non supportati.

Prima di iniziare

Assicurati di disporre dei seguenti prerequisiti:

  • Istanza Google SecOps
  • Host Linux con systemd
  • Se il servizio viene eseguito dietro un proxy, le porte del firewall sono aperte
  • Accesso privilegiato al server MISP

Ottieni la chiave API MISP

  1. Accedi all'interfaccia utente web di MISP come amministratore.
  2. Vai ad Amministrazione > Elenca chiavi di autenticazione.
  3. Fai clic su Aggiungi chiave di autenticazione.
  4. Fornisci la seguente configurazione della chiave:
    • Utente: seleziona l'account utente associato alla chiave.
    • IP consentiti: facoltativamente, puoi specificare gli indirizzi IP consentiti per la chiave.
    • Copia e salva la chiave in un luogo sicuro.
    • Fai clic su Ho preso nota della chiave.

Configurare l'esportazione dei log MISP

  1. Accedi all'istanza MISP utilizzando SSH.
  2. Installa PyMISP utilizzando il seguente comando:

    pip3 install pymisp 
    
  3. Modifica lo script di esportazione get_csv.py utilizzando quanto segue:

    #!/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)
    
    1. Modifica il file keys.py per includere le credenziali e l'URL dell'API MISP:
    misp_url = 'https://<MISP_URL>'
    misp_key = '<MISP_API_KEY>'
    misp_verifycert = False
    misp_client_cert = ''
    
    • Sostituisci <MISP_URL> con l'indirizzo IP o il nome host di MISP.
    • Sostituisci <MISP_API_KEY con la chiave API effettiva generata in precedenza.
  4. Apri crontab utilizzando il comando crontab -e e inserisci quanto segue:

    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
    
    • Aggiorna <YOUR_EXPORT_SCRIPT_PATH> in base alla posizione effettiva dello script di esportazione.

Recupera il file di autenticazione di importazione di Google SecOps

  1. Accedi alla console Google SecOps.
  2. Vai a Impostazioni SIEM > Agenti di raccolta.
  3. Scarica il file di autenticazione dell'importazione. Salva il file in modo sicuro sul sistema in cui verrà installato Bindplane.

Ottenere l'ID cliente Google SecOps

  1. Accedi alla console Google SecOps.
  2. Vai a Impostazioni SIEM > Profilo.
  3. Copia e salva l'ID cliente dalla sezione Dettagli dell'organizzazione.

Installa l'agente Bindplane sul server MISP

Installazione di Linux

  1. Apri un terminale con privilegi di root o sudo.
  2. Esegui questo comando:

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

Risorse di installazione aggiuntive

Per altre opzioni di installazione, consulta la guida all'installazione.

Configura l'agente Bindplane per importare i file di log MISP e inviarli a Google SecOps

  1. Accedi al file di configurazione:
    • Individua il file config.yaml. In genere si trova nella directory /etc/bindplane-agent/ su Linux.
    • Apri il file utilizzando un editor di testo (ad esempio nano, vi o Blocco note).
  2. Modifica il file config.yaml come segue:

    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
    

Riavvia l'agente Bindplane per applicare le modifiche

Per riavviare l'agente Bindplane in Linux, esegui il seguente comando:

  sudo systemctl restart bindplane-agent

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
Attribute.category event.idm.entity.metadata.threat.category_details Mappato direttamente da Attribute.category nell'oggetto JSON nidificato all'interno del campo "data". Utilizzato nel percorso di analisi JSON.
Attribute.comment event.idm.entity.metadata.threat.summary Mappato direttamente da Attribute.comment nell'oggetto JSON nidificato all'interno del campo "data". Utilizzato nel percorso di analisi JSON.
Attribute.deleted event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Attribute.deleted e aggiunto come campo di rilevamento con chiave "Attributo eliminato". Utilizzato nel percorso di analisi JSON.
Attribute.event_id event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Attribute.event_id e aggiunto come campo di rilevamento con chiave "Attributo event_id". Utilizzato nel percorso di analisi JSON.
Attribute.first_seen event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Attribute.first_seen e aggiunto come campo di rilevamento con chiave "Attributo first_seen". Utilizzato nel percorso di analisi JSON.
Attribute.id event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Attribute.id e aggiunto come campo di rilevamento con la chiave "ID attributo" o "ID attributo $$" a seconda del percorso di analisi. Utilizzato nei percorsi di analisi CSV e JSON.
Attribute.timestamp event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Attribute.timestamp e aggiunto come campo di rilevamento con chiave "Attribute timestamp". Utilizzato nel percorso di analisi JSON.
Attribute.to_ids event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Attribute.to_ids e aggiunto come campo di rilevamento con la chiave "Attributo to_ids". Utilizzato nel percorso di analisi JSON.
Attribute.type log_type Mappato direttamente da Attribute.type nell'oggetto JSON nidificato all'interno del campo "data". Utilizzato come campo provvisorio e in seguito utilizzato per compilare altri campi UDM. Utilizzato nel percorso di analisi JSON.
Attribute.uuid event.idm.entity.metadata.product_entity_id Mappato direttamente da Attribute.uuid nell'oggetto JSON nidificato all'interno del campo "data". Utilizzato nel percorso di analisi JSON.
Attribute.value Multiplo Il valore di questo campo viene utilizzato per compilare diversi campi UDM a seconda del valore di Attribute.type (o log_type se derivato da Attribute.type):
- event.idm.entity.entity.hostname se type è "domain".
- event.idm.entity.entity.file.md5 se type è "md5".
- event.idm.entity.entity.file.sha1 se type è "sha1".
- event.idm.entity.entity.file.sha256 se type è "sha256".
- event.idm.entity.entity.resource.name se type è "mutex".
- event.idm.entity.entity.registry.registry_key se type è "regkey".
- event.idm.entity.entity.user.email_addresses se type è "threat-actor".
- event.idm.entity.entity.url se type è uri o url.
- event.idm.entity.entity.file.full_path se type è "nomefile".
: analizzato per IP e porta se type è "ip-dst|port", "ip-dst" o "ip-src". Utilizzato nel percorso di analisi JSON.
column1 event.idm.entity.metadata.product_entity_id Mappato direttamente da column1 nel percorso di analisi CSV.
column14 Parte di event.idm.entity.metadata.threat.description Concatenato con description per formare la descrizione finale nei metadati della minaccia. Utilizzato nel percorso di analisi CSV.
column16 event.idm.entity.metadata.threat.threat_feed_name, event.ioc.feed_name Mappata direttamente da column16. Utilizzato nel percorso di analisi CSV.
column18 event.idm.entity.metadata.threat.severity_details, event.ioc.raw_severity Mappata direttamente da column18. Utilizzato nel percorso di analisi CSV.
column21 Parte di event.idm.entity.metadata.threat.description, event.ioc.description Utilizzato come base per la descrizione, successivamente concatenato con event_info. Utilizzato nel percorso di analisi CSV.
column3 Parte di event.ioc.categorization Mappato direttamente da column3 e concatenato con "IOC" per formare la classificazione finale. Utilizzato nel percorso di analisi CSV.
column4 event.idm.entity.metadata.description Mappata direttamente da column4. Utilizzato nel percorso di analisi CSV.
column5 Multiplo Il valore di questo campo viene utilizzato per compilare diversi campi UDM a seconda del campo column4 (che si mappa a type):
- event.idm.entity.entity.hostname se type è "domain".
: analizzato per IP e porta se type è "ip-dst|port", "ip-dst" o "ip-src".
- event.idm.entity.entity.file.md5 se type è "md5".
- event.idm.entity.entity.file.sha1 se type è "sha1".
- event.idm.entity.entity.file.sha256 se type è "sha256".
- event.idm.entity.entity.resource.name se type è "mutex".
- event.idm.entity.entity.registry.registry_key se type è "regkey".
- event.idm.entity.entity.user.email_addresses se type è "threat-actor".
- event.idm.entity.entity.url se type è uri o url.
- event.idm.entity.entity.file.full_path se type è "nomefile". Utilizzato nel percorso di analisi CSV.
column6 event.idm.entity.metadata.threat.summary Mappata direttamente da column6. Utilizzato nel percorso di analisi CSV.
column8 event.ioc.active_timerange.start, event.idm.entity.metadata.interval.start_time Analizzata come timestamp UNIX. Utilizzato nel percorso di analisi CSV.
date description event.idm.entity.metadata.threat.description Mappato direttamente da description nell'oggetto JSON nidificato all'interno del campo "data". Utilizzato nel percorso di analisi JSON.
event_creator_email event.idm.entity.entity.labels.value Mappato direttamente da event_creator_email e aggiunto come etichetta con la chiave "event_creator_email". Utilizzato nel percorso di analisi JSON.
event_id Feed.publish event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Feed.publish e aggiunto come campo di rilevamento con chiave "Pubblicazione feed". Utilizzato nel percorso di analisi JSON.
first_seen event.ioc.active_timerange.start, event.idm.entity.metadata.interval.start_time Analizzata come timestamp nel formato "aaaa-MM-ggTHH:mm:ssZZ". Utilizzato nel percorso di analisi JSON.
id info event.idm.entity.metadata.description Mappato direttamente da info nell'oggetto JSON nidificato all'interno del campo "data". Utilizzato nel percorso di analisi JSON.
last_seen event.ioc.active_timerange.end Analizzata come timestamp nel formato "aaaa-MM-ggTHH:mm:ssZZ". Utilizzato nel percorso di analisi JSON.
Org.name event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Org.name e aggiunto come campo di rilevamento con la chiave "Nome dell'organizzazione". Utilizzato nel percorso di analisi JSON.
published event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da published e aggiunto come campo di rilevamento con chiave "published". Utilizzato nel percorso di analisi JSON.
Tag.colour event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.colour e aggiunto come campo di rilevamento con chiave "colore tag". Utilizzato nel percorso di analisi JSON.
Tag.exportable event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.exportable e aggiunto come campo di rilevamento con la chiave "tag esportabile". Utilizzato nel percorso di analisi JSON.
Tag.hide_tag event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.hide_tag e aggiunto come campo di rilevamento con chiave "tag hide_tag". Utilizzato nel percorso di analisi JSON.
Tag.id event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.id e aggiunto come campo di rilevamento con chiave "tag id". Utilizzato nel percorso di analisi JSON.
Tag.is_custom_galaxy event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.is_custom_galaxy e aggiunto come campo di rilevamento con la chiave "tag is_custom_galaxy". Utilizzato nel percorso di analisi JSON.
Tag.is_galaxy event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.is_galaxy e aggiunto come campo di rilevamento con la chiave "tag is_galaxy". Utilizzato nel percorso di analisi JSON.
Tag.isinherited event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.isinherited e aggiunto come campo di rilevamento con la chiave "tag isinherited". Utilizzato nel percorso di analisi JSON.
Tag.name event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.name e aggiunto come campo di rilevamento con chiave "nome tag". Utilizzato nel percorso di analisi JSON.
Tag.numerical_value event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.numerical_value e aggiunto come campo di rilevamento con chiave "tag numerical_value". Utilizzato nel percorso di analisi JSON.
Tag.user_id event.idm.entity.metadata.threat.detection_fields.value Mappato direttamente da Tag.user_id e aggiunto come campo di rilevamento con chiave "tag user_id". Utilizzato nel percorso di analisi JSON.
threat_level_id event.idm.entity.entity.labels.value Mappato direttamente da threat_level_id e aggiunto come etichetta con la chiave "threat_level_id". Utilizzato nel percorso di analisi JSON.
timestamp event.idm.entity.metadata.collected_timestamp, event.idm.entity.metadata.interval.start_time Analizzata come timestamp UNIX. Utilizzato nel percorso di analisi CSV.
uuid event.idm.entity.metadata.vendor_name Impostato su "MISP" dall'analizzatore. Impostato su "MISP" dall'analizzatore. Impostato su un valore predefinito molto lontano nel futuro (253402300799 secondi dall'epoca). Determinato dal parser in base al campo type o log_type. Può essere "FILE", "DOMAIN_NAME", "IP_ADDRESS", "MUTEX", "RESOURCE" o "USER". Può essere dedotto da Attribute.comment o Attribute.value a seconda di Attribute.type. Analizzata da Attribute.value o column5 se il tipo è correlato all'IP. Analizzata da Attribute.value o column5 se il tipo è "ip-dst|port". Dedotto da column3 nell'analisi CSV o da Attribute.category nell'analisi JSON. Derivato da column21 e column14 nell'analisi CSV. Derivato da column8 o first_seen. Derivata da last_seen. Dedotto da description utilizzando un pattern grok. Dedotto da column16 o impostato su "MISP". Derivata da column18. Analizzata da Attribute.value o column5 se il tipo è correlato all'IP. Analizzata da Attribute.value o column5 se il tipo è "ip-dst|port". Derivato da Attribute.value o column5 se il tipo è "domain". Derivato dal campo confidence, che viene estratto dal campo description. I valori possono essere "HIGH_CONFIDENCE", "MEDIUM_CONFIDENCE", "LOW_CONFIDENCE" o "UNKNOWN_CONFIDENCE". Mappato direttamente dal campo confidence, che viene estratto dal campo description. Mappato direttamente dal campo threat_level, che deriva da column18 nel percorso di analisi CSV. Mappato direttamente dal campo feed_name, che deriva da column16 nel percorso di analisi CSV. Derivato da column21 e column14 nell'analisi CSV. Dedotto da column6 nell'analisi CSV o da Attribute.comment nell'analisi JSON. Vengono aggiunti diversi campi di rilevamento con le relative chiavi. Vengono aggiunti diversi campi come etichette con le relative chiavi. Copiato dal campo timestamp di primo livello nel log non elaborato.

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.