Mengumpulkan log IOC MISP
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
- 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.
Mendapatkan kredensial MISP API
- Login ke antarmuka web MISP Anda sebagai Administrator.
- Buka Administrasi > List Auth Keys.
- Klik Tambahkan kunci autentikasi.
- 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.
- Klik Kirim.
- Salin dan simpan kunci API di lokasi yang aman.
- Klik Saya telah mencatat kunci saya.
Mengonfigurasi ekspor data MISP
Instal PyMISP di server MISP Anda:
pip3 install pymisp
Buat direktori ekspor:
sudo mkdir -p /opt/misp/scripts sudo mkdir -p /opt/misp/ioc_export
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.
- Ganti
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)
- Setel agar skrip dapat dieksekusi:
sudo chmod +x /opt/misp/scripts/misp_export.py
Menjadwalkan ekspor data MISP
- Buat ekspor terjadwal menggunakan crontab:
sudo crontab -e
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
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
- Buka terminal dengan hak istimewa root atau sudo.
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
- Untuk opsi penginstalan tambahan, lihat panduan penginstalan.
Mengonfigurasi agen BindPlane untuk menyerap 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
).
- Cari file
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.
- Ganti
Mulai ulang agen Bindplane untuk menerapkan perubahan
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.