Mengumpulkan log Qualys Virtual Scanner
Parser ini mengubah log Qualys Virtual Scanner mentah berformat JSON menjadi format terstruktur yang sesuai dengan UDM Google Security Operations. Parser ini mengekstrak kolom yang relevan seperti informasi aset, detail pemindaian, dan kerentanan yang terdeteksi, lalu memetakannya ke kolom UDM yang sesuai untuk representasi dan analisis yang konsisten.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google Security Operations.
- Akses istimewa ke Google Cloud.
- Akses istimewa ke Qualys.
Mengaktifkan API yang Diperlukan:
- Login ke konsol Google Cloud .
- Buka APIs & Services > Library.
- Telusuri API berikut dan aktifkan:
- Cloud Functions API
- Cloud Scheduler API
- Cloud Pub/Sub (diperlukan agar Cloud Scheduler dapat memanggil fungsi)
Membuat Bucket Penyimpanan Google Cloud
- Login ke konsol Google Cloud .
Buka halaman Cloud Storage Buckets.
Klik Create.
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.
- Choose how to control access to objects: pilih not untuk menerapkan public access prevention, dan pilih access control model untuk objek bucket Anda.
- Storage class: Pilih berdasarkan kebutuhan Anda (misalnya, Standard).
Klik Create.
Membuat Akun Layanan Google Cloud
- Buka IAM & Admin > Service Accounts.
- Buat akun layanan baru.
- Beri nama deskriptif (misalnya, qualys-user).
- Berikan peran Storage Object Admin kepada akun layanan di bucket Cloud Storage yang Anda buat di langkah sebelumnya.
- Berikan peran Cloud Functions Invoker kepada akun layanan.
- Buat kunci SSH untuk akun layanan.
- Download file kunci JSON untuk akun layanan. Pastikan file ini tetap aman.
Opsional: Membuat Pengguna API khusus di Qualys
- Login ke konsol Qualys.
- Buka Pengguna.
- Klik Baru > Pengguna.
- Masukkan Informasi Umum yang diperlukan untuk pengguna.
- Pilih tab User Role.
- Pastikan peran tersebut memiliki kotak centang API Access yang dipilih.
- Klik Simpan.
Mengidentifikasi URL API Qualys spesifik Anda
Opsi 1
Identifikasi URL Anda seperti yang disebutkan dalam identifikasi platform.
Opsi 2
- Login ke konsol Qualys.
- Buka Bantuan > Tentang.
- Scroll untuk melihat informasi ini di bagian Pusat Operasi Keamanan (SOC).
- Salin URL API Qualys.
Mengonfigurasi Cloud Function
- Buka Cloud Functions di konsol Google Cloud .
- Klik Create Function.
Konfigurasi Fungsi:
- Name: masukkan nama untuk fungsi Anda (misalnya, fetch-qualys-vscanner).
- Region: pilih region yang dekat dengan Bucket Anda.
- Trigger: pilih pemicu HTTP jika diperlukan atau Cloud Pub/Sub untuk eksekusi terjadwal.
- Autentikasi: amankan 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 ```Klik Deploy setelah menyelesaikan konfigurasi.
Mengonfigurasi Cloud Scheduler
- Buka Cloud Scheduler di konsol Google Cloud .
- Klik Create Job.
Konfigurasikan tugas:
- Name: masukkan nama untuk tugas Anda (misalnya, trigger-fetch-qualys-vscanner).
- Frequency: gunakan sintaksis cron untuk menentukan jadwal (misalnya, 0 0 * * * untuk harian pada tengah malam).
- Zona Waktu: tetapkan zona waktu pilihan Anda.
- Trigger Type: Pilih HTTP.
- Trigger URL: masukkan URL Cloud Function (dapat ditemukan di detail fungsi setelah deployment).
- Method: Pilih POST.
Buat Tugas.
Menyiapkan feed
Untuk mengonfigurasi feed, ikuti langkah-langkah berikut:
- Buka Setelan > Pengelolaan Data > Feed. Jika Anda menggunakan platform khusus SIEM, buka Settings > Feeds.
- Klik Tambahkan Feed Berita Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Feed name, masukkan nama untuk feed; misalnya, Qualys Virtual Scanner Logs.
- Pilih Google Cloud Storage V2 sebagai Source type.
- Pilih Qualys Virtual Scanner sebagai Log type.
- Klik Berikutnya.
Tentukan nilai untuk parameter input berikut:
- Storage Bucket URI: URI sumber bucket penyimpanan Google Cloud .
- Opsi penghapusan sumber: pilih opsi penghapusan sesuai preferensi Anda.
Klik Berikutnya.
Tinjau konfigurasi feed berita 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, dikonversi ke 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 adalah "info" (tidak peka huruf besar/kecil), nilai tersebut akan dipetakan ke "INFORMATIONAL". Jika tidak, nilai 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, dikonversi ke 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 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 ada tidaknya kolom IP. Jika IP ada, nilai ditetapkan ke "IP_ADDRESS". Jika tidak, nilai ini akan ditetapkan ke "ASSET". |
|
| entity.metadata.interval.end_time | Dihardcode ke nilai stempel waktu yang sangat besar (253402300799 detik). | |
| entity.metadata.product_name | Diprogram secara permanen ke "QUALYS_VIRTUAL_SCANNER". | |
| entity.metadata.vendor_name | Diprogram secara permanen ke "QUALYS_VIRTUAL_SCANNER". | |
| entity.relations.entity.resource.resource_type | Jika CLOUD_SERVICE adalah "VM", nilai ini ditetapkan ke "VIRTUAL_MACHINE". |
|
| entity.relations.entity_type | Dihardcode ke "RESOURCE". | |
| entity.relations.relationship | Diprogram secara permanen ke "MEMBER". |
Log Perubahan
Melihat Log Perubahan untuk parser ini
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.