Mengumpulkan log WAF Signal Sciences

Didukung di:

Dokumen ini menjelaskan cara menyerap log WAF Signal Sciences ke Google Security Operations menggunakan Google Cloud Storage. Parser mengubah log Signal Sciences dari format JSON-nya menjadi Model Data Terpadu (UDM) Chronicle. Proses ini menangani dua struktur pesan utama: pesan "RPC.PreRequest/PostRequest" diuraikan menggunakan pola Grok, sedangkan pesan lainnya diproses sebagai objek JSON, mengekstrak kolom yang relevan dan memetakannya ke skema UDM.

Sebelum memulai

Pastikan Anda memenuhi prasyarat berikut:

  • Instance Google SecOps
  • VPC Flow disiapkan dan aktif di lingkungan Google Cloud Anda
  • Akses istimewa ke WAF Signal Sciences

Membuat Google Cloud Bucket Storage

  1. Login ke konsol Google Cloud .
  2. Buka halaman Cloud Storage Buckets.

    Buka Buckets

  3. Klik Buat.

  4. Di halaman Buat bucket, masukkan informasi bucket Anda. Setelah setiap langkah berikut, klik Lanjutkan untuk melanjutkan ke langkah berikutnya:

    1. Di bagian Mulai, lakukan tindakan berikut:

      • Masukkan nama unik yang memenuhi persyaratan nama bucket (misalnya, vpcflow-logs).
      • Untuk mengaktifkan namespace hierarkis, klik panah peluas untuk meluaskan bagian Optimalkan untuk beban kerja berorientasi file dan intensif data, lalu pilih Aktifkan namespace Hierarkis di bucket ini.
      • Untuk menambahkan label bucket, klik panah peluas untuk meluaskan bagian Label.
      • Klik Tambahkan label, lalu tentukan kunci dan nilai untuk label Anda.
    2. Di bagian Pilih lokasi untuk menyimpan data Anda, lakukan hal berikut:

      • Pilih Jenis lokasi.
      • Gunakan menu jenis lokasi untuk memilih Lokasi tempat data objek dalam bucket Anda akan disimpan secara permanen.
      • Untuk menyiapkan replikasi lintas bucket, luaskan bagian Siapkan replikasi lintas bucket.
    3. Di bagian Pilih kelas penyimpanan untuk data Anda, pilih kelas penyimpanan default untuk bucket, atau pilih Autoclass untuk pengelolaan kelas penyimpanan otomatis untuk data bucket Anda.

    4. Di bagian Pilih cara mengontrol akses ke objek, pilih tidak untuk menerapkan pencegahan akses publik, dan pilih model kontrol akses untuk objek bucket Anda.

    5. Di bagian Pilih cara melindungi data objek, lakukan tindakan berikut:

      • Pilih salah satu opsi di bagian Perlindungan data yang ingin Anda tetapkan untuk bucket Anda.
      • Untuk memilih cara mengenkripsi data objek Anda, klik panah peluas berlabel Enkripsi data, lalu pilih Metode enkripsi data.
  5. Klik Buat.

Mengonfigurasi kunci API WAF Signal Sciences

  1. Login ke UI web Signal Sciences WAF.
  2. Buka Profil Saya > Token Akses API.
  3. Klik Tambahkan token akses API.
  4. Berikan nama deskriptif yang unik (misalnya, Google SecOps).
  5. Klik Create API access token.
  6. Salin dan simpan token di lokasi yang aman.
  7. Klik Saya mengerti untuk menyelesaikan pembuatan token.

