Mengumpulkan log Layanan IDP CrowdStrike

Didukung di:

Dokumen ini menjelaskan cara menyerap log Layanan Perlindungan Identitas (IDP) CrowdStrike ke Google Security Operations menggunakan Amazon S3. Integrasi ini menggunakan CrowdStrike Unified Alerts API untuk mengumpulkan peristiwa Identity Protection dan menyimpannya dalam format NDJSON untuk diproses oleh parser CS_IDP bawaan.

Sebelum memulai

Pastikan Anda memenuhi prasyarat berikut:

  • Instance Google SecOps.
  • Akses istimewa ke Konsol CrowdStrike Falcon dan pengelolaan kunci API.
  • Akses istimewa ke AWS (S3, Identity and Access Management (IAM), Lambda, EventBridge).

Mendapatkan prasyarat CrowdStrike Identity Protection

  1. Login ke Konsol CrowdStrike Falcon.
  2. Buka Dukungan dan Sumber Daya > Klien dan kunci API.
  3. Klik Tambahkan Klien API baru.
  4. Berikan detail konfigurasi berikut:
    • Nama Klien: Masukkan Google SecOps IDP Integration.
    • Deskripsi: Masukkan API client for Google SecOps integration.
    • Cakupan: Pilih cakupan Alerts: READ (alerts:read) (ini mencakup pemberitahuan Identity Protection).
  5. Klik Tambahkan.
  6. Salin dan simpan detail berikut di lokasi yang aman:
    • Client ID
    • Rahasia Klien (hanya ditampilkan sekali)
    • URL Dasar (contoh: api.crowdstrike.com untuk US-1, api.us-2.crowdstrike.com untuk US-2, api.eu-1.crowdstrike.com untuk EU-1)

Mengonfigurasi bucket AWS S3 dan IAM untuk Google SecOps

  1. Buat bucket Amazon S3 dengan mengikuti panduan pengguna ini: Membuat bucket
  2. Simpan Name dan Region bucket untuk referensi di masa mendatang (misalnya, crowdstrike-idp-logs-bucket).
  3. Buat Pengguna dengan mengikuti panduan pengguna ini: Membuat pengguna IAM.
  4. Pilih Pengguna yang dibuat.
  5. Pilih tab Kredensial keamanan.
  6. Klik Create Access Key di bagian Access Keys.
  7. Pilih Layanan pihak ketiga sebagai Kasus penggunaan.
  8. Klik Berikutnya.
  9. Opsional: Tambahkan tag deskripsi.
  10. Klik Create access key.
  11. Klik Download file .CSV untuk menyimpan Kunci Akses dan Kunci Akses Rahasia untuk referensi di masa mendatang.
  12. Klik Selesai.
  13. Pilih tab Permissions.
  14. Klik Tambahkan izin di bagian Kebijakan izin.
  15. Pilih Tambahkan izin.
  16. Pilih Lampirkan kebijakan secara langsung.
  17. Cari kebijakan AmazonS3FullAccess.
  18. Pilih kebijakan.
  19. Klik Berikutnya.
  20. Klik Add permissions.

Mengonfigurasi kebijakan dan peran IAM untuk upload S3

  1. Di konsol AWS, buka IAM > Policies.
  2. Klik Buat kebijakan > tab JSON.
  3. Salin dan tempel kebijakan berikut.
  4. Policy JSON (ganti crowdstrike-idp-logs-bucket jika Anda memasukkan nama bucket yang berbeda):

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutObjects",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket/*"
        },
        {
          "Sid": "AllowGetStateObject",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket/crowdstrike-idp/state.json"
        }
      ]
    }
    
  5. Klik Berikutnya > Buat kebijakan.

  6. Buka IAM > Roles > Create role > AWS service > Lambda.

  7. Lampirkan kebijakan yang baru dibuat.

  8. Beri nama peran CrowdStrike-IDP-Lambda-Role, lalu klik Buat peran.

