Mengumpulkan log IOC MISP

Didukung di:

Dokumen ini menjelaskan cara menyerap log IOC (Indikator Kompromi) MISP (Malware Information Sharing Platform) ke Google Security Operations menggunakan Bindplane. Parser memproses data dalam format CSV dan JSON. Alat ini mengekstrak atribut IOC seperti alamat IP, domain, hash, dan URL, memetakannya ke model data terpadu (UDM) bersama dengan detail ancaman seperti tingkat keparahan, keyakinan, dan deskripsi. Parser menangani satu dan beberapa entri IOC dalam data input, menormalisasinya ke dalam output UDM yang konsisten.

Sebelum memulai

Pastikan Anda memenuhi prasyarat berikut:

  • Instance Google SecOps.
  • Host Linux dengan systemd.
  • Jika berjalan di belakang proxy, pastikan port firewall terbuka sesuai dengan persyaratan agen BindPlane.
  • Akses istimewa ke server MISP Anda.

Mendapatkan file autentikasi penyerapan Google SecOps

  1. Login ke konsol Google SecOps.
  2. Buka Setelan SIEM > Agen Pengumpulan.
  3. Download File Autentikasi Penyerapan.
    • Simpan file dengan aman di sistem tempat BindPlane akan diinstal.

Mendapatkan ID pelanggan Google SecOps

  1. Login ke konsol Google SecOps.
  2. Buka Setelan SIEM*> Profil.
  3. Salin dan simpan ID Pelanggan dari bagian Detail organisasi.

Mendapatkan kredensial MISP API

  1. Login ke antarmuka web MISP Anda sebagai Administrator.
  2. Buka Administrasi > List Auth Keys.
  3. Klik Tambahkan kunci autentikasi.
  4. Berikan detail konfigurasi berikut:
    • Pengguna: Pilih akun pengguna yang terkait dengan kunci.
    • Opsional: IP yang diizinkan: Tentukan alamat IP yang diizinkan untuk kunci.
    • Masa berlaku: Biarkan kosong jika tidak ada masa berlaku atau tetapkan sesuai kebutuhan.
  5. Klik Kirim.
  6. Salin dan simpan kunci API di lokasi yang aman.
  7. Klik Saya telah mencatat kunci saya.

Mengonfigurasi ekspor data MISP

  1. Instal PyMISP di server MISP Anda:

    pip3 install pymisp
    
  2. Buat direktori ekspor:

    sudo mkdir -p /opt/misp/scripts
    sudo mkdir -p /opt/misp/ioc_export
    
  3. Buat file kredensial /opt/misp/scripts/keys.py:

    misp_url = 'https://<MISP_SERVER_URL>'
    misp_key = '<MISP_API_KEY>'
    misp_verifycert = True
    misp_client_cert = ''
    
    • Ganti <MISP_SERVER_URL> dengan URL server MISP Anda.
    • Ganti <MISP_API_KEY> dengan kunci API dari prasyarat.
  4. Buat skrip ekspor /opt/misp/scripts/misp_export.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='Export MISP IOCs to CSV format.')
        parser.add_argument("--controller", default='attributes',
                            help="Controller to use for search (events, objects, attributes)")
        parser.add_argument("--event_id",
                            help="Event ID to fetch. Without it, fetches recent data.")
        parser.add_argument("--attributes", nargs='*',
                            help="Requested attributes for CSV export")
        parser.add_argument("--misp_types", nargs='+',
                            help="MISP types to fetch (ip-src, hostname, domain, etc.)")
        parser.add_argument("--context", action='store_true',
                            help="Add event level context (tags, metadata)")
        parser.add_argument("--outfile", required=True,
                            help="Output file to write the CSV data")
        parser.add_argument("--last", required=True,
                            help="Time period: days (d), hours (h), minutes (m) - e.g., 1d, 12h, 30m")
    
        args = parser.parse_args()
    
        api = ExpandedPyMISP(misp_url, misp_key, misp_verifycert, debug=False)
    
        response = api.search(
            controller=args.controller,
            return_format='csv',
            type_attribute=args.misp_types,
            publish_timestamp=args.last,
            include_context=args.context,
            requested_attributes=args.attributes or None
        )
    
        with open(args.outfile, 'w') as response_file:
            response_file.write(response)
    
    1. Setel agar skrip dapat dieksekusi:
    sudo chmod +x /opt/misp/scripts/misp_export.py
    

    Menjadwalkan ekspor data MISP

    1. Buat ekspor terjadwal menggunakan crontab:
    sudo crontab -e
    
  5. Tambahkan entri cron berikut:

    # Export different IOC types daily with context
    0 0 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/domains.csv --misp_types domain --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 1 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/ip-src.csv --misp_types ip-src --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 2 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/ip-dst.csv --misp_types ip-dst --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 3 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/urls.csv --misp_types url --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 4 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/sha256.csv --misp_types sha256 --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 5 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/filenames.csv --misp_types filename --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 6 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/registries.csv --misp_types regkey --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    0 7 * * * python3 /opt/misp/scripts/misp_export.py --outfile /opt/misp/ioc_export/mutexes.csv --misp_types mutex --last 1d --context --attributes uuid event_id category type value comment to_ids date attribute_tag event_info
    
  6. Atau, jadwalkan penarikan feed dari MISP:

    23 0 * * * curl --insecure --header "Authorization: <MISP_API_KEY>" --header "Accept: application/json" --header "Content-Type: application/json" https://<MISP_SERVER_URL>/feeds/fetchFromAllFeeds
    

