Mengumpulkan log IOC Proofpoint Emerging Threats Pro

Didukung di:

Dokumen ini menjelaskan cara menyerap log IOC Proofpoint Emerging Threats Pro ke Google Security Operations menggunakan Amazon S3. Emerging Threats Intelligence memublikasikan daftar reputasi per jam untuk IP dan domain dalam format CSV dengan data intelijen ancaman, termasuk kategori, skor, dan informasi temporal. Kode parser memproses data intelijen ancaman ET_PRO berformat CSV. Alat ini mengekstrak alamat IP, domain, kategori, skor, dan informasi relevan lainnya, memetakannya ke format IOC standar dan skema UDM Chronicle untuk analisis dan penggunaan lebih lanjut dalam Google SecOps.

Sebelum memulai

Pastikan Anda memiliki prasyarat berikut:

  • Instance Google SecOps dengan izin untuk membuat feed
  • Langganan Proofpoint ET Intelligence dengan akses ke daftar reputasi
  • Kunci ET Intelligence API dari https://etadmin.proofpoint.com/api-access
  • Akses istimewa ke AWS (S3, IAM, Lambda, EventBridge)

Mengumpulkan prasyarat Emerging Threats Pro

  1. Login ke ET Intelligence Admin Portal di https://etadmin.proofpoint.com
  2. Buka Akses API
  3. Salin dan simpan Kunci API Anda
  4. Hubungi perwakilan Proofpoint Anda untuk mendapatkan:
    • URL Daftar Reputasi IP Mendetail
    • URL Daftar Reputasi Domain Terperinci

ET Intelligence menyediakan file CSV terpisah untuk daftar reputasi IP dan Domain, yang diperbarui setiap jam. Gunakan format "detail" yang mencakup kolom berikut: * Daftar domain: Domain Name, Category, Score, First Seen, Last Seen, Ports * Daftar IP: IP Address, Category, Score, First Seen, Last Seen, Ports

Mengonfigurasi bucket AWS S3 dan IAM

Buat bucket S3

  1. Buka konsol Amazon S3
  2. Klik Buat bucket
  3. Nama bucket: Masukkan et-pro-ioc-bucket (atau nama pilihan Anda)
  4. Region: Pilih region yang Anda inginkan
  5. Klik Buat bucket

Membuat pengguna IAM untuk Google SecOps

  1. Buka IAM console.
  2. Klik Pengguna > Buat pengguna
  3. Nama pengguna: Masukkan secops-reader
  4. Klik Berikutnya.
  5. Pilih Lampirkan kebijakan secara langsung
  6. Klik Create policy
  7. Di editor JSON, masukkan kebijakan berikut:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::et-pro-ioc-bucket/et-pro-ioc/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::et-pro-ioc-bucket",
          "Condition": {
            "StringLike": {
              "s3:prefix": ["et-pro-ioc/*"]
            }
          }
        }
      ]
    }
    
  8. Beri nama kebijakan SecOpsReaderPolicy.

  9. Klik Create policy.

  10. Kembali ke pembuatan pengguna, pilih kebijakan yang baru dibuat.

  11. Klik Berikutnya > Buat pengguna.

  12. Buka tab Kredensial keamanan.

  13. Klik Create access key.

  14. Pilih Layanan pihak ketiga.

  15. Klik Create access key.

  16. Download dan simpan kredensial.

Mengonfigurasi peran IAM untuk Lambda

  1. Di konsol AWS, buka IAM > Roles > Create role.
  2. Pilih AWS service > Lambda.
  3. Klik Berikutnya.
  4. Klik Create policy.
  5. Pilih tab JSON dan masukkan kode berikut:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutObjects",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::et-pro-ioc-bucket/et-pro-ioc/*"
        },
        {
          "Sid": "AllowStateManagement",
          "Effect": "Allow",
          "Action": ["s3:GetObject", "s3:PutObject"],
          "Resource": "arn:aws:s3:::et-pro-ioc-bucket/et-pro-ioc/state.json"
        }
      ]
    }
    
  6. Beri nama kebijakan EtProIocLambdaPolicy.

  7. Klik Create policy.

  8. Kembali ke pembuatan peran, lampirkan kebijakan.

  9. Beri nama peran EtProIocLambdaRole.

  10. Klik Buat peran.