Buat fungsi Lambda

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

    Setelan Nilai
    Nama CrowdStrike-IDP-Collector
    Runtime Python 3.13
    Arsitektur x86_64
    Peran eksekusi CrowdStrike-IDP-Lambda-Role
  4. Setelah fungsi dibuat, buka tab Code, hapus stub, dan tempelkan kode berikut:

    import json
    import boto3
    import urllib3
    import os
    from datetime import datetime, timezone
    from urllib.parse import urlencode
    
    HTTP = urllib3.PoolManager()
    
    def lambda_handler(event, context):
        """
        Fetch CrowdStrike Identity Protection alerts (Unified Alerts API)
        and store RAW JSON (NDJSON) to S3 for the CS_IDP parser.
        No transformation is performed.
        """
        # Environment variables
        s3_bucket = os.environ['S3_BUCKET']
        s3_prefix = os.environ['S3_PREFIX']
        state_key = os.environ['STATE_KEY']
        client_id = os.environ['CROWDSTRIKE_CLIENT_ID']
        client_secret = os.environ['CROWDSTRIKE_CLIENT_SECRET']
        api_base = os.environ['API_BASE']
    
        s3 = boto3.client('s3')
    
        token = get_token(client_id, client_secret, api_base)
        last_ts = get_last_timestamp(s3, s3_bucket, state_key)
    
        # FQL filter for Identity Protection alerts only, newer than checkpoint
        fql_filter = f"product:'idp'+updated_timestamp:>'{last_ts}'"
        sort = 'updated_timestamp.asc'
    
        # Step 1: Get list of alert IDs
        all_ids = []
        per_page = int(os.environ.get('ALERTS_LIMIT', '1000'))  # up to 10000 per SDK docs
        offset = 0
        while True:
            page_ids = query_alert_ids(api_base, token, fql_filter, sort, per_page, offset)
            if not page_ids:
                break
            all_ids.extend(page_ids)
            if len(page_ids) < per_page:
                break
            offset += per_page
    
        if not all_ids:
            return {'statusCode': 200, 'body': 'No new Identity Protection alerts.'}
    
        # Step 2: Get alert details in batches (max 1000 IDs per request)
        details = []
        max_batch = 1000
        for i in range(0, len(all_ids), max_batch):
            batch = all_ids[i:i+max_batch]
            details.extend(fetch_alert_details(api_base, token, batch))
    
        if details:
            details.sort(key=lambda d: d.get('updated_timestamp', d.get('created_timestamp', '')))
            latest = details[-1].get('updated_timestamp') or details[-1].get('created_timestamp')
    
            key = f"{s3_prefix}cs_idp_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
            body = '\n'.join(json.dumps(d, separators=(',', ':')) for d in details)
    
            s3.put_object(
                Bucket=s3_bucket,
                Key=key,
                Body=body.encode('utf-8'),
                ContentType='application/x-ndjson'
            )
    
            update_state(s3, s3_bucket, state_key, latest)
    
        return {'statusCode': 200, 'body': f'Wrote {len(details)} alerts to S3.'}
    
    def get_token(client_id, client_secret, api_base):
        """Get OAuth2 token from CrowdStrike API"""
        url = f"https://{api_base}/oauth2/token"
        data = f"client_id={client_id}&client_secret={client_secret}&grant_type=client_credentials"
        headers = {'Content-Type': 'application/x-www-form-urlencoded'}
        r = HTTP.request('POST', url, body=data, headers=headers)
        if r.status != 200:
            raise Exception(f'Auth failed: {r.status} {r.data}')
        return json.loads(r.data.decode('utf-8'))['access_token']
    
    def query_alert_ids(api_base, token, fql_filter, sort, limit, offset):
        """Query alert IDs using filters"""
        url = f"https://{api_base}/alerts/queries/alerts/v2"
        params = {'filter': fql_filter, 'sort': sort, 'limit': str(limit), 'offset': str(offset)}
        qs = urlencode(params)
        r = HTTP.request('GET', f"{url}?{qs}", headers={'Authorization': f'Bearer {token}'})
        if r.status != 200:
            raise Exception(f'Query alerts failed: {r.status} {r.data}')
        resp = json.loads(r.data.decode('utf-8'))
        return resp.get('resources', [])
    
    def fetch_alert_details(api_base, token, composite_ids):
        """Fetch detailed alert data by composite IDs"""
        url = f"https://{api_base}/alerts/entities/alerts/v2"
        body = {'composite_ids': composite_ids}
        headers = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
        r = HTTP.request('POST', url, body=json.dumps(body).encode('utf-8'), headers=headers)
        if r.status != 200:
            raise Exception(f'Fetch alert details failed: {r.status} {r.data}')
        resp = json.loads(r.data.decode('utf-8'))
        return resp.get('resources', [])
    
    def get_last_timestamp(s3, bucket, key, default='2023-01-01T00:00:00Z'):
        """Get last processed timestamp from S3 state file"""
        try:
            obj = s3.get_object(Bucket=bucket, Key=key)
            state = json.loads(obj['Body'].read().decode('utf-8'))
            return state.get('last_timestamp', default)
        except s3.exceptions.NoSuchKey:
            return default
    
    def update_state(s3, bucket, key, ts):
        """Update last processed timestamp in S3 state file"""
        state = {'last_timestamp': ts, 'updated': datetime.now(timezone.utc).isoformat()}
        s3.put_object(Bucket=bucket, Key=key, Body=json.dumps(state).encode('utf-8'), ContentType='application/json')
    
  5. Buka Configuration > Environment variables.

  6. Klik Edit > Tambahkan variabel lingkungan baru.

  7. Masukkan variabel lingkungan yang diberikan dalam tabel berikut, dengan mengganti nilai contoh dengan nilai Anda.

    Variabel lingkungan

    Kunci Nilai contoh
    S3_BUCKET crowdstrike-idp-logs-bucket
    S3_PREFIX crowdstrike-idp/
    STATE_KEY crowdstrike-idp/state.json
    CROWDSTRIKE_CLIENT_ID <your-client-id>
    CROWDSTRIKE_CLIENT_SECRET <your-client-secret>
    API_BASE api.crowdstrike.com (US-1), api.us-2.crowdstrike.com (US-2), api.eu-1.crowdstrike.com (EU-1)
    ALERTS_LIMIT 1000 (opsional, maks. 10000 per halaman)
  8. Setelah fungsi dibuat, tetap buka halamannya (atau buka Lambda > Functions > your-function).

  9. Pilih tab Configuration

  10. Di panel General configuration, klik Edit.

  11. Ubah Waktu Tunggu menjadi 5 menit (300 detik), lalu klik Simpan.

