Mengumpulkan log Qualys Virtual Scanner

Didukung di:

Parser ini mengubah log Qualys Virtual Scanner berformat JSON mentah menjadi format terstruktur yang sesuai dengan UDM Google Security Operations. Alat ini mengekstrak kolom yang relevan seperti informasi aset, detail pemindaian, dan kerentanan yang terdeteksi, serta memetakan kolom tersebut ke kolom UDM yang sesuai untuk representasi dan analisis yang konsisten.

Sebelum memulai

  • Pastikan Anda memiliki instance Google Security Operations.
  • Pastikan Anda memiliki akses dengan hak istimewa ke Google Cloud.
  • Pastikan Anda memiliki akses dengan hak istimewa ke Qualys.

Aktifkan API yang Diperlukan:

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

Membuat Google Cloud Bucket Penyimpanan

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

    Buka Buckets

  3. Klik Buat.

  4. Konfigurasikan bucket:

    • Name: masukkan nama unik yang memenuhi persyaratan nama bucket (misalnya, qualys-vscanner-bucket).
    • Choose where to store your data: 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, Standar).
  5. Klik Buat.

Membuat Akun Layanan Google Cloud

  1. Buka IAM & Admin > Service Accounts.
  2. Buat akun layanan baru.
  3. Beri nama deskriptif (misalnya, qualys-user).
  4. Berikan akun layanan dengan peran Storage Object Admin di bucket Cloud Storage yang Anda buat di langkah sebelumnya.
  5. Berikan peran Cloud Functions Invoker ke akun layanan.
  6. Buat kunci SSH untuk akun layanan.
  7. Mendownload file kunci JSON untuk akun layanan. Pastikan file ini tetap aman.

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 centang Akses API yang dicentang.
  7. Klik Save.

Identifikasi 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 Help > About.
  3. Scroll untuk melihat informasi ini di bagian Pusat Operasi Keamanan (SOC).
  4. Salin URL Qualys API.

Mengonfigurasi Cloud Function

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

    • Name: masukkan nama untuk fungsi Anda (misalnya, fetch-qualys-vscanner).
    • Region: pilih region yang dekat dengan Bucket 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_virtual_scanners.json"
    
    # Qualys API Credentials
    QUALYS_USERNAME = "qualys-username"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"  # for example, https://qualysapi.qualys.com
    
    def fetch_virtual_scanners():
        """Fetch Virtual Scanner details from Qualys."""
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        url = f"{QUALYS_BASE_URL}/api/2.0/fo/scanner/"
        payload = {
            "action": "list",
            "scanner_type": "virtual"
        }
        response = requests.post(url, headers=headers, data=payload)
        response.raise_for_status()
        return response.text  # Qualys API returns XML data
    
    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(data, content_type="application/xml")
    
    def main(request):
        """Cloud Function entry point."""
        try:
            scanners = fetch_virtual_scanners()
            upload_to_gcs(scanners)
            return "Qualys Virtual Scanners data 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 Google Cloud konsol.
  2. Klik Create Job.
  3. Konfigurasikan tugas:

    • Nama: masukkan nama untuk tugas Anda (misalnya, trigger-fetch-qualys-vscanner).
    • Frequency: gunakan sintaksis cron untuk menentukan jadwal (misalnya, 0 0 * * * untuk setiap hari pada tengah malam).
    • Zona Waktu: tetapkan zona waktu pilihan Anda.
    • Jenis Pemicu: Pilih HTTP.
    • Trigger URL: masukkan URL Cloud Functions (ditemukan di detail fungsi setelah deployment).
    • Method: Pilih POST.
  4. Buat Tugas.

Mengonfigurasi feed di Google SecOps untuk menyerap log Virtual Scanner Qualys

  1. Buka SIEM Settings > Feeds.
  2. Klik Tambahkan baru.
  3. Di kolom Feed name, masukkan nama untuk feed (misalnya, Qualys Virtual Scanner Logs).
  4. Pilih Google Cloud Storage sebagai Source type.
  5. Pilih Qualys Virtual Scanner sebagai Jenis log.
  6. Klik Berikutnya.
  7. Tentukan nilai untuk parameter input berikut:

    • Storage Bucket URI: Google Cloud URI sumber bucket penyimpanan.
    • URI adalah: pilih Single file.
    • Opsi penghapusan sumber: pilih opsi penghapusan sesuai preferensi Anda.
    • Namespace aset: namespace aset.
    • Label penyerapan: label yang akan diterapkan ke peristiwa dari feed ini.
  8. Klik Berikutnya.

  9. Tinjau konfigurasi feed baru Anda di layar Finalize, lalu klik Submit.

Tabel Pemetaan UDM

