Mengumpulkan log Pemantauan Berkelanjutan Qualys

Didukung di:

Kode parser Logstash ini pertama-tama mengekstrak kolom seperti IP sumber, pengguna, metode, dan protokol aplikasi dari pesan log mentah menggunakan pola grok. Kemudian, memetakan kolom tertentu dari data log mentah ke kolom yang sesuai dalam Model Data Terpadu (UDM), melakukan konversi jenis data, dan memperkaya data dengan label dan metadata tambahan sebelum akhirnya menyusun output dalam format UDM yang diinginkan.

Sebelum memulai

Pastikan Anda memiliki prasyarat berikut:

  • Instance Google Security Operations.
  • Akses istimewa ke Google Cloud.
  • Akses istimewa ke Qualys.

Aktifkan API yang Diperlukan:

  1. Login ke konsol Google Cloud .
  2. Buka APIs & Services > Library.
  3. Telusuri dan aktifkan API berikut:
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Pub/Sub (diperlukan agar Cloud Scheduler dapat memanggil fungsi)

Membuat Google Cloud Bucket Storage

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

    Buka Buckets

  3. Klik Buat.

  4. Konfigurasi bucket:

    • Name: masukkan nama unik yang memenuhi persyaratan nama bucket (misalnya, qualys-asset-bucket).
    • Pilih tempat untuk menyimpan data Anda: pilih lokasi.
    • Pilih kelas penyimpanan untuk data Anda: pilih kelas penyimpanan default untuk bucket, atau pilih Autoclass untuk pengelolaan kelas penyimpanan otomatis.
    • Pilih cara mengontrol akses ke objek: pilih tidak untuk menerapkan pencegahan akses publik, dan pilih model kontrol akses untuk objek bucket Anda.
    • Kelas penyimpanan: pilih berdasarkan kebutuhan Anda (misalnya, Standard).
  5. Klik Buat.

Buat Akun Layanan Google Cloud

  1. Login ke konsol Google Cloud .
  2. Buka IAM & Admin > Service Accounts.
  3. Buat akun layanan baru.
  4. Beri nama deskriptif (misalnya, qualys-user).
  5. Beri akun layanan peran Storage Object Admin di bucket GCS yang Anda buat pada langkah sebelumnya.
  6. Berikan peran Cloud Functions Invoker kepada akun layanan.
  7. Buat kunci SSH untuk akun layanan.
  8. Download file kunci JSON untuk akun layanan. Jaga keamanan file ini.

Opsional: Buat Pengguna API khusus di Qualys

  1. Login ke konsol Qualys.
  2. Buka Pengguna.
  3. Klik Baru > Pengguna.
  4. Masukkan Informasi Umum yang diperlukan untuk pengguna.
  5. Pilih tab Peran Pengguna.
  6. Pastikan peran memiliki kotak Akses API yang dicentang.
  7. Klik Simpan.

Mengidentifikasi URL Qualys API spesifik Anda

Opsi 1

Identifikasi URL Anda seperti yang disebutkan dalam identifikasi platform.

Opsi 2

  1. Login ke konsol Qualys.
  2. Buka Bantuan > Tentang.
  3. Scroll untuk melihat informasi ini di bagian Security Operations Center (SOC).
  4. Salin URL Qualys API.

Mengonfigurasi Cloud Function

  1. Buka Cloud Functions di konsol Google Cloud .
  2. Klik Buat fungsi.
  3. Konfigurasi Fungsi:

    • Nama: masukkan nama untuk fungsi Anda (misalnya, fetch-qualys-cm-alerts).
    • Region: pilih region yang dekat dengan Bucket Anda.
    • Runtime: Python 3.10 (atau runtime pilihan Anda).
    • Pemicu: pilih pemicu HTTP jika diperlukan atau Cloud Pub/Sub untuk eksekusi terjadwal.
    • Autentikasi: aman dengan autentikasi.
    • Tulis Kode dengan editor inline:
    ```python
    from google.cloud import storage
    import requests
    import base64
    import json
    
    # Google Cloud Storage Configuration
    BUCKET_NAME = "<bucket-name>"
    FILE_NAME = "qualys_cm_alerts.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "<qualys-username>"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"
    
    def fetch_cm_alerts():
        """Fetch alerts from Qualys Continuous Monitoring."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        payload = """
        <ServiceRequest>
            <filters>
                <Criteria field="alert.date" operator="GREATER">2024-01-01</Criteria>
            </filters>
        </ServiceRequest>
        """
        response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/cm/alert", headers=headers, data=payload)
        response.raise_for_status()
        return response.json()
    
    def upload_to_gcs(data):
        """Upload data to Google Cloud Storage."""
        client = storage.Client()
        bucket = client.get_bucket(BUCKET_NAME)
        blob = bucket.blob(FILE_NAME)
        blob.upload_from_string(json.dumps(data, indent=2), content_type="application/json")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            alerts = fetch_cm_alerts()
            upload_to_gcs(alerts)
            return "Qualys CM alerts uploaded to Cloud Storage successfully!"
        except Exception as e:
            return f"An error occurred: {e}", 500
    ```
    
  4. Klik Deploy setelah menyelesaikan konfigurasi.