Membuat jadwal EventBridge

  1. Buka Amazon EventBridge > Scheduler > Create schedule.
  2. Berikan detail konfigurasi berikut:
    • Jadwal berulang: Tarif (15 minutes).
    • Target: fungsi Lambda Anda CrowdStrike-IDP-Collector.
    • Name: CrowdStrike-IDP-Collector-15m.
  3. Klik Buat jadwal.

(Opsional) Buat pengguna & kunci IAM hanya baca untuk Google SecOps

  1. Buka Konsol AWS > IAM > Pengguna.
  2. Klik Add users.
  3. Berikan detail konfigurasi berikut:
    • Pengguna: Masukkan secops-reader.
    • Jenis akses: Pilih Kunci akses – Akses terprogram.
  4. Klik Buat pengguna.
  5. Lampirkan kebijakan baca minimal (kustom): Pengguna > secops-reader > Izin > Tambahkan izin > Lampirkan kebijakan secara langsung > Buat kebijakan.
  6. JSON:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": ["s3:GetObject"],
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::crowdstrike-idp-logs-bucket"
        }
      ]
    }
    
  7. Nama = secops-reader-policy.

  8. Klik Buat kebijakan > cari/pilih > Berikutnya > Tambahkan izin.

  9. Buat kunci akses untuk secops-reader: Kredensial keamanan > Kunci akses.

  10. Klik Create access key.

  11. Download .CSV. (Anda akan menempelkan nilai ini ke feed).

Mengonfigurasi feed di Google SecOps untuk memproses log CrowdStrike Identity Protection Services

  1. Buka Setelan SIEM > Feed.
  2. Klik + Tambahkan Feed Baru.
  3. Di kolom Nama feed, masukkan nama untuk feed (misalnya, CrowdStrike Identity Protection Services logs).
  4. Pilih Amazon S3 V2 sebagai Jenis sumber.
  5. Pilih Crowdstrike Identity Protection Services sebagai Log type.
  6. Klik Berikutnya.
  7. Tentukan nilai untuk parameter input berikut:
    • URI S3: s3://crowdstrike-idp-logs-bucket/crowdstrike-idp/
    • Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda.
    • Usia File Maksimum: Menyertakan file yang diubah dalam jumlah hari terakhir. Defaultnya adalah 180 hari.
    • ID Kunci Akses: Kunci akses pengguna dengan akses ke bucket S3.
    • Kunci Akses Rahasia: Kunci rahasia pengguna dengan akses ke bucket S3.
    • Namespace aset: Namespace aset.
    • Label penyerapan: Label yang diterapkan ke peristiwa dari feed ini.
  8. Klik Berikutnya.
  9. Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.

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