Mengumpulkan log CrowdStrike FileVantage

Didukung di:

Dokumen ini menjelaskan cara menyerap log CrowdStrike FileVantage ke Google Security Operations menggunakan Amazon S3.

Sebelum memulai

Pastikan Anda memenuhi prasyarat berikut:

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

Mengumpulkan prasyarat CrowdStrike FileVantage (kredensial API)

  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 nama deskriptif (misalnya, Google SecOps FileVantage Integration).
    • Deskripsi: Masukkan deskripsi singkat tentang tujuan integrasi.
    • Cakupan API: Pilih Falcon FileVantage:read.
  5. Klik Tambahkan untuk menyelesaikan proses.
  6. Salin dan simpan detail berikut di lokasi yang aman:
    • Client ID
    • Rahasia Klien
    • URL Dasar (menentukan region cloud Anda)

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-filevantage-logs).
  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-filevantage-logs jika Anda memasukkan nama bucket yang berbeda):

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPutObjects",
          "Effect": "Allow",
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::crowdstrike-filevantage-logs/*"
        },
        {
          "Sid": "AllowGetStateObject",
          "Effect": "Allow",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::crowdstrike-filevantage-logs/filevantage/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 CrowdStrikeFileVantageRole, 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-filevantage-logs
    Runtime Python 3.13
    Arsitektur x86_64
    Peran eksekusi CrowdStrikeFileVantageRole
  4. Setelah fungsi dibuat, buka tab Code, hapus stub, dan tempelkan kode berikut (crowdstrike-filevantage-logs.py).

    import os
    import json
    import boto3
    import urllib3
    from datetime import datetime, timezone
    from urllib.parse import urlencode
    
    def lambda_handler(event, context):
        """
        Lambda function to fetch CrowdStrike FileVantage logs and store them in S3
        """
    
        # Environment variables
        s3_bucket = os.environ['S3_BUCKET']
        s3_prefix = os.environ['S3_PREFIX']
        state_key = os.environ['STATE_KEY']
        client_id = os.environ['FALCON_CLIENT_ID']
        client_secret = os.environ['FALCON_CLIENT_SECRET']
        base_url = os.environ['FALCON_BASE_URL']
    
        # Initialize clients
        s3_client = boto3.client('s3')
        http = urllib3.PoolManager()
    
        try:
            # Get OAuth token
            token_url = f"{base_url}/oauth2/token"
            token_headers = {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Accept': 'application/json'
            }
            token_data = urlencode({
                'client_id': client_id,
                'client_secret': client_secret,
                'grant_type': 'client_credentials'
            })
    
            token_response = http.request('POST', token_url, body=token_data, headers=token_headers)
    
            if token_response.status != 200:
                print(f"Failed to get OAuth token: {token_response.status}")
                return {'statusCode': 500, 'body': 'Authentication failed'}
    
            token_data = json.loads(token_response.data.decode('utf-8'))
            access_token = token_data['access_token']
    
            # Get last checkpoint
            last_timestamp = get_last_checkpoint(s3_client, s3_bucket, state_key)
    
            # Fetch file changes
            changes_url = f"{base_url}/filevantage/queries/changes/v1"
            headers = {
                'Authorization': f'Bearer {access_token}',
                'Accept': 'application/json'
            }
    
            # Build query parameters
            params = {
                'limit': 500,
                'sort': 'action_timestamp.asc'
            }
    
            if last_timestamp:
                params['filter'] = f"action_timestamp:>'{last_timestamp}'"
    
            query_url = f"{changes_url}?{urlencode(params)}"
            response = http.request('GET', query_url, headers=headers)
    
            if response.status != 200:
                print(f"Failed to query changes: {response.status}")
                return {'statusCode': 500, 'body': 'Failed to fetch changes'}
    
            response_data = json.loads(response.data.decode('utf-8'))
            change_ids = response_data.get('resources', [])
    
            if not change_ids:
                print("No new changes found")
                return {'statusCode': 200, 'body': 'No new changes'}
    
            # Get detailed change information
            details_url = f"{base_url}/filevantage/entities/changes/v1"
            batch_size = 100
            all_changes = []
            latest_timestamp = last_timestamp
    
            for i in range(0, len(change_ids), batch_size):
                batch_ids = change_ids[i:i + batch_size]
                details_params = {'ids': batch_ids}
                details_query_url = f"{details_url}?{urlencode(details_params, doseq=True)}"
    
                details_response = http.request('GET', details_query_url, headers=headers)
    
                if details_response.status == 200:
                    details_data = json.loads(details_response.data.decode('utf-8'))
                    changes = details_data.get('resources', [])
                    all_changes.extend(changes)
    
                    # Track latest timestamp
                    for change in changes:
                        change_time = change.get('action_timestamp')
                        if change_time and (not latest_timestamp or change_time > latest_timestamp):
                            latest_timestamp = change_time
    
            if all_changes:
                # Store logs in S3
                timestamp = datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')
                s3_key = f"{s3_prefix}filevantage_changes_{timestamp}.json"
    
                s3_client.put_object(
                    Bucket=s3_bucket,
                    Key=s3_key,
                    Body='\n'.join(json.dumps(change) for change in all_changes),
                    ContentType='application/json'
                )
    
                # Update checkpoint
                save_checkpoint(s3_client, s3_bucket, state_key, latest_timestamp)
    
                print(f"Stored {len(all_changes)} changes in S3: {s3_key}")
    
            return {
                'statusCode': 200,
                'body': f'Processed {len(all_changes)} changes'
            }
    
        except Exception as e:
            print(f"Error: {str(e)}")
            return {'statusCode': 500, 'body': f'Error: {str(e)}'}
    
    def get_last_checkpoint(s3_client, bucket, key):
        """Get the last processed timestamp from S3 state file"""
        try:
            response = s3_client.get_object(Bucket=bucket, Key=key)
            state = json.loads(response['Body'].read().decode('utf-8'))
            return state.get('last_timestamp')
        except s3_client.exceptions.NoSuchKey:
            return None
        except Exception as e:
            print(f"Error reading checkpoint: {e}")
            return None
    
    def save_checkpoint(s3_client, bucket, key, timestamp):
        """Save the last processed timestamp to S3 state file"""
        try:
            state = {
                'last_timestamp': timestamp,
                'updated_at': datetime.now(timezone.utc).isoformat()
            }
            s3_client.put_object(
                Bucket=bucket,
                Key=key,
                Body=json.dumps(state),
                ContentType='application/json'
            )
        except Exception as e:
            print(f"Error saving checkpoint: {e}")
    
  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-filevantage-logs
    S3_PREFIX filevantage/
    STATE_KEY filevantage/state.json
    FALCON_CLIENT_ID <your-client-id>
    FALCON_CLIENT_SECRET <your-client-secret>
    FALCON_BASE_URL https://api.crowdstrike.com (US-1) / https://api.us-2.crowdstrike.com (US-2) / https://api.eu-1.crowdstrike.com (EU-1)
  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 (1 hour).
    • Target: fungsi Lambda Anda crowdstrike-filevantage-logs.
    • Name: crowdstrike-filevantage-logs-1h.
  3. Klik Buat jadwal.

(Opsional) Buat pengguna dan 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-filevantage-logs/*"
        },
        {
          "Effect": "Allow",
          "Action": ["s3:ListBucket"],
          "Resource": "arn:aws:s3:::crowdstrike-filevantage-logs"
        }
      ]
    }
    
  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 menyerap log CrowdStrike FileVantage

  1. Buka Setelan SIEM > Feed.
  2. Klik + Tambahkan Feed Baru.
  3. Di kolom Nama feed, masukkan nama untuk feed (misalnya, CrowdStrike FileVantage logs).
  4. Pilih Amazon S3 V2 sebagai Jenis sumber.
  5. Pilih CrowdStrike Filevantage sebagai Jenis log.
  6. Klik Berikutnya.
  7. Tentukan nilai untuk parameter input berikut:
    • URI S3: s3://crowdstrike-filevantage-logs/filevantage/
    • 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.