Mengumpulkan log PingIDM (sebelumnya ForgeRock OpenIDM)
Versi Parser: 4.0
Dokumen ini menjelaskan cara menyerap log PingIDM (sebelumnya dikenal sebagai ForgeRock OpenIDM) ke Google Security Operations menggunakan Google Cloud Storage V2.
PingIDM adalah platform pengelolaan identitas yang menyediakan penyediaan pengguna, sinkronisasi, pengelolaan sandi, dan tata kelola akses. Layanan ini mencatat peristiwa siklus proses identitas, upaya autentikasi, operasi rekonsiliasi, dan perubahan konfigurasi ke log audit yang dapat diakses melalui REST.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps.
- Project GCP dengan Cloud Storage API yang diaktifkan.
- Izin untuk membuat dan mengelola bucket GCS dan kebijakan IAM.
- Izin untuk membuat layanan Cloud Run, topik Pub/Sub, dan tugas Cloud Scheduler.
- Akses istimewa ke instance ForgeRock OpenIDM atau PingIDM dengan kredensial administratif.
Membuat 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, forgerock-openidm-audit-logs)Location type Pilih sesuai kebutuhan Anda (Region, Dual-region, Multi-region) Location Pilih lokasi (misalnya, us-central1)Storage class Standard (direkomendasikan untuk log yang sering diakses) Kontrol akses Seragam (direkomendasikan) Alat perlindungan Opsional: Mengaktifkan pembuatan versi objek atau kebijakan retensi Klik Create.
Mengumpulkan kredensial ForgeRock OpenIDM
Mendapatkan URL dasar ForgeRock OpenIDM
- Login ke instance ForgeRock OpenIDM atau PingIDM Anda.
- Catat URL dasar Anda dari kolom URL browser.
- Format:
https://openidm.example.com - Jangan sertakan garis miring di akhir atau jalur seperti
/admin.
- Format:
Mendapatkan kredensial administratif
- Dapatkan kredensial administratif untuk instance ForgeRock OpenIDM Anda.
- Anda memerlukan:
- Username: Nama pengguna administratif (misalnya,
openidm-admin) - Password: Sandi administratif
- Username: Nama pengguna administratif (misalnya,
Memverifikasi izin
- Login ke ForgeRock OpenIDM.
- Buka Configure > System Preferences > Audit.
- Jika Anda dapat melihat konfigurasi dan topik audit, berarti Anda memiliki izin yang diperlukan.
- Jika Anda tidak dapat melihat opsi ini, hubungi administrator Anda untuk memberikan izin baca audit.
Menguji akses API
Uji kredensial Anda sebelum melanjutkan integrasi:
# Replace with your actual credentials OPENIDM_BASE_URL="[https://openidm.example.com](https://openidm.example.com)" OPENIDM_USERNAME="openidm-admin" OPENIDM_PASSWORD="your-admin-password" # Test API access to authentication audit topic curl -v \ -H "X-OpenIDM-Username: ${OPENIDM_USERNAME}" \ -H "X-OpenIDM-Password: ${OPENIDM_PASSWORD}" \ -H "Accept-API-Version: resource=1.0" \ -H "Accept: application/json" \ "${OPENIDM_BASE_URL}/openidm/audit/authentication?_queryFilter=true&_pageSize=1"
Respons yang diharapkan: HTTP 200 dengan JSON yang berisi peristiwa audit.
Membuat akun layanan untuk fungsi Cloud Run
Fungsi Cloud Run memerlukan akun layanan dengan izin untuk menulis ke bucket GCS dan dipanggil oleh Pub/Sub.
Membuat akun layanan
- Di Konsol GCP, buka IAM & Admin > Service Accounts.
- Klik Create Service Account.
- Berikan detail konfigurasi berikut:
- Service account name:
forgerock-openidm-collector-sa - Service account description:
Service account for Cloud Run function to collect ForgeRock OpenIDM logs
- Service account name:
- Klik Create and Continue.
- Di bagian Grant this service account access to project, tambahkan peran berikut:
- Storage Object Admin: Untuk menulis log ke bucket GCS dan mengelola state file.
- Cloud Run Invoker: Untuk mengizinkan Pub/Sub memanggil fungsi.
- Cloud Functions Invoker: Untuk mengizinkan pemanggilan fungsi.
- Klik Continue, lalu Done.
Memberikan izin IAM di bucket GCS
- Buka Cloud Storage > Buckets.
- Klik nama bucket Anda (misalnya,
forgerock-openidm-audit-logs). - Buka tab Izin.
- Klik Grant access.
- Berikan detail konfigurasi berikut:
- Add principals: Masukkan email akun layanan (misalnya,
forgerock-openidm-collector-sa@PROJECT_ID.iam.gserviceaccount.com). - Assign roles: Pilih Storage Object Admin.
- Add principals: Masukkan email akun layanan (misalnya,
- Klik Simpan.
Membuat topik Pub/Sub
- Di Konsol GCP, buka Pub/Sub > Topics.
- Klik Create topic.
- Berikan detail konfigurasi berikut:
- ID Topik:
forgerock-openidm-trigger - Biarkan setelan lainnya sesuai default.
- ID Topik:
- Klik Create.
Membuat fungsi Cloud Run untuk mengumpulkan log
- Di Konsol GCP, buka Cloud Run.
- Klik Create service.
- Pilih Function (gunakan editor inline untuk membuat fungsi).
Di bagian Configure, berikan detail konfigurasi berikut:
Setelan Nilai Nama layanan forgerock-openidm-collectorRegion Pilih region yang cocok dengan bucket GCS Anda (misalnya, us-central1)Runtime Pilih Python 3.12 atau yang lebih baru Di bagian Trigger:
- Klik + Tambahkan pemicu.
- Pilih Cloud Pub/Sub.
- Di Select a Cloud Pub/Sub topic, pilih
forgerock-openidm-trigger. - Klik Simpan.
Di bagian Authentication:
- Pilih Wajibkan autentikasi.
- Periksa Identity and Access Management (IAM).
Scroll ke bawah dan luaskan Containers, Networking, Security.
Buka tab Keamanan:
- Service account: Pilih
forgerock-openidm-collector-sa.
- Service account: Pilih
Buka tab Penampung:
- Klik Variables & Secrets.
- Klik + Add variable untuk setiap variabel lingkungan:
Nama Variabel Nilai Contoh Deskripsi GCS_BUCKETforgerock-openidm-audit-logsNama bucket GCS GCS_PREFIXopenidmAwalan untuk file log STATE_KEYopenidm/state.jsonJalur file status OPENIDM_BASE_URLhttps://openidm.example.comURL dasar OpenIDM OPENIDM_USERNAMEopenidm-adminNama pengguna admin OpenIDM OPENIDM_PASSWORDyour-admin-passwordSandi admin OpenIDM AUDIT_TOPICSaccess,activity,authentication,config,syncTopik yang dipisahkan koma PAGE_SIZE100Data per halaman MAX_PAGES50Halaman maks per topik Di bagian Permintaan:
- Waktu tunggu permintaan:
600detik.
- Waktu tunggu permintaan:
Buka tab Setelan:
- Resources: Memori 512 MiB, 1 CPU.
Klik Create. Setelah layanan dibuat, editor kode inline akan terbuka.
Menambahkan kode fungsi
- Masukkan main di kolom Entry point.
Buat dua file di editor:
- main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, timezone # Initialize HTTP client with timeouts http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'openidm') STATE_KEY = os.environ.get('STATE_KEY', 'openidm/state.json') OPENIDM_BASE_URL = os.environ.get('OPENIDM_BASE_URL') OPENIDM_USERNAME = os.environ.get('OPENIDM_USERNAME') OPENIDM_PASSWORD = os.environ.get('OPENIDM_PASSWORD') AUDIT_TOPICS = os.environ.get('AUDIT_TOPICS', 'access,activity,authentication,config,sync').split(',') PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '100')) MAX_PAGES = int(os.environ.get('MAX_PAGES', '50')) @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch ForgeRock OpenIDM logs and write to GCS. """ if not all([GCS_BUCKET, OPENIDM_BASE_URL, OPENIDM_USERNAME, OPENIDM_PASSWORD]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) state = load_state(bucket, STATE_KEY) all_events = [] for topic in AUDIT_TOPICS: topic = topic.strip() print(f"Fetching audit logs for topic: {topic}") events = fetch_audit_logs(topic, state.get(topic, {})) all_events.extend(events) if events: latest_timestamp = max(e.get('timestamp', '') for e in events) state[topic] = { 'last_timestamp': latest_timestamp, 'last_run': datetime.now(timezone.utc).isoformat(), 'events_count': len(events) } if all_events: write_to_gcs(bucket, all_events) save_state(bucket, STATE_KEY, state) print(f"Successfully processed {len(all_events)} audit events") else: print("No new audit events to process") except Exception as e: print(f'Error processing logs: {str(e)}') raise def load_state(bucket, key): try: blob = bucket.blob(key) if blob.exists(): return json.loads(blob.download_as_text()) except Exception as e: print(f"Warning: Could not load state: {e}") return {} def save_state(bucket, key, state): try: blob = bucket.blob(key) blob.upload_from_string(json.dumps(state, indent=2), content_type='application/json') except Exception as e: print(f"Warning: Could not save state: {e}") def fetch_audit_logs(topic, topic_state): base_url = OPENIDM_BASE_URL.rstrip('/') all_events = [] last_timestamp = topic_state.get('last_timestamp') query_filter = 'true' if not last_timestamp else f'timestamp gt "{last_timestamp}"' page_offset = 0 page_count = 0 while page_count < MAX_PAGES: try: url = f"{base_url}/openidm/audit/{topic}" params = { '_queryFilter': query_filter, '_pageSize': str(PAGE_SIZE), '_pagedResultsOffset': str(page_offset), '_sortKeys': 'timestamp' } headers = { 'X-OpenIDM-Username': OPENIDM_USERNAME, 'X-OpenIDM-Password': OPENIDM_PASSWORD, 'Accept-API-Version': 'resource=1.0', 'Accept': 'application/json' } response = http.request('GET', url, fields=params, headers=headers) if response.status != 200: print(f"API error for topic {topic}: {response.status}") break data = json.loads(response.data.decode('utf-8')) events = data.get('result', []) if not events: break all_events.extend(events) page_offset += PAGE_SIZE page_count += 1 if len(events) < PAGE_SIZE: break except Exception as e: print(f"Error for topic {topic}: {str(e)}") break return all_events def write_to_gcs(bucket, events): timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S') filename = f"{GCS_PREFIX}/openidm_audit_{timestamp}.json" ndjson_content = '\n'.join([json.dumps(event) for event in events]) bucket.blob(filename).upload_from_string(ndjson_content, content_type='application/x-ndjson')- requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0Klik Deploy. Deployment memerlukan waktu 2–3 menit.
Buat tugas Cloud Scheduler
- Di Konsol GCP, buka Cloud Scheduler.
- Klik Create Job.
Berikan detail konfigurasi berikut:
Setelan Nilai Nama forgerock-openidm-collector-hourlyRegion Pilih region yang sama dengan fungsi Cloud Run Frekuensi 0 * * * *(setiap jam)Zona Waktu Pilih zona waktu (UTC direkomendasikan) Jenis target Pub/Sub Topik forgerock-openidm-triggerIsi pesan {}Klik Create.
Opsi frekuensi jadwal
| Frekuensi | Ekspresi Cron | Kasus Penggunaan |
|---|---|---|
| Setiap 5 menit | */5 * * * * |
Volume tinggi, latensi rendah |
| Setiap jam | 0 * * * * |
Standar (direkomendasikan) |
| Harian | 0 0 * * * |
Pengumpulan batch |
Menguji integrasi
- Di Cloud Scheduler, klik Force run pada tugas Anda.
- Verifikasi operasi di log Cloud Run. Cari:
Successfully processed X audit events. - Pastikan file
jsonbaru ada di bucket Cloud Storage Anda di folderopenidm/.
Mengambil akun layanan Google SecOps
Mengonfigurasi feed di Google SecOps
- Buka Setelan > Pengelolaan Data > Feed. Jika Anda menggunakan platform khusus SIEM, buka Settings > Feeds.
- Klik Tambahkan Feed Baru > Konfigurasi satu feed.
- Nama feed:
ForgeRock OpenIDM Audit Logs. - Source type: Google Cloud Storage V2.
- Jenis log: FORGEROCK_OPENIDM.
- Klik Get Service Account dan salin email yang diberikan (misalnya,
chronicle-12345...). - Klik Berikutnya.
- URL bucket penyimpanan:
gs://forgerock-openidm-audit-logs/openidm/. - Opsi penghapusan sumber: Pilih sesuai preferensi (misalnya, Jangan pernah).
- Klik Berikutnya, tinjau, lalu klik Kirim.
Memberikan izin IAM
- Buka Cloud Storage > Buckets.
- Pilih bucket Anda, lalu klik tab Permissions.
- Klik Grant access.
- Add principals: Tempel email akun layanan Google SecOps.
- Assign roles: Pilih Storage Object Viewer.
- Klik Simpan.
Tabel pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
fluenttag_label, topic_label, context_roles_label |
additional.fields |
Key-value pair untuk konteks. |
Via |
intermediary.hostname |
Nama host proxy/perantara. |
x_forwarded_ip, caller.callerIps |
intermediary.ip |
IP perantara. |
timestamp |
metadata.event_timestamp |
Stempel waktu peristiwa. |
transactionId |
metadata.product_deployment_id |
ID transaksi unik. |
eventName |
metadata.product_event_type |
Nama peristiwa dari ForgeRock. |
_id |
metadata.product_log_id |
ID log unik. |
request_method |
network.http.method |
Metode HTTP yang digunakan. |
response.statusCode |
network.http.response_code |
Kode status HTTP. |
user_agent |
network.http.user_agent |
String agen pengguna lengkap. |
client.ip, context.ipAddress |
principal.ip |
IP sumber pelaku. |
userId, principalData.0 |
principal.user.userid |
ID pengguna yang bertindak. |
security_action |
security_result.action |
Keputusan keamanan diambil. |
level |
security_result.severity |
Tingkat keparahan yang dipetakan. |
server.ip |
target.ip |
IP sistem target. |
http.request.path |
target.url |
URL/Jalur Target. |
| T/A | metadata.product_name |
Setel ke ForgeRock OpenIDM. |
| T/A | metadata.vendor_name |
Tetapkan ke ForgeRock. |
elapsed_time" and "X-Content-Type-Options |
additional.fields |
Dipetakan dari log perubahan |
trackingIds.0 |
metadata.product_log_id |
Dipetakan dari log perubahan |
context.userRolesProperty", "context.authenticationId", and "context.authenticationIdProperty |
principal.user.attribute.roles |
Dipetakan dari log perubahan |
context.component", "context.moduleId", and "context.queryId |
principal.resource.attribute.labels |
Dipetakan dari log perubahan |
context.roles", "_normalized.fieldNames", and "_eventId |
additional.fields |
Dipetakan dari log perubahan |
Log Perubahan
Melihat Log Perubahan untuk parser ini
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.