Kolom Log Pemetaan UDM Logika
ASSET_ID entity.entity.asset.asset_id Pemetaan langsung dari kolom ASSET_ID.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME entity.relations.entity.resource.attribute.labels.key Pemetaan langsung dari kolom CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME.
CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE entity.relations.entity.resource.attribute.labels.value Pemetaan langsung dari kolom CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE.
CLOUD_RESOURCE_ID entity.relations.entity.resource.id Pemetaan langsung dari kolom CLOUD_RESOURCE_ID.
DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME entity.metadata.threat.first_discovered_time Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME, yang dikonversi menjadi stempel waktu.
DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME. Kunci di-hardcode sebagai "FIRST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.IS_DISABLED entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.IS_DISABLED. Kunci di-hardcode sebagai "IS_DISABLED".
DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME. Kunci di-hardcode sebagai "LAST_FIXED_DATETIME".
DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME. Kunci di-hardcode sebagai "LAST_FOUND_DATETIME".
DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME. Kunci di-hardcode sebagai "LAST_PROCESSED_DATETIME".
DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME. Kunci di-hardcode sebagai "LAST_REOPENED_DATETIME".
DETECTION_LIST.DETECTION.LAST_TEST_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.LAST_TEST_DATETIME. Kunci di-hardcode sebagai "LAST_TEST_DATETIME".
DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME. Kunci di-hardcode sebagai "LAST_UPDATE_DATETIME".
DETECTION_LIST.DETECTION.PORT entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.PORT. Kunci di-hardcode sebagai "PORT".
DETECTION_LIST.DETECTION.PROTOCOL entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.PROTOCOL. Kunci di-hardcode sebagai "PROTOCOL".
DETECTION_LIST.DETECTION.QID entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.QID. Kunci di-hardcode sebagai "QID".
DETECTION_LIST.DETECTION.RESULTS entity.metadata.threat.summary Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.RESULTS.
DETECTION_LIST.DETECTION.SEVERITY entity.metadata.threat.severity_details Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.SEVERITY.
DETECTION_LIST.DETECTION.SSL entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.SSL. Kunci di-hardcode sebagai "SSL".
DETECTION_LIST.DETECTION.STATUS entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.STATUS. Kunci di-hardcode sebagai "STATUS".
DETECTION_LIST.DETECTION.TIMES_FOUND entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.TIMES_FOUND. Kunci di-hardcode sebagai "TIMES_FOUND".
DETECTION_LIST.DETECTION.TIMES_REOPENED entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.TIMES_REOPENED. Kunci di-hardcode sebagai "TIMES_REOPENED".
DETECTION_LIST.DETECTION.TYPE entity.metadata.threat.severity Dipetakan dari kolom DETECTION_LIST.DETECTION.TYPE. Jika nilainya "info" (tidak peka huruf besar/kecil), nilai tersebut akan dipetakan ke "INFORMATIONAL". Jika tidak, kolom tersebut akan ditambahkan sebagai kolom deteksi dengan kunci "TYPE".
DETECTION_LIST.DETECTION.UNIQUE_VULN_ID entity.metadata.threat.detection_fields.value Pemetaan langsung dari kolom DETECTION_LIST.DETECTION.UNIQUE_VULN_ID. Kunci di-hardcode sebagai "UNIQUE_VULN_ID".
DNS entity.entity.asset.hostname Dipetakan dari kolom DNS jika DNS_DATA.HOSTNAME kosong.
DNS_DATA.HOSTNAME entity.entity.asset.hostname Pemetaan langsung dari kolom DNS_DATA.HOSTNAME.
EC2_INSTANCE_ID entity.relations.entity.resource.product_object_id Pemetaan langsung dari kolom EC2_INSTANCE_ID.
ID entity.entity.asset.product_object_id Pemetaan langsung dari kolom ID.
ID entity.metadata.product_entity_id Pemetaan langsung dari kolom ID.
IP entity.entity.ip Pemetaan langsung dari kolom IP.
LAST_SCAN_DATETIME entity.metadata.interval.start_time Pemetaan langsung dari kolom LAST_SCAN_DATETIME, yang dikonversi menjadi stempel waktu.
METADATA.AZURE.ATTRIBUTE.NAME entity.relations.entity.resource.attribute.labels.key Pemetaan langsung dari kolom METADATA.AZURE.ATTRIBUTE.NAME.
METADATA.AZURE.ATTRIBUTE.VALUE entity.relations.entity.resource.attribute.labels.value Pemetaan langsung dari kolom METADATA.AZURE.ATTRIBUTE.VALUE.
OS entity.entity.asset.platform_software.platform Dipetakan dari kolom OS. Jika nilai berisi "windows" (tidak peka huruf besar/kecil), nilai tersebut akan dipetakan ke "WINDOWS". Jika berisi "Linux" (tidak peka huruf besar/kecil), string tersebut akan dipetakan ke "LINUX".
TAGS.TAG.NAME entity.relations.entity.resource.attribute.labels.key Pemetaan langsung dari kolom TAGS.TAG.NAME.
TAGS.TAG.TAG_ID entity.relations.entity.resource.attribute.labels.value Dipetakan dari kolom TAGS.TAG.TAG_ID. Nilai diawali dengan "TAG_ID: ".
entity.metadata.collected_timestamp Stempel waktu entri log.
entity.metadata.entity_type Ditentukan berdasarkan keberadaan kolom IP. Jika ada, IP akan ditetapkan ke "IP_ADDRESS". Jika tidak, nilai ini akan ditetapkan ke "ASSET".
entity.metadata.interval.end_time Di-hardcode ke nilai stempel waktu yang sangat besar (253402300799 detik).
entity.metadata.product_name Di-hardcode ke "QUALYS_VIRTUAL_SCANNER".
entity.metadata.vendor_name Di-hardcode ke "QUALYS_VIRTUAL_SCANNER".
entity.relations.entity.resource.resource_type Jika CLOUD_SERVICE adalah "VM", CLOUD_SERVICE akan ditetapkan ke "VIRTUAL_MACHINE".
entity.relations.entity_type Di-hardcode ke "RESOURCE".
entity.relations.relationship Di-hardcode ke "MEMBER".

Perubahan

2023-08-21

  • Memetakan nilai "detection.UNIQUE_VULN_ID" dari log asli ke kolom "threat.detection_fields" di UDM.

2023-07-31

  • Parser yang baru dibuat.