Men-deploy skrip di host Linux untuk menarik log dari Signal Sciences dan menyimpannya di Google Cloud

  1. Login ke host Linux menggunakan SSH.
  2. Instal lib Python untuk menyimpan JSON WAF Signal Sciences ke bucket Cloud Storage:

    pip install google-cloud-storage
    
  3. Tetapkan variabel env ini untuk memanggil file JSON yang memiliki kredensial dari Google Cloud:

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/service-account-key.json"
    
  4. Konfigurasi variabel lingkungan berikut karena informasi ini tidak boleh dikodekan secara permanen:

    export SIGSCI_EMAIL=<Signal_Sciences_account_email>
    export SIGSCI_TOKEN=<Signal_Sciences_API_token>
    export SIGSCI_CORP=<Corporation_name_in_Signal_Sciences>
    
  5. Jalankan skrip berikut:

    import sys
    import requests
    import os
    import calendar
    import json
    from datetime import datetime, timedelta
    from google.cloud import storage
    
    # Check if all necessary environment variables are set
    
    if 'SIGSCI_EMAIL' not in os.environ or 'SIGSCI_TOKEN' not in os.environ or 'SIGSCI_CORP' not in os.environ:
    print("ERROR: You need to define SIGSCI_EMAIL, SIGSCI_TOKEN, and SIGSCI_CORP environment variables.")
    print("Please fix and run again. Existing...")
    sys.exit(1)  # Exit if environment variables are not set
    
    # Define the Google Cloud Storage bucket name and output file name
    
    bucket_name = 'Your_GCS_Bucket'  # Replace with your GCS bucket name
    output_file_name = 'signal_sciences_logs.json'
    
    # Initialize Google Cloud Storage client
    
    storage_client = storage.Client()
    
    # Function to upload data to Google Cloud Storage
    
    def upload_to_gcs(bucket_name, data, destination_blob_name):
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(destination_blob_name)
        blob.upload_from_string(data, content_type='application/json')
        print(f"Data uploaded to {destination_blob_name} in bucket {bucket_name}")
    
    # Signal Sciences API information
    
    api_host = 'https://dashboard.signalsciences.net'
    # email = 'user@domain.com'  # Signal Sciences account email
    # token = 'XXXXXXXX-XXXX-XXX-XXXX-XXXXXXXXXXXX'  # API token for authentication
    # corp_name = 'Domain'  # Corporation name in Signal Sciences
    # site_names = ['testenv']  # Replace with your actual site names
    
    # List of comma-delimited sites that you want to extract data from
    
    site_names = [ 'site123', 'site345' ]        # Define all sites to pull logs from
    
    email = os.environ.get('SIGSCI_EMAIL')       # Signal Sciences account email
    token = os.environ.get('SIGSCI_TOKEN')       # API token for authentication
    corp_name = os.environ.get('SIGSCI_CORP')    # Corporation name in Signal Sciences
    
    # Calculate the start and end timestamps for the previous hour in UTC
    
    until_time = datetime.utcnow().replace(minute=0, second=0, microsecond=0)
    from_time = until_time - timedelta(hours=1)
    until_time = calendar.timegm(until_time.utctimetuple())
    from_time = calendar.timegm(from_time.utctimetuple())
    
    # Prepare HTTP headers for the API request
    
    headers = {
        'Content-Type': 'application/json',
        'x-api-user': email,
        'x-api-token': token
    }
    
    # Collect logs for each site
    
    collected_logs = []
    
    for site_name in site_names:
        url = f"{api_host}/api/v0/corps/{corp_name}/sites/{site_name}/feed/requests?from={from_time}&until={until_time}"
        while True:
            response = requests.get(url, headers=headers)
            if response.status_code != 200:
                print(f"Error fetching logs: {response.text}", file=sys.stderr)
                break
    
            # Parse the JSON response
    
            data = response.json()
            collected_logs.extend(data['data'])  # Add the log messages to our list
    
            # Pagination: check if there is a next page
    
            next_url = data.get('next', {}).get('uri')
            if not next_url:
                break
            url = api_host + next_url
    
    # Convert the collected logs to a newline-delimited JSON string
    
    json_data = '\n'.join(json.dumps(log) for log in collected_logs)
    
    # Save the newline-delimited JSON data to a GCS bucket
    
    upload_to_gcs(bucket_name, json_data, output_file_name)
    

    Menyiapkan feed

Ada dua titik entri berbeda untuk menyiapkan feed di platform Google SecOps:

  • Setelan SIEM > Feed
  • Hub Konten > Paket Konten

Menyiapkan feed dari Setelan SIEM > Feed

Untuk mengonfigurasi feed, ikuti langkah-langkah berikut:

  1. Buka Setelan SIEM > Feed.
  2. Klik Tambahkan Feed Baru.
  3. Di halaman berikutnya, klik Konfigurasi satu feed.
  4. Di kolom Nama feed, masukkan nama untuk feed (misalnya, Signal Sciences WAF Logs).
  5. Pilih Google Cloud Storage sebagai Jenis sumber.
  6. Pilih Signal Sciences WAF sebagai Jenis log.
  7. Klik Dapatkan Akun Layanan sebagai Akun Layanan Chronicle.
  8. Klik Berikutnya.
  9. Tentukan nilai untuk parameter input berikut:

    • URI Bucket Penyimpanan:URL bucket penyimpanan Google Cloud dalam format gs://my-bucket/<value>.
    • URI Adalah: Pilih Direktori yang menyertakan subdirektori.
    • Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda.

  10. Klik Berikutnya.

  11. Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.