Menginstal agen Bindplane

Instal agen Bindplane di sistem operasi Linux Anda sesuai dengan petunjuk berikut.

Penginstalan Linux

  1. Buka terminal dengan hak istimewa root atau sudo.
  2. Jalankan perintah berikut:

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

Referensi penginstalan tambahan

Mengonfigurasi agen BindPlane untuk menyerap log MISP dan mengirimkannya ke Google SecOps

  1. Akses file konfigurasi:

    • Cari file config.yaml. Biasanya, file ini berada di direktori /etc/bindplane-agent/ di Linux.
    • Buka file menggunakan editor teks (misalnya, nano, vi).
  2. Edit file config.yaml sebagai berikut:

    receivers:
        filelog:
            file_path: /opt/misp/ioc_export/*.log
    
    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
    
    • Ganti <CUSTOMER_ID> dengan ID Pelanggan Anda yang sebenarnya dari prasyarat.
    • Perbarui /path/to/ingestion-authentication-file.json ke jalur tempat file autentikasi disimpan.

Mulai ulang agen Bindplane untuk menerapkan perubahan

  1. Untuk memulai ulang agen Bindplane di Linux, jalankan perintah berikut:

    sudo systemctl restart observiq-otel-collector
    

Tabel pemetaan UDM

Kolom log Pemetaan UDM Logika
Attribute.category entity.metadata.threat.category_details Pemetaan langsung dari kolom category di objek Attribute.
Attribute.comment entity.metadata.threat.summary Pemetaan langsung dari kolom comment di objek Attribute.
Attribute.deleted entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom deleted di objek Attribute. Kunci disetel ke Attribute deleted.
Attribute.event_id entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom event_id di objek Attribute. Kunci disetel ke Attribute event_id.
Attribute.first_seen entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom first_seen di objek Attribute. Kunci disetel ke Attribute first_seen.
Attribute.id entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom id di objek Attribute. Kunci disetel ke Attribute id atau Attribute id $$, bergantung pada format log mentah.
Attribute.timestamp entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom timestamp di objek Attribute. Kunci disetel ke Attribute timestamp.
Attribute.to_ids entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom to_ids di objek Attribute. Kunci disetel ke Attribute to_ids.
Attribute.type entity.metadata.threat.category_details Pemetaan langsung dari kolom type di objek Attribute.
Attribute.type log_type Digunakan untuk menentukan jenis IOC dan memetakannya ke kolom UDM yang sesuai.
Attribute.uuid entity.metadata.product_entity_id Pemetaan langsung dari kolom uuid di objek Attribute.
Attribute.value entity.entity.file.full_path Dipetakan jika Attribute.type adalah filename.
Attribute.value entity.entity.file.md5 Dipetakan jika Attribute.type adalah md5.
Attribute.value entity.entity.file.sha1 Dipetakan jika Attribute.type adalah sha1.
Attribute.value entity.entity.file.sha256 Dipetakan jika Attribute.type adalah sha256.
Attribute.value entity.entity.hostname Dipetakan jika Attribute.type adalah domain.
Attribute.value entity.entity.ip Dipetakan jika Attribute.type adalah ip-dst, ip-dst|port, atau ip-src. Nilai diekstrak menggunakan pola grok.
Attribute.value entity.entity.resource.name Dipetakan jika Attribute.type adalah mutex.
Attribute.value entity.entity.registry.registry_key Dipetakan jika Attribute.type adalah regkey.
Attribute.value entity.entity.url Dipetakan jika Attribute.type adalah uri atau URL.
kolom1 entity.metadata.product_entity_id Pemetaan langsung dari kolom pertama dalam data CSV.
column14 event_info Digunakan untuk menambahkan informasi tambahan ke kolom threat_sr.description.
column16 event_source_org Pemetaan langsung dari kolom ke-16 dalam data CSV.
column18 threat_level Pemetaan langsung dari kolom ke-18 dalam data CSV.
column21 deskripsi Pemetaan langsung dari kolom ke-21 dalam data CSV.
kolom3 misp_category Pemetaan langsung dari kolom ketiga dalam data CSV.
column4 jenis Pemetaan langsung dari kolom keempat dalam data CSV.
column5 value Pemetaan langsung dari kolom kelima dalam data CSV.
column6 komentar Pemetaan langsung dari kolom keenam dalam data CSV.
column8 ts1 Pemetaan langsung dari kolom kedelapan dalam data CSV.
deskripsi ioc.description Nilai dihasilkan dengan menggabungkan kolom description dengan kolom event_info, yang dipisahkan oleh - additional info:.
deskripsi entity.metadata.threat.description Pemetaan langsung dari kolom description.
event_creator_email entity.entity.labels.value Pemetaan langsung dari kolom event_creator_email. Kunci disetel ke event_creator_email.
event_source_org ioc.feed_name Pemetaan langsung dari kolom event_source_org.
event_source_org entity.metadata.threat.threat_feed_name Pemetaan langsung dari kolom event_source_org.
Feed.publish entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom publish di objek Feed. Kunci disetel ke Feed publish.
first_seen ioc.active_timerange.start Pemetaan langsung dari kolom first_seen. Nilai diuraikan sebagai tanggal.
first_seen entity.metadata.interval.start_time Pemetaan langsung dari kolom first_seen. Nilai diuraikan sebagai tanggal.
info entity.metadata.description Pemetaan langsung dari kolom info.
last_seen ioc.active_timerange.end Pemetaan langsung dari kolom last_seen. Nilai diuraikan sebagai tanggal.
log.category ioc.categorization Pemetaan langsung dari kolom category di objek log.
log.category entity.metadata.threat.category_details Pemetaan langsung dari kolom category di objek log.
log.comment entity.entity.file.full_path Dipetakan jika log.type adalah filename dan kolom comment bukan Artifacts dropped.
log.comment entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom comment di objek log. Kunci disetel ke Attribute comment.
log.comment entity.metadata.threat.summary Pemetaan langsung dari kolom comment di objek log.
log.deleted entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom deleted di objek log. Kunci disetel ke Attribute deleted.
log.event_id entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom event_id di objek log. Kunci disetel ke Attribute event_id.
log.first_seen entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom first_seen di objek log. Kunci disetel ke Attribute first_seen.
log.id entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom id di objek log. Kunci disetel ke Attribute id.
log.timestamp entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom timestamp di objek log. Kunci disetel ke Attribute timestamp.
log.to_ids entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom to_ids di objek log. Kunci disetel ke Attribute to_ids.
log.type ioc.categorization Pemetaan langsung dari kolom type di objek log.
log.type log_type Digunakan untuk menentukan jenis IOC dan memetakannya ke kolom UDM yang sesuai.
log.uuid entity.metadata.product_entity_id Pemetaan langsung dari kolom uuid di objek log.
log.value entity.entity.file.full_path Dipetakan jika log.type adalah filename.
log.value entity.entity.file.md5 Dipetakan jika log.type adalah md5.
log.value entity.entity.file.sha1 Dipetakan jika log.type adalah sha1.
log.value entity.entity.file.sha256 Dipetakan jika log.type adalah sha256.
log.value entity.entity.hostname Dipetakan jika log.type adalah domain.
log.value entity.entity.ip Dipetakan jika log.type adalah ip-dst, ip-dst|port, atau ip-src. Nilai diekstrak menggunakan pola grok.
log.value entity.entity.resource.name Dipetakan jika log.type adalah mutex.
log.value entity.entity.registry.registry_key Dipetakan jika log.type adalah regkey.
log.value entity.entity.url Dipetakan jika log.type adalah uri atau url.
log.value ioc.domain_and_ports.domain Dipetakan jika log.type adalah domain.
log.value entity.entity.user.email_addresses Dipetakan jika log.type adalah threat-actor.
misp_category entity.metadata.threat.category_details Pemetaan langsung dari kolom misp_category.
Org.name entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom name di objek Org. Kunci disetel ke Org name.
dipublikasikan entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom published. Kunci disetel ke published.
Tag.colour entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom colour di objek Tag. Kunci disetel ke tag colour.
Tag.exportable entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom exportable di objek Tag. Kunci disetel ke tag exportable.
Tag.hide_tag entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom hide_tag di objek Tag. Kunci disetel ke tag hide_tag.
Tag.id entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom id di objek Tag. Kunci disetel ke tag id.
Tag.is_custom_galaxy entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom is_custom_galaxy di objek Tag. Kunci disetel ke tag is_custom_galaxy.
Tag.is_galaxy entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom is_galaxy di objek Tag. Kunci disetel ke tag is_galaxy.
Tag.isinherited entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom isinherited di objek Tag. Kunci disetel ke tag isinherited.
Tag.name entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom name di objek Tag. Kunci disetel ke tag name.
Tag.numerical_value entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom numerical_value di objek Tag. Kunci disetel ke tag numerical_value.
Tag.user_id entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom user_id di objek Tag. Kunci disetel ke tag user_id.
threat_level ioc.raw_severity Pemetaan langsung dari kolom threat_level.
threat_level entity.metadata.threat.severity_details Pemetaan langsung dari kolom threat_level.
threat_level_id entity.entity.labels.value Pemetaan langsung dari kolom threat_level_id. Kunci disetel ke threat_level_id.
ts1 ioc.active_timerange.start Pemetaan langsung dari kolom ts1. Nilai diuraikan sebagai tanggal.
ts1 entity.metadata.interval.start_time Pemetaan langsung dari kolom ts1. Nilai diuraikan sebagai tanggal.
entity.entity.file.full_path Dipetakan jika type adalah filename.
entity.entity.file.md5 Dipetakan jika type adalah md5.
entity.entity.file.sha1 Dipetakan jika type adalah sha1.
entity.entity.file.sha256 Dipetakan jika type adalah sha256.
entity.entity.hostname Dipetakan jika type adalah domain.
entity.entity.ip Dipetakan jika type adalah ip-dst, ip-dst|port, atau ip-src. Nilai diekstrak menggunakan pola grok.
entity.entity.port Dipetakan jika kolom port tidak kosong. Nilai dikonversi menjadi bilangan bulat.
entity.entity.resource.name Dipetakan jika type adalah mutex.
entity.entity.resource.resource_subtype Dipetakan jika type adalah regkey. Nilai ditetapkan ke regkey.
entity.entity.resource.resource_type Dipetakan jika type adalah mutex atau regkey. Nilai ditetapkan ke MUTEX atau STORAGE_OBJECT.
entity.entity.registry.registry_key Dipetakan jika type adalah regkey.
entity.entity.url Dipetakan jika type adalah uri atau url.
entity.metadata.collected_timestamp Nilai ditetapkan ke stempel waktu entri log mentah.
entity.metadata.description Nilai ditetapkan ke kolom type jika log mentah dalam format CSV. Jika tidak, nilai ini akan ditetapkan ke kolom info.
entity.metadata.entity_type Nilai ditentukan berdasarkan kolom type atau log_type. Dapat berupa DOMAIN_NAME, FILE, IP_ADDRESS, MUTEX, RESOURCE, atau URL.
entity.metadata.interval.end_time Nilai ditetapkan ke nilai default 253402300799 detik.
entity.metadata.interval.start_time Nilai ditetapkan ke kolom first_seen jika tidak kosong. Jika tidak, nilai ini ditetapkan ke nilai default 1 detik atau stempel waktu entri log mentah.
entity.metadata.product_name Nilai ditetapkan ke MISP.
entity.metadata.threat.confidence Nilai ditetapkan ke UNKNOWN_CONFIDENCE jika kolom confidence kosong atau f. Jika tidak, nilai ini ditetapkan ke HIGH_CONFIDENCE, MEDIUM_CONFIDENCE, atau LOW_CONFIDENCE berdasarkan nilai kolom confidence.
entity.metadata.threat.confidence_details Pemetaan langsung dari kolom confidence.
entity.metadata.threat.detection_fields Nilainya adalah daftar key-value pair yang diekstrak dari berbagai kolom dalam log mentah.
entity.metadata.vendor_name Nilai ditetapkan ke MISP.
ioc.active_timerange.end Nilai ditetapkan ke kolom last_seen jika tidak kosong.
ioc.active_timerange.start Nilai ditetapkan ke kolom ts1 atau first_seen jika tidak kosong. Jika tidak, nilai ini ditetapkan ke nilai default 1 detik.
ioc.categorization Nilai ditetapkan ke misp_category IOCs jika log mentah dalam format CSV. Jika tidak, nilai ini akan ditetapkan ke kolom category dalam objek Attribute atau log.
ioc.confidence_score Pemetaan langsung dari kolom confidence.
ioc.description Nilai dihasilkan dengan menggabungkan kolom description dengan kolom event_info, yang dipisahkan oleh - additional info:.
ioc.domain_and_ports.domain Dipetakan jika type atau log_type adalah domain.
ioc.feed_name Nilai ditetapkan ke MISP jika kolom event_source_org kosong. Jika tidak, nilai ini akan ditetapkan ke kolom event_source_org.
ioc.ip_and_ports.ip_address Dipetakan jika kolom ip tidak kosong. Nilai dikonversi menjadi alamat IP.
ioc.ip_and_ports.ports Dipetakan jika kolom port tidak kosong. Nilai dikonversi menjadi bilangan bulat yang tidak bertanda.
ioc.raw_severity Pemetaan langsung dari kolom threat_level.
timestamp Nilai ditetapkan ke stempel waktu entri log mentah.

Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.