Mengumpulkan log Group-IB Threat Intelligence
Dokumen ini menjelaskan cara menyerap log Group-IB Threat Intelligence ke Google Security Operations menggunakan Google Cloud Storage.
Group-IB Threat Intelligence & Attribution (TI&A) adalah platform cyber threat intelligence yang menyediakan data real-time tentang pelaku ancaman, indikator penyusupan (IOC), malware, infrastruktur perintah dan kontrol (C2), kredensial yang disusupi, kampanye phishing, dan kerentanan. Platform ini menggabungkan kecerdasan dari sumber web terbuka, deep web, dan dark web, sehingga memungkinkan tim keamanan mendeteksi dan merespons ancaman secara proaktif.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Akun TI&A Group-IB dengan akses API diaktifkan
- Akses ke portal TI&A Group-IB (
tap.group-ib.com) - Project Google Cloud dengan API berikut diaktifkan:
- Cloud Storage API
- Cloud Functions API
- Cloud Scheduler API
- Cloud Build API
Membuat kunci API Group-IB
- Login ke portal Group-IB TI&A di
https://tap.group-ib.com. - Klik nama Anda di pojok kanan atas, lalu pilih Profil.
- Klik Buka setelan saya.
- Buka tab Security and Access.
- Di bagian Personal token, klik Generate new token.
Salin dan simpan kunci API dengan aman.
Buat bucket Google Cloud Storage
- Buka Konsol Google Cloud.
- Pilih project Anda atau buat project baru.
- Di menu navigasi, buka Cloud Storage > Buckets.
- Klik Create bucket.
Berikan detail konfigurasi berikut:
Setelan Nilai Memberi nama bucket Anda Masukkan nama yang unik secara global (misalnya, groupib-ti-logs)Location type Pilih berdasarkan kebutuhan Anda (Region, Dual-region, Multi-region) Location Pilih lokasi (misalnya, us-central1)Storage class Standar (direkomendasikan untuk log yang sering diakses) Kontrol akses Seragam (direkomendasikan) Klik Create.
Men-deploy Cloud Function untuk mengambil data Group-IB
Buat Cloud Function yang menarik data threat intelligence dari Group-IB TI&A API dan menuliskannya ke bucket GCS sebagai file NDJSON agar dapat diserap oleh Google SecOps.
Buat Cloud Function
- Buka Konsol Google Cloud.
- Buka Cloud Functions.
- Klik Create Function.
Berikan detail konfigurasi berikut:
Setelan Nilai Lingkungan Generasi ke-2 Nama fungsi groupib-to-gcsRegion Pilih region yang paling dekat dengan bucket GCS Anda Jenis pemicu HTTPS Authentication Wajibkan autentikasi Memori yang dialokasikan 512 MB (tingkatkan jika mengambil koleksi besar) Waktu tunggu 540 detik Klik Berikutnya.
Tetapkan Runtime ke
Python 3.11(atau yang lebih baru).Tetapkan Entry point ke
main.Ganti konten
main.pydengan kode berikut:import json import os import requests import functions_framework from datetime import datetime, timedelta, timezone from urllib.parse import urljoin from requests.auth import HTTPBasicAuth from google.cloud import storage GIB_API_URL = os.environ.get('GIB_API_URL', 'https://tap.group-ib.com/api/v2/') GIB_USERNAME = os.environ.get('GIB_USERNAME') GIB_API_KEY = os.environ.get('GIB_API_KEY') GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'groupib-ti') COLLECTIONS = os.environ.get('GIB_COLLECTIONS', 'compromised/account,malware/cnc,apt/threat,hi/threat').split(',') DEFAULT_DAYS_BACK = int(os.environ.get('DEFAULT_DAYS_BACK', '3')) # Max items per request: 100 for most collections, 20 for apt/threat and hi/threat BIG_DATA_COLLECTIONS = ['apt/threat', 'hi/threat'] # File to persist seqUpdate values between runs (use GCS for durability) STATE_BLOB = '_state/seq_updates.json' def load_state(): """Load seqUpdate state from GCS.""" client = storage.Client() bucket = client.bucket(GCS_BUCKET) blob = bucket.blob(f"{GCS_PREFIX}/{STATE_BLOB}") if blob.exists(): return json.loads(blob.download_as_text()) return {} def save_state(state): """Save seqUpdate state to GCS.""" client = storage.Client() bucket = client.bucket(GCS_BUCKET) blob = bucket.blob(f"{GCS_PREFIX}/{STATE_BLOB}") blob.upload_from_string(json.dumps(state), content_type='application/json') def gib_request(session, url, params=None): """Send authenticated GET request to Group-IB API.""" resp = session.get(url, params=params) if resp.status_code == 301: raise Exception('IP not whitelisted by Group-IB. Contact Group-IB support.') resp.raise_for_status() return resp.json() def get_seq_update_by_date(session, collection, date_str): """Get seqUpdate value for a collection starting from a given date.""" url = urljoin(GIB_API_URL, 'sequence_list') data = gib_request(session, url, {'date': date_str, 'collection': collection}) return data.get('list', {}).get(collection) def fetch_collection(session, collection, seq_update): """Fetch all new items from a collection starting after the given seqUpdate.""" limit = 20 if collection in BIG_DATA_COLLECTIONS else 100 url = urljoin(GIB_API_URL, f"{collection}/updated") all_items = [] last_seq = seq_update while True: data = gib_request(session, url, {'seqUpdate': str(last_seq), 'limit': limit}) items = data.get('items', []) if not items: break all_items.extend(items) last_seq = items[-1].get('seqUpdate') return all_items, last_seq def write_to_gcs(items, collection_name): """Write items to GCS as NDJSON.""" if not items: return 0 client = storage.Client() bucket = client.bucket(GCS_BUCKET) timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S') safe_name = collection_name.replace('/', '_') blob_path = f"{GCS_PREFIX}/{safe_name}_{timestamp}.ndjson" blob = bucket.blob(blob_path) ndjson = '\n'.join(json.dumps(item, ensure_ascii=False) for item in items) + '\n' blob.upload_from_string(ndjson, content_type='application/x-ndjson') return len(items) @functions_framework.http def main(request): """Cloud Function entry point.""" session = requests.Session() session.auth = HTTPBasicAuth(GIB_USERNAME, GIB_API_KEY) session.headers.update({'Accept': '*/*'}) state = load_state() total = 0 for collection in COLLECTIONS: collection = collection.strip() seq_update = state.get(collection) if seq_update is None: default_date = (datetime.now(timezone.utc) - timedelta(days=DEFAULT_DAYS_BACK)).strftime('%Y-%m-%d') seq_update = get_seq_update_by_date(session, collection, default_date) if seq_update is None: continue items, last_seq = fetch_collection(session, collection, seq_update) if items: write_to_gcs(items, collection) total += len(items) state[collection] = last_seq save_state(state) return json.dumps({'status': 'success', 'total_items': total}), 200Ganti konten
requirements.txtdengan dependensi berikut:functions-framework==3.* requests>=2.28.0 google-cloud-storage>=2.0.0Klik Deploy.
Mengonfigurasi variabel lingkungan
- Setelah deployment, buka halaman detail fungsi Anda.
- Klik Edit.
- Luaskan bagian Runtime, build, connections and security settings.
Di bagian Runtime environment variables, tambahkan variabel berikut:
Variabel Nilai GIB_API_URLhttps://tap.group-ib.com/api/v2/(atauhttps://bt.group-ib.com/api/v2/, bergantung pada wilayah Anda)GIB_USERNAMEAlamat email akun Group-IB Anda GIB_API_KEYKunci API Group-IB Anda (token pribadi) GCS_BUCKETNama bucket GCS Anda (misalnya, groupib-ti-logs)GCS_PREFIXAwalan untuk file log (misalnya, groupib-ti)GIB_COLLECTIONSDaftar koleksi yang dipisahkan koma untuk diambil (lihat di bawah) DEFAULT_DAYS_BACKJumlah hari untuk melihat kembali saat pertama kali dijalankan (default: 3)Klik Deploy.
Koleksi Group-IB yang tersedia
Konfigurasi variabel GIB_COLLECTIONS dengan koleksi yang relevan dengan kasus penggunaan Anda:
| Koleksi | Deskripsi | Batas maksimum |
|---|---|---|
compromised/account |
Kredensial akun yang disusupi (login, sandi, domain) | 100 |
compromised/card |
Kartu bank yang disusupi | 100 |
compromised/mule |
Akun kurir pencucian uang | 100 |
compromised/imei |
IMEI perangkat seluler yang disusupi | 100 |
compromised/file |
File yang disusupi dengan atribusi malware | 100 |
attacks/ddos |
Data serangan DDoS (IP target, domain) | 100 |
attacks/deface |
Insiden perusakan situs | 100 |
attacks/phishing |
URL dan domain phishing | 100 |
attacks/phishing_kit |
Hash kit phishing dan merek target | 100 |
bp/phishing |
Perlindungan merek — insiden phishing | 100 |
bp/phishing_kit |
Perlindungan merek — kit phishing | 100 |
hi/threat |
Laporan ancaman penjahat cyber (HI) dengan IOC dan pemetaan MITRE ATT&CK | 20 |
hi/threat_actor |
Profil pelaku ancaman kriminal siber | 100 |
apt/threat |
Laporan ancaman APT (negara) dengan IOC dan pemetaan MITRE ATT&CK | 20 |
apt/threat_actor |
Profil pelaku ancaman APT | 100 |
malware/cnc |
Indikator server Command and Control (IP, domain) | 100 |
malware/malware |
Deskripsi malware dan tingkat ancaman | 100 |
malware/targeted_malware |
Contoh malware yang ditargetkan (hash, nama file) | 100 |
osi/git_leak |
Kebocoran data repositori Git | 100 |
osi/public_leak |
Kebocoran data publik (tempelan, dump) | 100 |
osi/vulnerability |
Data kerentanan dengan skor CVSS | 100 |
suspicious_ip/tor_node |
Alamat IP node keluar Tor | 100 |
suspicious_ip/open_proxy |
Alamat IP proxy terbuka | 100 |
suspicious_ip/socks_proxy |
Alamat IP proxy SOCKS | 100 |
Contoh: Untuk mengumpulkan kredensial yang disusupi, infrastruktur C2, dan data APT:
compromised/account,malware/cnc,apt/threat,hi/threat
Menjadwalkan Cloud Function
Gunakan Cloud Scheduler untuk memicu fungsi pada interval reguler.
- Buka Cloud Scheduler di Konsol Google Cloud.
- Klik Create Job.
Berikan detail konfigurasi berikut:
Setelan Nilai Nama groupib-to-gcs-scheduleRegion Region yang sama dengan Cloud Function Anda Frekuensi 0 */1 * * *(setiap jam) atau0 0 * * *(setiap hari)Zona Waktu Pilih zona waktu Anda Di bagian Configure the execution:
- Target type: Pilih HTTP.
- URL: Masukkan URL pemicu Cloud Function.
- Metode HTTP: Pilih POST.
- Header Auth: Pilih Tambahkan token OIDC.
- Akun layanan: Pilih akun layanan dengan izin
roles/cloudfunctions.invoker.
Klik Create.
Menguji ekspor data
- Di konsol Cloud Scheduler, klik Force Run di samping tugas Anda untuk memicu fungsi secara manual.
- Periksa log Cloud Function di Cloud Logging untuk memastikan bahwa data telah diambil dari Group-IB.
- Buka Cloud Storage > Buckets di Konsol Google Cloud.
- Klik nama bucket Anda (misalnya,
groupib-ti-logs). - Buka folder awalan (misalnya,
groupib-ti/). Pastikan file
.ndjsonbaru muncul di bucket.
Mengambil akun layanan Google SecOps
Google SecOps menggunakan akun layanan unik untuk membaca data dari bucket GCS Anda. Anda harus memberi akun layanan ini akses ke bucket Anda.
Mendapatkan email akun layanan
- Buka SIEM Settings > Feeds.
- Klik Tambahkan Feed Baru.
- Klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Group-IB Threat Intelligence). - Pilih Google Cloud Storage V2 sebagai Source type.
- Pilih Group-IB Threat Intelligence sebagai Log type.
Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comSalin alamat email ini untuk digunakan di langkah berikutnya.
Memberikan izin IAM ke akun layanan Google SecOps
Akun layanan Google SecOps memerlukan peran Storage Object Viewer di bucket GCS Anda.
- Buka Cloud Storage > Buckets.
- Klik nama bucket Anda (misalnya,
groupib-ti-logs). - Buka tab Izin.
- Klik Grant access.
- Berikan detail konfigurasi berikut:
- Add principals: Tempel email akun layanan Google SecOps.
- Tetapkan peran: Pilih Storage Object Viewer.
Klik Simpan.
Mengonfigurasi feed di Google SecOps untuk menyerap log Group-IB Threat Intelligence
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Berita Baru.
- Klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Group-IB Threat Intelligence). - Pilih Google Cloud Storage V2 sebagai Source type.
- Pilih Group-IB Threat Intelligence sebagai Jenis log.
- Klik Berikutnya.
Tentukan nilai untuk parameter input berikut:
URL bucket penyimpanan: Masukkan URI bucket GCS dengan jalur awalan:
gs://groupib-ti-logs/groupib-ti/Ganti:
groupib-ti-logs: Nama bucket GCS Anda.groupib-ti: Jalur folder/awalan tempat log disimpan.
Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda:
- Never: Tidak pernah menghapus file apa pun setelah transfer (direkomendasikan untuk pengujian).
- Delete transferred files: Menghapus file setelah transfer berhasil.
- Hapus file yang ditransfer dan direktori kosong: Menghapus file dan direktori kosong setelah transfer berhasil.
Usia File Maksimum: Sertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
Namespace aset: Namespace aset.
Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
Klik Berikutnya.
Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.