Mengumpulkan log IOC MISP

Didukung di:

Panduan ini menguraikan langkah-langkah untuk menyerap log IOC (Indikator Kompromi) MISP (Malware Information Sharing Platform) ke Google Security Operations menggunakan Bindplane. Parser mengekstrak IOC dari data MISP yang diformat sebagai JSON atau CSV. Alat ini mem-parsing input, memetakan kolom ke Model Data Terpadu (UDM), menangani berbagai jenis IOC (seperti hash IP, domain, dan file), serta memperkaya data dengan konteks intelijen ancaman seperti tingkat keyakinan dan tingkat keparahan. Parser juga menjalankan logika khusus untuk format data yang berbeda dan menangani kasus dengan kolom yang tidak ada atau tidak didukung.

Sebelum memulai

Pastikan Anda memenuhi prasyarat berikut:

  • Instance Google SecOps
  • Host Linux dengan systemd
  • Jika dijalankan di belakang proxy, port firewall terbuka
  • Akses istimewa ke server MISP Anda

Mendapatkan Kunci API MISP

  1. Login ke UI web MISP Anda sebagai Administrator.
  2. Buka Administrasi > List Auth Keys.
  3. Klik Tambahkan kunci autentikasi.
  4. Berikan konfigurasi Kunci berikut:
    • Pengguna: Pilih akun pengguna yang terkait dengan kunci.
    • IP yang diizinkan: Anda dapat secara opsional menentukan alamat IP yang diizinkan untuk kunci.
    • Salin dan simpan kunci di lokasi yang aman.
    • Klik Saya telah mencatat kunci saya.

Mengonfigurasi ekspor log MISP

  1. Login ke instance MISP Anda menggunakan SSH.
  2. Instal PyMISP menggunakan perintah berikut:

    pip3 install pymisp 
    
  3. Ubah skrip ekspor get_csv.py menggunakan hal berikut:

    #!/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. Edit file keys.py untuk menyertakan kredensial dan URL MISP API Anda, sebagai berikut:

    misp_url = 'https://<MISP_URL>'
    misp_key = '<MISP_API_KEY>'
    misp_verifycert = False
    misp_client_cert = ''
    
    • Ganti <MISP_URL> dengan IP atau nama host MISP Anda.
    • Ganti <MISP_API_KEY dengan kunci API sebenarnya yang dibuat sebelumnya.
  5. Buka crontab menggunakan perintah crontab -e dan masukkan berikut ini:

    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
    
    • Perbarui <YOUR_EXPORT_SCRIPT_PATH> sesuai dengan lokasi skrip ekspor sebenarnya.

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.

Menginstal agen Bindplane di Server MISP

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-agent/releases/latest/download/install_unix.sh)" install_unix.sh
    

Referensi penginstalan tambahan

Untuk opsi penginstalan tambahan, lihat panduan penginstalan.

Mengonfigurasi agen BindPlane untuk menyerap file 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, atau Notepad).
  2. Edit file config.yaml sebagai berikut:

    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
    
    • Ganti port dan alamat IP sesuai kebutuhan di infrastruktur Anda.
    • Ganti <customer_id> dengan ID Pelanggan yang sebenarnya.
    • Perbarui /path/to/ingestion-authentication-file.json ke jalur tempat file autentikasi disimpan di bagian Dapatkan file autentikasi penyerapan Google SecOps.

