Mengumpulkan log IOC MISP
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
- Login ke UI web MISP Anda sebagai Administrator.
- Buka Administrasi > List Auth Keys.
- Klik Tambahkan kunci autentikasi.
- 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
- Login ke instance MISP Anda menggunakan SSH.
Instal PyMISP menggunakan perintah berikut:
pip3 install pymisp
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)
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.
- Ganti
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.
- Perbarui
Mendapatkan file autentikasi penyerapan Google SecOps
- Login ke konsol Google SecOps.
- Buka Setelan SIEM > Agen Pengumpulan.
- Download File Autentikasi Penyerapan. Simpan file dengan aman di sistem tempat BindPlane akan diinstal.
Mendapatkan ID pelanggan Google SecOps
- Login ke konsol Google SecOps.
- Buka Setelan SIEM > Profil.
- Salin dan simpan ID Pelanggan dari bagian Detail Organisasi.
Menginstal agen Bindplane di Server MISP
Penginstalan Linux
- Buka terminal dengan hak istimewa root atau sudo.
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
- 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).
- Cari file
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.