Menyiapkan feed dari Hub Konten

Tentukan nilai untuk kolom berikut:

  • URI Bucket Penyimpanan:URL bucket penyimpanan Google Cloud dalam format gs://my-bucket/<value>.
  • URI Adalah: Pilih Direktori yang menyertakan subdirektori.
  • Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda.

Opsi lanjutan

  • Nama Feed: Nilai yang telah diisi otomatis yang mengidentifikasi feed.
  • Jenis Sumber: Metode yang digunakan untuk mengumpulkan log ke Google SecOps.
  • Namespace Aset: Namespace yang terkait dengan feed.
  • Label Penyerapan: Label yang diterapkan ke semua peristiwa dari feed ini.

Tabel pemetaan UDM

Kolom Log Pemetaan UDM Logika
CLIENT-IP target.ip Diekstrak dari kolom header CLIENT-IP.
CLIENT-IP target.port Diekstrak dari kolom header CLIENT-IP.
Koneksi security_result.about.labels Nilai diambil dari kolom Connection log mentah dan dipetakan ke security_result.about.labels.
Content-Length security_result.about.labels Nilai diambil dari kolom Content-Length log mentah dan dipetakan ke security_result.about.labels.
Content-Type security_result.about.labels Nilai diambil dari kolom Content-Type log mentah dan dipetakan ke security_result.about.labels.
dibuat metadata.event_timestamp Nilai diambil dari kolom created log mentah dan dipetakan ke metadata.event_timestamp.
details.headersIn security_result.about.resource.attribute.labels Nilai diambil dari kolom details.headersIn log mentah dan dipetakan ke security_result.about.resource.attribute.labels.
details.headersOut security_result.about.resource.attribute.labels Nilai diambil dari kolom details.headersOut log mentah dan dipetakan ke security_result.about.resource.attribute.labels.
details.id principal.process.pid Nilai diambil dari kolom details.id log mentah dan dipetakan ke principal.process.pid.
details.method network.http.method Nilai diambil dari kolom details.method log mentah dan dipetakan ke network.http.method.
details.protocol network.application_protocol Nilai diambil dari kolom details.protocol log mentah dan dipetakan ke network.application_protocol.
details.remoteCountryCode principal.location.country_or_region Nilai diambil dari kolom details.remoteCountryCode log mentah dan dipetakan ke principal.location.country_or_region.
details.remoteHostname target.hostname Nilai diambil dari kolom details.remoteHostname log mentah dan dipetakan ke target.hostname.
details.remoteIP target.ip Nilai diambil dari kolom details.remoteIP log mentah dan dipetakan ke target.ip.
details.responseCode network.http.response_code Nilai diambil dari kolom details.responseCode log mentah dan dipetakan ke network.http.response_code.
details.responseSize network.received_bytes Nilai diambil dari kolom details.responseSize log mentah dan dipetakan ke network.received_bytes.
details.serverHostname principal.hostname Nilai diambil dari kolom details.serverHostname log mentah dan dipetakan ke principal.hostname.
details.serverName principal.asset.network_domain Nilai diambil dari kolom details.serverName log mentah dan dipetakan ke principal.asset.network_domain.
details.tags security_result.detection_fields Nilai diambil dari kolom details.tags log mentah dan dipetakan ke security_result.detection_fields.
details.tlsCipher network.tls.cipher Nilai diambil dari kolom details.tlsCipher log mentah dan dipetakan ke network.tls.cipher.
details.tlsProtocol network.tls.version Nilai diambil dari kolom details.tlsProtocol log mentah dan dipetakan ke network.tls.version.
details.userAgent network.http.user_agent Nilai diambil dari kolom details.userAgent log mentah dan dipetakan ke network.http.user_agent.
details.uri network.http.referral_url Nilai diambil dari kolom details.uri log mentah dan dipetakan ke network.http.referral_url.
eventType metadata.product_event_type Nilai diambil dari kolom eventType log mentah dan dipetakan ke metadata.product_event_type.
headersIn security_result.about.labels Nilai diambil dari kolom headersIn log mentah dan dipetakan ke security_result.about.labels.
headersOut security_result.about.labels Nilai diambil dari kolom headersOut log mentah dan dipetakan ke security_result.about.labels.
id principal.process.pid Nilai diambil dari kolom id log mentah dan dipetakan ke principal.process.pid.
pesan metadata.description Nilai diambil dari kolom message log mentah dan dipetakan ke metadata.description.
metode network.http.method Nilai diambil dari kolom method log mentah dan dipetakan ke network.http.method.
ModuleVersion metadata.ingestion_labels Nilai diambil dari kolom ModuleVersion log mentah dan dipetakan ke metadata.ingestion_labels.
msgData.actions security_result.action Nilai diambil dari kolom msgData.actions log mentah dan dipetakan ke security_result.action.
msgData.changes target.resource.attribute.labels Nilai diambil dari kolom msgData.changes log mentah dan dipetakan ke target.resource.attribute.labels.
msgData.conditions security_result.description Nilai diambil dari kolom msgData.conditions log mentah dan dipetakan ke security_result.description.
msgData.detailLink network.http.referral_url Nilai diambil dari kolom msgData.detailLink log mentah dan dipetakan ke network.http.referral_url.
msgData.name target.resource.name Nilai diambil dari kolom msgData.name log mentah dan dipetakan ke target.resource.name.
msgData.reason security_result.summary Nilai diambil dari kolom msgData.reason log mentah dan dipetakan ke security_result.summary.
msgData.sites network.http.user_agent Nilai diambil dari kolom msgData.sites log mentah dan dipetakan ke network.http.user_agent.
protokol network.application_protocol Nilai diambil dari kolom protocol log mentah dan dipetakan ke network.application_protocol.
remoteCountryCode principal.location.country_or_region Nilai diambil dari kolom remoteCountryCode log mentah dan dipetakan ke principal.location.country_or_region.
remoteHostname target.hostname Nilai diambil dari kolom remoteHostname log mentah dan dipetakan ke target.hostname.
remoteIP target.ip Nilai diambil dari kolom remoteIP log mentah dan dipetakan ke target.ip.
responseCode network.http.response_code Nilai diambil dari kolom responseCode log mentah dan dipetakan ke network.http.response_code.
responseSize network.received_bytes Nilai diambil dari kolom responseSize log mentah dan dipetakan ke network.received_bytes.
serverHostname principal.hostname Nilai diambil dari kolom serverHostname log mentah dan dipetakan ke principal.hostname.
serverName principal.asset.network_domain Nilai diambil dari kolom serverName log mentah dan dipetakan ke principal.asset.network_domain.
tags security_result.detection_fields Nilai diambil dari kolom tags log mentah dan dipetakan ke security_result.detection_fields.
timestamp metadata.event_timestamp Nilai diambil dari kolom timestamp log mentah dan dipetakan ke metadata.event_timestamp.
tlsCipher network.tls.cipher Nilai diambil dari kolom tlsCipher log mentah dan dipetakan ke network.tls.cipher.
tlsProtocol network.tls.version Nilai diambil dari kolom tlsProtocol log mentah dan dipetakan ke network.tls.version.
URI target.url Nilai diambil dari kolom URI log mentah dan dipetakan ke target.url.
userAgent network.http.user_agent Nilai diambil dari kolom userAgent log mentah dan dipetakan ke network.http.user_agent.
uri network.http.referral_url Nilai diambil dari kolom uri log mentah dan dipetakan ke network.http.referral_url.
X-ARR-SSL network.tls.client.certificate.issuer Nilai diekstrak dari kolom header X-ARR-SSL menggunakan filter grok dan kv.
metadata.event_type Jenis peristiwa ditentukan oleh parser berdasarkan keberadaan informasi target dan akun utama. Jika target dan prinsipal ada, jenis peristiwanya adalah NETWORK_HTTP. Jika hanya prinsipal yang hadir, jenis acaranya adalah STATUS_UPDATE. Jika tidak, jenis peristiwanya adalah GENERIC_EVENT.
metadata.log_type Nilai di-hardcode menjadi SIGNAL_SCIENCES_WAF.
metadata.product_name Nilai di-hardcode menjadi Signal Sciences WAF.
metadata.vendor_name Nilai di-hardcode menjadi Signal Sciences.
principal.asset.hostname Nilai diambil dari kolom principal.hostname.
target.asset.hostname Nilai diambil dari kolom target.hostname.
target.asset.ip Nilai diambil dari kolom target.ip.
target.user.user_display_name Nilai diekstrak dari kolom message_data menggunakan filter grok.
target.user.userid Nilai diekstrak dari kolom message_data menggunakan filter grok.

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