Buat fungsi Lambda

  1. Di AWS Console, buka Lambda > Functions > Create function.
  2. Klik Buat dari awal.
  3. Berikan detail konfigurasi berikut:

    • Nama fungsi: et-pro-ioc-fetcher
    • Runtime: Python 3.13
    • Arsitektur: x86_64
    • Peran eksekusi: Gunakan peran yang ada EtProIocLambdaRole
  4. Setelah pembuatan, buka tab Code dan ganti dengan:

    #!/usr/bin/env python3
    # Lambda: Fetch ET Pro IOC reputation lists and write raw CSV to S3
    import os
    import time
    import json
    from datetime import datetime
    from urllib.request import Request, urlopen
    from urllib.error import HTTPError, URLError
    import boto3
    
    # Environment variables
    BUCKET = os.environ["S3_BUCKET"]
    PREFIX = os.environ.get("S3_PREFIX", "et-pro-ioc/").strip("/")
    ET_API_KEY = os.environ["ET_API_KEY"]
    ET_IP_LIST_URL = os.environ["ET_IP_LIST_URL"]
    ET_DOMAIN_LIST_URL = os.environ["ET_DOMAIN_LIST_URL"]
    STATE_KEY = os.environ.get("STATE_KEY", f"{PREFIX}/state.json")
    TIMEOUT = int(os.environ.get("TIMEOUT", "120"))
    
    s3 = boto3.client("s3")
    
    def _build_request(url: str) -> Request:
        """Build request with ET API authentication"""
        if not url.lower().startswith("https://"):
            raise ValueError("Only HTTPS URLs are allowed")
    
        req = Request(url, method="GET")
        # ET Intelligence uses Authorization header with API key
        req.add_header("Authorization", ET_API_KEY)
        return req
    
    def fetch_with_retry(url: str, max_retries: int = 3) -> bytes:
        """Fetch URL with retry logic for rate limits"""
        for attempt in range(max_retries):
            try:
                req = _build_request(url)
                with urlopen(req, timeout=TIMEOUT) as response:
                    if response.status == 200:
                        return response.read()
                    elif response.status == 429:
                        # Rate limited, wait and retry
                        wait_time = min(30 * (2 ** attempt), 300)
                        print(f"Rate limited, waiting {wait_time}s...")
                        time.sleep(wait_time)
                    else:
                        raise HTTPError(url, response.status, response.reason, {}, None)
            except URLError as e:
                if attempt == max_retries - 1:
                    raise
                time.sleep(5 * (attempt + 1))
    
        raise Exception(f"Failed to fetch {url} after {max_retries} attempts")
    
    def save_to_s3(key: str, content: bytes):
        """Save content to S3 with appropriate content type"""
        s3.put_object(
            Bucket=BUCKET,
            Key=key,
            Body=content,
            ContentType="text/csv"
        )
        print(f"Saved {len(content)} bytes to s3://{BUCKET}/{key}")
    
    def get_state():
        """Get last fetch state from S3"""
        try:
            response = s3.get_object(Bucket=BUCKET, Key=STATE_KEY)
            return json.loads(response['Body'].read())
        except:
            return {}
    
    def save_state(state: dict):
        """Save fetch state to S3"""
        s3.put_object(
            Bucket=BUCKET,
            Key=STATE_KEY,
            Body=json.dumps(state, indent=2),
            ContentType="application/json"
        )
    
    def lambda_handler(event, context):
        """Main Lambda handler"""
        print("Starting ET Pro IOC fetch")
    
        # Generate timestamp for file naming
        now = datetime.utcnow()
        timestamp = now.strftime("%Y/%m/%d/%H%M%S")
    
        results = []
        errors = []
    
        # Fetch IP reputation list
        try:
            print(f"Fetching IP reputation list...")
            ip_data = fetch_with_retry(ET_IP_LIST_URL)
            ip_key = f"{PREFIX}/ip/{timestamp}.csv"
            save_to_s3(ip_key, ip_data)
            results.append({"type": "ip", "key": ip_key, "size": len(ip_data)})
        except Exception as e:
            error_msg = f"Failed to fetch IP list: {str(e)}"
            print(error_msg)
            errors.append(error_msg)
    
        # Fetch Domain reputation list
        try:
            print(f"Fetching Domain reputation list...")
            domain_data = fetch_with_retry(ET_DOMAIN_LIST_URL)
            domain_key = f"{PREFIX}/domain/{timestamp}.csv"
            save_to_s3(domain_key, domain_data)
            results.append({"type": "domain", "key": domain_key, "size": len(domain_data)})
        except Exception as e:
            error_msg = f"Failed to fetch Domain list: {str(e)}"
            print(error_msg)
            errors.append(error_msg)
    
        # Save state
        state = {
            "last_fetch": now.isoformat(),
            "results": results,
            "errors": errors
        }
        save_state(state)
    
        return {
            "statusCode": 200 if not errors else 207,
            "body": json.dumps(state)
        }
    
  5. Buka Konfigurasi > Konfigurasi umum.

  6. Klik Edit.

  7. Setel Waktu Tunggu ke 5 menit.

  8. Klik Simpan.