Mulai ulang agen Bindplane untuk menerapkan perubahan

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

  sudo systemctl restart bindplane-agent

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
Attribute.category event.idm.entity.metadata.threat.category_details Dipetakan langsung dari Attribute.category dalam objek JSON bertingkat di dalam kolom "data". Digunakan di jalur penguraian JSON.
Attribute.comment event.idm.entity.metadata.threat.summary Dipetakan langsung dari Attribute.comment dalam objek JSON bertingkat di dalam kolom "data". Digunakan di jalur penguraian JSON.
Attribute.deleted event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Attribute.deleted dan ditambahkan sebagai kolom deteksi dengan kunci "Attribute deleted". Digunakan di jalur penguraian JSON.
Attribute.event_id event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Attribute.event_id dan ditambahkan sebagai kolom deteksi dengan kunci "Attribute event_id". Digunakan di jalur penguraian JSON.
Attribute.first_seen event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Attribute.first_seen dan ditambahkan sebagai kolom deteksi dengan kunci "Attribute first_seen". Digunakan di jalur penguraian JSON.
Attribute.id event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Attribute.id dan ditambahkan sebagai kolom deteksi dengan kunci "ID atribut" atau "ID atribut $$" bergantung pada jalur penguraian. Digunakan di jalur penguraian CSV dan JSON.
Attribute.timestamp event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Attribute.timestamp dan ditambahkan sebagai kolom deteksi dengan kunci "Stempel waktu atribut". Digunakan di jalur penguraian JSON.
Attribute.to_ids event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Attribute.to_ids dan ditambahkan sebagai kolom deteksi dengan kunci "Attribute to_ids". Digunakan di jalur penguraian JSON.
Attribute.type log_type Dipetakan langsung dari Attribute.type dalam objek JSON bertingkat di dalam kolom "data". Digunakan sebagai kolom sementara, dan selanjutnya digunakan untuk mengisi kolom UDM lainnya. Digunakan di jalur penguraian JSON.
Attribute.uuid event.idm.entity.metadata.product_entity_id Dipetakan langsung dari Attribute.uuid dalam objek JSON bertingkat di dalam kolom "data". Digunakan di jalur penguraian JSON.
Attribute.value Beberapa Nilai kolom ini digunakan untuk mengisi beberapa kolom UDM, bergantung pada Attribute.type (atau log_type jika berasal dari Attribute.type):
- event.idm.entity.entity.hostname jika type adalah "domain".
- event.idm.entity.entity.file.md5 jika type adalah "md5".
- event.idm.entity.entity.file.sha1 jika type adalah "sha1".
- event.idm.entity.entity.file.sha256 jika type adalah "sha256".
- event.idm.entity.entity.resource.name jika type adalah "mutex".
- event.idm.entity.entity.registry.registry_key jika type adalah "regkey".
- event.idm.entity.entity.user.email_addresses jika type adalah "aktor ancaman".
- event.idm.entity.entity.url jika type adalah uri atau url.
- event.idm.entity.entity.file.full_path jika type adalah "filename".
- Diparsing untuk IP dan port jika type adalah "ip-dst|port", "ip-dst", atau "ip-src". Digunakan di jalur penguraian JSON.
column1 event.idm.entity.metadata.product_entity_id Dipetakan langsung dari column1 di jalur penguraian CSV.
column14 Bagian dari event.idm.entity.metadata.threat.description Digabungkan dengan description untuk membentuk deskripsi akhir dalam metadata ancaman. Digunakan di jalur penguraian CSV.
column16 event.idm.entity.metadata.threat.threat_feed_name, event.ioc.feed_name Dipetakan langsung dari column16. Digunakan di jalur penguraian CSV.
column18 event.idm.entity.metadata.threat.severity_details, event.ioc.raw_severity Dipetakan langsung dari column18. Digunakan di jalur penguraian CSV.
column21 Bagian dari event.idm.entity.metadata.threat.description, event.ioc.description Digunakan sebagai dasar untuk deskripsi, yang kemudian digabungkan dengan event_info. Digunakan di jalur penguraian CSV.
column3 Bagian dari event.ioc.categorization Dipetakan langsung dari column3 dan digabungkan dengan "IOC" untuk membentuk kategorisasi akhir. Digunakan di jalur penguraian CSV.
column4 event.idm.entity.metadata.description Dipetakan langsung dari column4. Digunakan di jalur penguraian CSV.
column5 Beberapa Nilai kolom ini digunakan untuk mengisi beberapa kolom UDM, bergantung pada kolom column4 (yang dipetakan ke type):
- event.idm.entity.entity.hostname jika type adalah "domain".
- Diparsing untuk IP dan port jika type adalah "ip-dst|port", "ip-dst", atau "ip-src".
- event.idm.entity.entity.file.md5 jika type adalah "md5".
- event.idm.entity.entity.file.sha1 jika type adalah "sha1".
- event.idm.entity.entity.file.sha256 jika type adalah "sha256".
- event.idm.entity.entity.resource.name jika type adalah "mutex".
- event.idm.entity.entity.registry.registry_key jika type adalah "regkey".
- event.idm.entity.entity.user.email_addresses jika type adalah "aktor ancaman".
- event.idm.entity.entity.url jika type adalah uri atau url.
- event.idm.entity.entity.file.full_path jika type adalah "filename". Digunakan di jalur penguraian CSV.
column6 event.idm.entity.metadata.threat.summary Dipetakan langsung dari column6. Digunakan di jalur penguraian CSV.
column8 event.ioc.active_timerange.start, event.idm.entity.metadata.interval.start_time Diuraikan sebagai stempel waktu UNIX. Digunakan di jalur penguraian CSV.
date description event.idm.entity.metadata.threat.description Dipetakan langsung dari description dalam objek JSON bertingkat di dalam kolom "data". Digunakan di jalur penguraian JSON.
event_creator_email event.idm.entity.entity.labels.value Dipetakan langsung dari event_creator_email dan ditambahkan sebagai label dengan kunci "event_creator_email". Digunakan di jalur penguraian JSON.
event_id Feed.publish event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Feed.publish dan ditambahkan sebagai kolom deteksi dengan kunci "Feed publish". Digunakan di jalur penguraian JSON.
first_seen event.ioc.active_timerange.start, event.idm.entity.metadata.interval.start_time Diuraikan sebagai stempel waktu dalam format "yyyy-MM-ddTHH:mm:ssZZ". Digunakan di jalur penguraian JSON.
id info event.idm.entity.metadata.description Dipetakan langsung dari info dalam objek JSON bertingkat di dalam kolom "data". Digunakan di jalur penguraian JSON.
last_seen event.ioc.active_timerange.end Diuraikan sebagai stempel waktu dalam format "yyyy-MM-ddTHH:mm:ssZZ". Digunakan di jalur penguraian JSON.
Org.name event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Org.name dan ditambahkan sebagai kolom deteksi dengan kunci "Nama org". Digunakan di jalur penguraian JSON.
published event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari published dan ditambahkan sebagai kolom deteksi dengan kunci "published". Digunakan di jalur penguraian JSON.
Tag.colour event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.colour dan ditambahkan sebagai kolom deteksi dengan kunci "tag colour". Digunakan di jalur penguraian JSON.
Tag.exportable event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.exportable dan ditambahkan sebagai kolom deteksi dengan kunci "tag exportable". Digunakan di jalur penguraian JSON.
Tag.hide_tag event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.hide_tag dan ditambahkan sebagai kolom deteksi dengan kunci "tag hide_tag". Digunakan di jalur penguraian JSON.
Tag.id event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.id dan ditambahkan sebagai kolom deteksi dengan kunci "tag id". Digunakan di jalur penguraian JSON.
Tag.is_custom_galaxy event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.is_custom_galaxy dan ditambahkan sebagai kolom deteksi dengan kunci "tag is_custom_galaxy". Digunakan di jalur penguraian JSON.
Tag.is_galaxy event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.is_galaxy dan ditambahkan sebagai kolom deteksi dengan kunci "tag is_galaxy". Digunakan di jalur penguraian JSON.
Tag.isinherited event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.isinherited dan ditambahkan sebagai kolom deteksi dengan kunci "tag isinherited". Digunakan di jalur penguraian JSON.
Tag.name event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.name dan ditambahkan sebagai kolom deteksi dengan kunci "nama tag". Digunakan di jalur penguraian JSON.
Tag.numerical_value event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.numerical_value dan ditambahkan sebagai kolom deteksi dengan kunci "tag numerical_value". Digunakan di jalur penguraian JSON.
Tag.user_id event.idm.entity.metadata.threat.detection_fields.value Dipetakan langsung dari Tag.user_id dan ditambahkan sebagai kolom deteksi dengan kunci "tag user_id". Digunakan di jalur penguraian JSON.
threat_level_id event.idm.entity.entity.labels.value Dipetakan langsung dari threat_level_id dan ditambahkan sebagai label dengan kunci "threat_level_id". Digunakan di jalur penguraian JSON.
timestamp event.idm.entity.metadata.collected_timestamp, event.idm.entity.metadata.interval.start_time Diuraikan sebagai stempel waktu UNIX. Digunakan di jalur penguraian CSV.
uuid event.idm.entity.metadata.vendor_name Ditetapkan ke "MISP" oleh parser. Ditetapkan ke "MISP" oleh parser. Ditetapkan ke nilai default yang jauh di masa mendatang (253402300799 detik sejak epoch). Ditentukan oleh parser berdasarkan kolom type atau log_type. Dapat berupa "FILE", "DOMAIN_NAME", "IP_ADDRESS", "MUTEX", "RESOURCE", atau "USER". Dapat berasal dari Attribute.comment atau Attribute.value, bergantung pada Attribute.type. Diuraikan dari Attribute.value atau column5 jika jenisnya terkait IP. Diuraikan dari Attribute.value atau column5 jika jenisnya adalah "ip-dst|port". Berasal dari column3 dalam penguraian CSV atau Attribute.category dalam penguraian JSON. Diperoleh dari column21 dan column14 dalam penguraian CSV. Berasal dari column8 atau first_seen. Diperoleh dari last_seen. Diperoleh dari description menggunakan pola grok. Diperoleh dari column16 atau ditetapkan ke "MISP". Diperoleh dari column18. Diuraikan dari Attribute.value atau column5 jika jenisnya terkait IP. Diuraikan dari Attribute.value atau column5 jika jenisnya adalah "ip-dst|port". Diperoleh dari Attribute.value atau column5 jika jenisnya adalah "domain". Diperoleh dari kolom confidence, yang diekstrak dari kolom description. Nilainya dapat berupa "HIGH_CONFIDENCE", "MEDIUM_CONFIDENCE", "LOW_CONFIDENCE", atau "UNKNOWN_CONFIDENCE". Dipetakan langsung dari kolom confidence, yang diekstrak dari kolom description. Dipetakan langsung dari kolom threat_level, yang berasal dari column18 di jalur penguraian CSV. Dipetakan langsung dari kolom feed_name, yang berasal dari column16 di jalur penguraian CSV. Diperoleh dari column21 dan column14 dalam penguraian CSV. Berasal dari column6 dalam penguraian CSV atau Attribute.comment dalam penguraian JSON. Beberapa kolom ditambahkan sebagai kolom deteksi dengan kunci yang sesuai. Beberapa kolom ditambahkan sebagai label dengan kunci yang sesuai. Disalin dari kolom timestamp tingkat teratas dalam log mentah.

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