Mengonfigurasi Cloud Scheduler

  1. Buka Cloud Scheduler di konsol Google Cloud .
  2. Klik Create Job.
  3. Konfigurasi Tugas:

    • Name: masukkan nama untuk tugas Anda (misalnya, trigger-fetch-qualys-cm-alerts).
    • Frekuensi: gunakan sintaksis cron untuk menentukan jadwal (misalnya, 0 * * * * untuk menjalankan setiap jam).
    • Zona Waktu: tetapkan zona waktu pilihan Anda.
    • Jenis Pemicu: pilih HTTP.
    • Trigger URL: Masukkan URL Cloud Function (ditemukan di detail fungsi setelah deployment).
    • Metode: Pilih POST.
  4. Buat tugas.

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 Feed name, masukkan nama untuk feed; misalnya, Qualys Continuous Monitoring Logs.
  5. Pilih Google Cloud Storage sebagai Jenis sumber.
  6. Pilih Qualys Continuous Monitoring sebagai Log type.
  7. Klik Berikutnya.
  8. Tentukan nilai untuk parameter input berikut:

    • URI Bucket Penyimpanan: URI sumber bucket penyimpanan Google Cloud .
    • URI adalah: pilih File tunggal.
    • Opsi penghapusan sumber: pilih opsi penghapusan sesuai preferensi Anda.
  9. Klik Berikutnya.

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

Menyiapkan feed dari Hub Konten

Tentukan nilai untuk kolom berikut:

  • URI Bucket Penyimpanan: URI sumber bucket penyimpanan Google Cloud .
  • URI adalah: pilih File tunggal.
  • 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
Alert.alertInfo.appVersion metadata.product_version Dipetakan langsung dari Alert.alertInfo.appVersion
Alert.alertInfo.operatingSystem principal.platform_version Dipetakan langsung dari Alert.alertInfo.operatingSystem
Alert.alertInfo.port additional.fields.value.string_value Dipetakan langsung dari Alert.alertInfo.port dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Alert port"
Alert.alertInfo.protocol network.ip_protocol Dipetakan langsung dari Alert.alertInfo.protocol
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Dipetakan langsung dari Alert.alertInfo.sslIssuer
Alert.alertInfo.sslName additional.fields.value.string_value Dipetakan langsung dari Alert.alertInfo.sslName dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "SSL Name"
Alert.alertInfo.sslOrg additional.fields.value.string_value Dipetakan langsung dari Alert.alertInfo.sslOrg dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "SSL Org"
Alert.alertInfo.ticketId additional.fields.value.string_value Dipetakan langsung dari Alert.alertInfo.ticketId dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Ticket Id"
Alert.alertInfo.vpeConfidence additional.fields.value.string_value Dipetakan langsung dari Alert.alertInfo.vpeConfidence dan ditambahkan sebagai key-value pair di additional.fields dengan kunci "VPE Confidence"
Alert.alertInfo.vpeStatus additional.fields.value.string_value Dipetakan langsung dari Alert.alertInfo.vpeStatus dan ditambahkan sebagai key-value pair di additional.fields dengan kunci "VPE Confidence"
Alert.eventType additional.fields.value.string_value Dipetakan langsung dari Alert.eventType dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Jenis Peristiwa"
Alert.hostname principal.hostname Dipetakan langsung dari Alert.hostname
Alert.id security_result.threat_id Dipetakan langsung dari Alert.id
Alert.ipAddress principal.ip Dipetakan langsung dari Alert.ipAddress
Alert.profile.id additional.fields.value.string_value Dipetakan langsung dari Alert.profile.id dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Profile Id"
Alert.profile.title additional.fields.value.string_value Dipetakan langsung dari Alert.profile.title dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Judul Profil"
Alert.qid vulnerability.name Dipetakan sebagai "QID: " dari Alert.qid
Alert.source additional.fields.value.string_value Dipetakan langsung dari Alert.source dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Sumber Pemberitahuan"
Alert.triggerUuid metadata.product_log_id Dipetakan langsung dari Alert.triggerUuid
Alert.vulnCategory additional.fields.value.string_value Dipetakan langsung dari Alert.vulnCategory dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Vulnerability Category"
Alert.vulnSeverity vulnerability.severity Dipetakan berdasarkan nilai Alert.vulnSeverity: 1-3: RENDAH, 4-6: SEDANG, 7-8: TINGGI
Alert.vulnTitle vulnerability.description Dipetakan langsung dari Alert.vulnTitle
Alert.vulnType additional.fields.value.string_value Dipetakan langsung dari Alert.vulnType dan ditambahkan sebagai pasangan nilai kunci di additional.fields dengan kunci "Vulnerability Type"
Host principal.ip Diuraikan dari baris log "Host: "
edr.client.ip_addresses Disalin dari principal.ip
edr.client.hostname Disalin dari principal.hostname
edr.raw_event_name Ditetapkan ke "STATUS_UPDATE" jika Alert.ipAddress, Alert.hostname, atau src_ip ada, jika tidak, ditetapkan ke "GENERIC_EVENT"
metadata.event_timestamp Diekstrak dari kolom Alert.eventDate atau timestamp. Alert.eventDate diprioritaskan jika ada, jika tidak, timestamp akan digunakan. Stempel waktu dikonversi ke UTC.
metadata.event_type Logika yang sama dengan edr.raw_event_name
metadata.log_type Tetapkan ke "QUALYS_CONTINUOUS_MONITORING"
metadata.product_name Tetapkan ke "QUALYS_CONTINUOUS_MONITORING"
metadata.vendor_name Tetapkan ke "QUALYS_CONTINUOUS_MONITORING"
network.application_protocol Diuraikan dari baris log " /user HTTP"
network.http.method Diuraikan dari baris log " /user HTTP"
timestamp event.timestamp Diekstrak dari kolom Alert.eventDate atau timestamp. Alert.eventDate diprioritaskan jika ada, jika tidak, timestamp akan digunakan. Stempel waktu dikonversi ke UTC.

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