Mengumpulkan log IOC Proofpoint Emerging Threats Pro
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
- Login ke ET Intelligence Admin Portal di https://etadmin.proofpoint.com
- Buka Akses API
- Salin dan simpan Kunci API Anda
- 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
- Buka konsol Amazon S3
- Klik Buat bucket
- Nama bucket: Masukkan
et-pro-ioc-bucket(atau nama pilihan Anda) - Region: Pilih region yang Anda inginkan
- Klik Buat bucket
Membuat pengguna IAM untuk Google SecOps
- Buka IAM console.
- Klik Pengguna > Buat pengguna
- Nama pengguna: Masukkan
secops-reader - Klik Berikutnya.
- Pilih Lampirkan kebijakan secara langsung
- Klik Create policy
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/*"] } } } ] }Beri nama kebijakan
SecOpsReaderPolicy.Klik Create policy.
Kembali ke pembuatan pengguna, pilih kebijakan yang baru dibuat.
Klik Berikutnya > Buat pengguna.
Buka tab Kredensial keamanan.
Klik Create access key.
Pilih Layanan pihak ketiga.
Klik Create access key.
Download dan simpan kredensial.
Mengonfigurasi peran IAM untuk Lambda
- Di konsol AWS, buka IAM > Roles > Create role.
- Pilih AWS service > Lambda.
- Klik Berikutnya.
- Klik Create policy.
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" } ] }Beri nama kebijakan
EtProIocLambdaPolicy.Klik Create policy.
Kembali ke pembuatan peran, lampirkan kebijakan.
Beri nama peran
EtProIocLambdaRole.Klik Buat peran.
Buat fungsi Lambda
- Di AWS Console, buka Lambda > Functions > Create function.
- Klik Buat dari awal.
Berikan detail konfigurasi berikut:
- Nama fungsi:
et-pro-ioc-fetcher - Runtime: Python 3.13
- Arsitektur: x86_64
- Peran eksekusi: Gunakan peran yang ada
EtProIocLambdaRole
- Nama fungsi:
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) }Buka Konfigurasi > Konfigurasi umum.
Klik Edit.
Setel Waktu Tunggu ke 5 menit.
Klik Simpan.
Mengonfigurasi variabel lingkungan
- Buka Configuration > Environment variables.
- Klik Edit > Tambahkan variabel lingkungan.
Tambahkan variabel berikut:
Kunci Nilai S3_BUCKETet-pro-ioc-bucketS3_PREFIXet-pro-iocSTATE_KEYet-pro-ioc/state.jsonET_API_KEY[Your ET API Key]ET_IP_LIST_URL[Your detailed IP list URL]ET_DOMAIN_LIST_URL[Your detailed Domain list URL]TIMEOUT120Klik 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
- Buka Amazon EventBridge > Schedules > Create schedule
- Nama jadwal:
et-pro-ioc-hourly - Pola jadwal: Jadwal berbasis tarif
- Ekspresi kecepatan: 1 jam
- Klik Berikutnya.
- Target: Fungsi Lambda
- Fungsi:
et-pro-ioc-fetcher - Klik Berikutnya untuk menyelesaikan langkah-langkah yang tersisa
- 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
- Buka Setelan SIEM > Feed
- Klik Tambahkan baru
- Di kolom Nama feed, masukkan
ET Pro IOC - IP Reputation - Di daftar Source type, pilih Amazon S3
- Pilih Emerging Threats Pro sebagai Jenis log
- Klik Berikutnya.
- 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.
- URI S3:
- Klik Berikutnya.
- Tinjau, lalu klik Kirim
Membuat Feed Reputasi Domain
- Ulangi proses pembuatan feed.
- Di kolom Nama feed, masukkan
ET Pro IOC - Domain Reputation. - Di daftar Source type, pilih Amazon S3.
- Pilih Emerging Threats Pro sebagai Jenis log.
- Klik Berikutnya.
- 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.
- URI S3:
- Klik Berikutnya.
- 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.