Mengumpulkan log Group-IB Threat Intelligence

Didukung di:

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

  1. Login ke portal Group-IB TI&A di https://tap.group-ib.com.
  2. Klik nama Anda di pojok kanan atas, lalu pilih Profil.
  3. Klik Buka setelan saya.
  4. Buka tab Security and Access.
  5. Di bagian Personal token, klik Generate new token.
  6. Salin dan simpan kunci API dengan aman.

Buat bucket Google Cloud Storage

  1. Buka Konsol Google Cloud.
  2. Pilih project Anda atau buat project baru.
  3. Di menu navigasi, buka Cloud Storage > Buckets.
  4. Klik Create bucket.
  5. 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)
  6. 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

  1. Buka Konsol Google Cloud.
  2. Buka Cloud Functions.
  3. Klik Create Function.
  4. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Lingkungan Generasi ke-2
    Nama fungsi groupib-to-gcs
    Region 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
  5. Klik Berikutnya.

  6. Tetapkan Runtime ke Python 3.11 (atau yang lebih baru).

  7. Tetapkan Entry point ke main.

  8. Ganti konten main.py dengan 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}), 200
    
  9. Ganti konten requirements.txt dengan dependensi berikut:

    functions-framework==3.*
    requests>=2.28.0
    google-cloud-storage>=2.0.0
    
  10. Klik Deploy.

Mengonfigurasi variabel lingkungan

  1. Setelah deployment, buka halaman detail fungsi Anda.
  2. Klik Edit.
  3. Luaskan bagian Runtime, build, connections and security settings.
  4. Di bagian Runtime environment variables, tambahkan variabel berikut:

    Variabel Nilai
    GIB_API_URL https://tap.group-ib.com/api/v2/ (atau https://bt.group-ib.com/api/v2/, bergantung pada wilayah Anda)
    GIB_USERNAME Alamat email akun Group-IB Anda
    GIB_API_KEY Kunci API Group-IB Anda (token pribadi)
    GCS_BUCKET Nama bucket GCS Anda (misalnya, groupib-ti-logs)
    GCS_PREFIX Awalan untuk file log (misalnya, groupib-ti)
    GIB_COLLECTIONS Daftar koleksi yang dipisahkan koma untuk diambil (lihat di bawah)
    DEFAULT_DAYS_BACK Jumlah hari untuk melihat kembali saat pertama kali dijalankan (default: 3)
  5. 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.

  1. Buka Cloud Scheduler di Konsol Google Cloud.
  2. Klik Create Job.
  3. Berikan detail konfigurasi berikut:

    Setelan Nilai
    Nama groupib-to-gcs-schedule
    Region Region yang sama dengan Cloud Function Anda
    Frekuensi 0 */1 * * * (setiap jam) atau 0 0 * * * (setiap hari)
    Zona Waktu Pilih zona waktu Anda
  4. 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.
  5. Klik Create.

Menguji ekspor data

  1. Di konsol Cloud Scheduler, klik Force Run di samping tugas Anda untuk memicu fungsi secara manual.
  2. Periksa log Cloud Function di Cloud Logging untuk memastikan bahwa data telah diambil dari Group-IB.
  3. Buka Cloud Storage > Buckets di Konsol Google Cloud.
  4. Klik nama bucket Anda (misalnya, groupib-ti-logs).
  5. Buka folder awalan (misalnya, groupib-ti/).
  6. Pastikan file .ndjson baru 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

  1. Buka SIEM Settings > Feeds.
  2. Klik Tambahkan Feed Baru.
  3. Klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Group-IB Threat Intelligence).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih Group-IB Threat Intelligence sebagai Log type.
  7. Klik Get Service Account. Email akun layanan yang unik akan ditampilkan, misalnya:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. Salin 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.

  1. Buka Cloud Storage > Buckets.
  2. Klik nama bucket Anda (misalnya, groupib-ti-logs).
  3. Buka tab Izin.
  4. Klik Grant access.
  5. Berikan detail konfigurasi berikut:
    • Add principals: Tempel email akun layanan Google SecOps.
    • Tetapkan peran: Pilih Storage Object Viewer.
  6. Klik Simpan.

Mengonfigurasi feed di Google SecOps untuk menyerap log Group-IB Threat Intelligence

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Berita Baru.
  3. Klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Group-IB Threat Intelligence).
  5. Pilih Google Cloud Storage V2 sebagai Source type.
  6. Pilih Group-IB Threat Intelligence sebagai Jenis log.
  7. Klik Berikutnya.
  8. 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.

  9. Klik Berikutnya.

  10. Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.

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