Qualys Virtual Scanner のログを収集する
以下でサポートされています。
Google SecOpsSIEM
このパーサーは、未加工の JSON 形式の Qualys Virtual Scanner ログを、Google Security Operations UDM に準拠した構造化形式に変換します。アセット情報、スキャンの詳細、検出された脆弱性などの関連フィールドを抽出し、対応する UDM フィールドにマッピングして、一貫した表現と分析を実現します。
始める前に
- Google Security Operations インスタンスがあることを確認します。
- Google Cloudへの特権アクセス権があることを確認します。
- Qualys への特権アクセス権があることを確認します。
必要な API を有効にします。
- Google Cloud コンソールにログインします。
- [API とサービス] > [ライブラリ] に移動します。
- 次の API を検索して有効にします。
- Cloud Functions API
- Cloud Scheduler API
- Cloud Pub/Sub(Cloud Scheduler が関数を呼び出すために必要)
Google Cloud ストレージ バケットを作成する
- Google Cloud コンソールにログインします。
Cloud Storage バケットのページに移動します。
[作成] をクリックします。
バケットを構成します。
- 名前: バケット名の要件を満たす一意の名前を入力します(qualys-vscanner-bucket など)。
- データの保存場所を選択する: ロケーションを選択します。
- データのストレージ クラスを選択する: バケットのデフォルトのストレージ クラスを選択するか、ストレージ クラスの自動管理に Autoclass を選択します。
- オブジェクトへのアクセスを制御する方法を選択する: [なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトのアクセス制御モデルを選択します。
- ストレージ クラス: ニーズに応じて選択します(Standard など)。
[作成] をクリックします。
Google Cloud サービス アカウントを作成する
- [IAM と管理] > [サービス アカウント] に移動します。
- 新しいサービス アカウントを作成します。
- わかりやすい名前を付けます(例: qualys-user)。
- 前の手順で作成した Cloud Storage バケットに対する ストレージ オブジェクト管理者ロールをサービス アカウントに付与します。
- サービス アカウントに Cloud Functions 起動元のロールを付与します。
- サービス アカウントのSSH キーを作成します。
- サービス アカウントの JSON キーファイルをダウンロードします。このファイルは安全に保管してください。
省略可: Qualys で専用の API ユーザーを作成する
- Qualys コンソールにログインします。
- [ユーザー] にアクセスします。
- [新規] > [ユーザー] をクリックします。
- ユーザーに必要な一般情報を入力します。
- [ユーザー役割] タブを選択します。
- ロールの [API アクセス] チェックボックスがオンになっていることを確認します。
- [保存] をクリックします。
特定の Qualys API URL を特定する
オプション 1
プラットフォームの特定で説明されているように、URL を特定します。
オプション 2
- Qualys コンソールにログインします。
- [ヘルプ] > [情報] に移動します。
- スクロールして、[セキュリティ オペレーション センター(SOC)] でこの情報を確認します。
- Qualys API の URL をコピーします。
Cloud Functions の関数を構成する
- Google Cloud コンソールで、[Cloud Functions] に移動します。
- [ファンクションを作成] をクリックします。
関数を構成します。
- 名前: 関数の名前を入力します(例: fetch-qualys-vscanner)。
- リージョン: バケットに近いリージョンを選択します。
- トリガー: 必要に応じて HTTP トリガーを選択します。スケジュール設定された実行の場合は Cloud Pub/Sub を選択します。
- 認証: 認証で保護します。
- インライン エディタでコードを記述します。
```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 ```
構成が完了したら、[デプロイ] をクリックします。
Cloud Scheduler を構成する
- Google Cloud コンソールで、[Cloud Scheduler] に移動します。
- [ジョブを作成] をクリックします。
ジョブを構成します。
- 名前: ジョブの名前を入力します(例: trigger-fetch-qualys-vscanner)。
- 頻度: cron 構文を使用してスケジュールを指定します(例: 0 0 * * * は毎日午前 0 時)。
- タイムゾーン: 使用するタイムゾーンを設定します。
- トリガーのタイプ: [HTTP] を選択します。
- トリガー URL: Cloud Functions の関数の URL を入力します(デプロイ後に関数の詳細で確認できます)。
- メソッド: [POST] を選択します。
Job を作成します。
Qualys Virtual Scanner のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [新しく追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Qualys Virtual Scanner Logs)。
- [Source type] として [Google Cloud Storage] を選択します。
- [ログ タイプ] として [Qualys Virtual Scanner] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- Storage Bucket URI: Google Cloud ストレージ バケットのソース URI。
- URI は: [単一ファイル] を選択します。
- ソース削除オプション: 必要に応じて削除オプションを選択します。
- アセットの名前空間: アセットの名前空間。
- 取り込みラベル: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
ASSET_ID | entity.entity.asset.asset_id | ASSET_ID フィールドからの直接マッピング。 |
CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME | entity.relations.entity.resource.attribute.labels.key | CLOUD_PROVIDER_TAGS.CLOUD_TAG.NAME フィールドからの直接マッピング。 |
CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE | entity.relations.entity.resource.attribute.labels.value | CLOUD_PROVIDER_TAGS.CLOUD_TAG.VALUE フィールドからの直接マッピング。 |
CLOUD_RESOURCE_ID | entity.relations.entity.resource.id | CLOUD_RESOURCE_ID フィールドからの直接マッピング。 |
DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME | entity.metadata.threat.first_discovered_time | DETECTION_LIST.DETECTION.FIRST_FOUND_DATETIME フィールドからの直接マッピング。タイムスタンプに変換されます。 |
DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.FIRST_REOPENED_DATETIME フィールドからの直接マッピング。このキーは「FIRST_REOPENED_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.IS_DISABLED | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.IS_DISABLED フィールドからの直接マッピング。このキーは「IS_DISABLED」としてハードコードされています。 |
DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.LAST_FIXED_DATETIME フィールドからの直接マッピング。このキーは「LAST_FIXED_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.LAST_FOUND_DATETIME フィールドからの直接マッピング。このキーは「LAST_FOUND_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.LAST_PROCESSED_DATETIME フィールドからの直接マッピング。このキーは「LAST_PROCESSED_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.LAST_REOPENED_DATETIME フィールドからの直接マッピング。このキーは「LAST_REOPENED_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.LAST_TEST_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.LAST_TEST_DATETIME フィールドからの直接マッピング。このキーは「LAST_TEST_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.LAST_UPDATE_DATETIME フィールドからの直接マッピング。このキーは「LAST_UPDATE_DATETIME」としてハードコードされています。 |
DETECTION_LIST.DETECTION.PORT | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.PORT フィールドからの直接マッピング。このキーは「PORT」としてハードコードされています。 |
DETECTION_LIST.DETECTION.PROTOCOL | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.PROTOCOL フィールドからの直接マッピング。キーは「PROTOCOL」としてハードコードされています。 |
DETECTION_LIST.DETECTION.QID | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.QID フィールドからの直接マッピング。キーは「QID」としてハードコードされています。 |
DETECTION_LIST.DETECTION.RESULTS | entity.metadata.threat.summary | DETECTION_LIST.DETECTION.RESULTS フィールドからの直接マッピング。 |
DETECTION_LIST.DETECTION.SEVERITY | entity.metadata.threat.severity_details | DETECTION_LIST.DETECTION.SEVERITY フィールドからの直接マッピング。 |
DETECTION_LIST.DETECTION.SSL | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.SSL フィールドからの直接マッピング。キーは「SSL」としてハードコードされています。 |
DETECTION_LIST.DETECTION.STATUS | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.STATUS フィールドからの直接マッピング。キーは「STATUS」としてハードコードされています。 |
DETECTION_LIST.DETECTION.TIMES_FOUND | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.TIMES_FOUND フィールドからの直接マッピング。このキーは「TIMES_FOUND」としてハードコードされています。 |
DETECTION_LIST.DETECTION.TIMES_REOPENED | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.TIMES_REOPENED フィールドからの直接マッピング。このキーは「TIMES_REOPENED」としてハードコードされています。 |
DETECTION_LIST.DETECTION.TYPE | entity.metadata.threat.severity | DETECTION_LIST.DETECTION.TYPE フィールドからマッピングされます。値が「info」(大文字と小文字は区別されません)の場合、"INFORMATIONAL" にマッピングされます。それ以外の場合は、キー「TYPE」を持つ検出フィールドとして追加されます。 |
DETECTION_LIST.DETECTION.UNIQUE_VULN_ID | entity.metadata.threat.detection_fields.value | DETECTION_LIST.DETECTION.UNIQUE_VULN_ID フィールドからの直接マッピング。このキーは「UNIQUE_VULN_ID」としてハードコードされています。 |
DNS | entity.entity.asset.hostname | DNS_DATA.HOSTNAME が空の場合、DNS フィールドからマッピングされます。 |
DNS_DATA.HOSTNAME | entity.entity.asset.hostname | DNS_DATA.HOSTNAME フィールドからの直接マッピング。 |
EC2_INSTANCE_ID | entity.relations.entity.resource.product_object_id | EC2_INSTANCE_ID フィールドからの直接マッピング。 |
ID | entity.entity.asset.product_object_id | ID フィールドからの直接マッピング。 |
ID | entity.metadata.product_entity_id | ID フィールドからの直接マッピング。 |
IP | entity.entity.ip | IP フィールドからの直接マッピング。 |
LAST_SCAN_DATETIME | entity.metadata.interval.start_time | LAST_SCAN_DATETIME フィールドからの直接マッピング。タイムスタンプに変換されます。 |
METADATA.AZURE.ATTRIBUTE.NAME | entity.relations.entity.resource.attribute.labels.key | METADATA.AZURE.ATTRIBUTE.NAME フィールドからの直接マッピング。 |
METADATA.AZURE.ATTRIBUTE.VALUE | entity.relations.entity.resource.attribute.labels.value | METADATA.AZURE.ATTRIBUTE.VALUE フィールドからの直接マッピング。 |
OS | entity.entity.asset.platform_software.platform | OS フィールドからマッピングされます。値に「windows」が含まれている場合(大文字と小文字は区別されません)、その値は「WINDOWS」にマッピングされます。「Linux」(大文字と小文字は区別しない)が含まれている場合は、「LINUX」にマッピングされます。 |
TAGS.TAG.NAME | entity.relations.entity.resource.attribute.labels.key | TAGS.TAG.NAME フィールドからの直接マッピング。 |
TAGS.TAG.TAG_ID | entity.relations.entity.resource.attribute.labels.value | TAGS.TAG.TAG_ID フィールドからマッピングされます。値の先頭には「TAG_ID:」が付いています。 |
entity.metadata.collected_timestamp | ログエントリのタイムスタンプ。 | |
entity.metadata.entity_type | IP フィールドの有無に基づいて判断されます。IP が存在する場合は、「IP_ADDRESS」に設定されます。それ以外の場合は「ASSET」に設定されます。 |
|
entity.metadata.interval.end_time | 非常に大きなタイムスタンプ値(253402300799 秒)にハードコードされています。 | |
entity.metadata.product_name | 「QUALYS_VIRTUAL_SCANNER」にハードコードされています。 | |
entity.metadata.vendor_name | 「QUALYS_VIRTUAL_SCANNER」にハードコードされています。 | |
entity.relations.entity.resource.resource_type | CLOUD_SERVICE が「VM」の場合、これは「VIRTUAL_MACHINE」に設定されます。 |
|
entity.relations.entity_type | 「RESOURCE」にハードコードされています。 | |
entity.relations.relationship | 「MEMBER」にハードコードされています。 |
変更点
2023-08-21
- 元のログの「detection.UNIQUE_VULN_ID」値を UDM の「threat.detection_fields」フィールドにマッピングしました。
2023-07-31
- 新しく作成されたパーサー。