Mengonfigurasi variabel lingkungan

  1. Buka Configuration > Environment variables.
  2. Klik Edit > Tambahkan variabel lingkungan.
  3. Tambahkan variabel berikut:

    Kunci Nilai
    S3_BUCKET et-pro-ioc-bucket
    S3_PREFIX et-pro-ioc
    STATE_KEY et-pro-ioc/state.json
    ET_API_KEY [Your ET API Key]
    ET_IP_LIST_URL [Your detailed IP list URL]
    ET_DOMAIN_LIST_URL [Your detailed Domain list URL]
    TIMEOUT 120
  4. Klik Simpan

Hubungi perwakilan Proofpoint Anda untuk mengetahui URL yang tepat untuk langganan Anda. URL format detail biasanya mengikuti pola ini: * Daftar IP: https://rules.emergingthreatspro.com/[your-code]/reputation/detailed-iprepdata.txt * Daftar domain: https://rules.emergingthreatspro.com/[your-code]/reputation/detailed-domainrepdata.txt

Membuat jadwal EventBridge

  1. Buka Amazon EventBridge > Schedules > Create schedule
  2. Nama jadwal: et-pro-ioc-hourly
  3. Pola jadwal: Jadwal berbasis tarif
  4. Ekspresi kecepatan: 1 jam
  5. Klik Berikutnya.
  6. Target: Fungsi Lambda
  7. Fungsi: et-pro-ioc-fetcher
  8. Klik Berikutnya untuk menyelesaikan langkah-langkah yang tersisa
  9. Klik Buat jadwal.

Mengonfigurasi feed di Google SecOps

Anda harus membuat dua feed terpisah - satu untuk reputasi IP dan satu untuk reputasi Domain.

Membuat Feed Reputasi IP

  1. Buka Setelan SIEM > Feed
  2. Klik Tambahkan baru
  3. Di kolom Nama feed, masukkan ET Pro IOC - IP Reputation
  4. Di daftar Source type, pilih Amazon S3
  5. Pilih Emerging Threats Pro sebagai Jenis log
  6. Klik Berikutnya.
  7. Tentukan nilai untuk parameter input berikut:
    • URI S3: s3://et-pro-ioc-bucket/et-pro-ioc/ip/
    • Opsi penghapusan sumber: Pilih sesuai preferensi Anda
    • Usia File Maksimum: Menyertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
    • Access Key ID: Kunci akses pembaca SecOps
    • Secret Access Key: Kunci rahasia pembaca SecOps
    • Namespace aset: Namespace aset.
    • Label penyerapan: Label yang diterapkan ke peristiwa dari feed ini.
  8. Klik Berikutnya.
  9. Tinjau, lalu klik Kirim

Membuat Feed Reputasi Domain

  1. Ulangi proses pembuatan feed.
  2. Di kolom Nama feed, masukkan ET Pro IOC - Domain Reputation.
  3. Di daftar Source type, pilih Amazon S3.
  4. Pilih Emerging Threats Pro sebagai Jenis log.
  5. Klik Berikutnya.
  6. Tentukan nilai untuk parameter input berikut:
    • URI S3: s3://et-pro-ioc-bucket/et-pro-ioc/domain/
    • Opsi penghapusan sumber: Pilih sesuai preferensi Anda
    • Usia File Maksimum: Menyertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
    • Access Key ID: Kunci akses pembaca SecOps
    • Secret Access Key: Kunci rahasia pembaca SecOps
    • Namespace aset: Namespace aset.
    • Label penyerapan: Label yang diterapkan ke peristiwa dari feed ini.
  7. Klik Berikutnya.
  8. Tinjau, lalu klik Kirim

Tabel Pemetaan UDM

Kolom log Pemetaan UDM Logika
category Kolom ini digunakan dalam logika parser, tetapi tidak dipetakan langsung ke UDM. Menentukan nilai event.ioc.categorization melalui tabel pemeta.
collection_time.nanos event.idm.entity.metadata.collected_timestamp.nanos Dipetakan langsung dari log mentah.
collection_time.seconds event.idm.entity.metadata.collected_timestamp.seconds Dipetakan langsung dari log mentah.
data Kolom ini diuraikan menjadi beberapa kolom UDM berdasarkan kontennya.
first_seen event.idm.entity.metadata.interval.start_time Diuraikan sebagai tanggal dan dipetakan ke UDM.
first_seen event.ioc.active_timerange.start Diuraikan sebagai tanggal dan dipetakan ke UDM.
ip_or_domain event.idm.entity.entity.hostname Dipetakan ke UDM jika pola grok mengekstrak host dari kolom.
ip_or_domain event.idm.entity.entity.ip Dipetakan ke UDM jika pola grok tidak mengekstrak host dari kolom.
ip_or_domain event.ioc.domain_and_ports.domain Dipetakan ke UDM jika pola grok mengekstrak host dari kolom.
ip_or_domain event.ioc.ip_and_ports.ip_address Dipetakan ke UDM jika pola grok tidak mengekstrak host dari kolom.
last_seen event.idm.entity.metadata.interval.end_time Diuraikan sebagai tanggal dan dipetakan ke UDM.
last_seen event.ioc.active_timerange.end Diuraikan sebagai tanggal dan dipetakan ke UDM.
ports event.idm.entity.entity.labels.value Diuraikan, digabungkan dengan pembatas koma, dan dipetakan ke UDM jika ada beberapa port.
ports event.idm.entity.entity.port Diuraikan dan dipetakan ke UDM jika hanya ada satu port.
ports event.ioc.domain_and_ports.ports Diuraikan dan dipetakan ke UDM jika pola grok mengekstrak host dari kolom.
ports event.ioc.ip_and_ports.ports Diuraikan dan dipetakan ke UDM jika pola grok tidak mengekstrak host dari kolom.
skor event.ioc.confidence_score Dipetakan langsung dari log mentah.
event.idm.entity.entity.labels.key Setel ke "ports" jika ada beberapa port.
event.idm.entity.metadata.entity_type Tetapkan ke "DOMAIN_NAME" jika pola grok mengekstrak host dari kolom ip_or_domain, atau tetapkan ke "IP_ADDRESS".
event.idm.entity.metadata.threat.category Tetapkan ke "SOFTWARE_MALICIOUS".
event.idm.entity.metadata.threat.category_details Diperoleh dari kolom category menggunakan tabel penelusuran.
event.idm.entity.metadata.threat.threat_name Tetapkan ke "ET Intelligence Rep List".
event.idm.entity.metadata.vendor_name Tetapkan ke "ET_PRO_IOC".
event.ioc.feed_name Tetapkan ke "ET Intelligence Rep List".
event.ioc.raw_severity Ditetapkan ke "Berbahaya".
timestamp.nanos Disalin dari collection_time.nanos.
timestamp.seconds Disalin dari collection_time.seconds.

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