Qualys Virtual Scanner のログを収集する

以下でサポートされています。

このパーサーは、未加工の JSON 形式の Qualys Virtual Scanner ログを、Google Security Operations UDM に準拠した構造化形式に変換します。アセット情報、スキャンの詳細、検出された脆弱性などの関連フィールドを抽出し、対応する UDM フィールドにマッピングして、一貫した表現と分析を実現します。

始める前に

  • Google Security Operations インスタンスがあることを確認します。
  • Google Cloudへの特権アクセス権があることを確認します。
  • Qualys への特権アクセス権があることを確認します。

必要な API の有効化:

  1. Google Cloud コンソールにログインします。
  2. [API とサービス] > [ライブラリ] に移動します。
  3. 次の API を検索して有効にします。
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Pub/Sub(Cloud Scheduler が関数を呼び出すために必要)

Google Cloud Storage バケットの作成

  1. Google Cloud コンソールにログインします。
  2. [Cloud Storage バケット] のページに移動します。

    [バケット] に移動

  3. [作成] をクリックします。

  4. バケットを構成します。

    • 名前: バケット名の要件を満たす一意の名前を入力します(例: qualys-vscanner-bucket)。
    • データの保存場所の選択: ロケーションを選択します。
    • データのストレージ クラスを選択する: バケットの [デフォルトのストレージ クラス] を選択するか、ストレージ クラスの自動管理に [Autoclass] を選択します。
    • オブジェクトへのアクセスを制御する方法を選択する: [なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトの [アクセス制御モデル] を選択します。
    • ストレージ クラス: 必要に応じて選択します(Standard など)。
  5. [作成] をクリックします。

Google Cloud サービス アカウントを作成する

  1. [IAM と管理] > [サービス アカウント] に移動します。
  2. 新しいサービス アカウントを作成します。
  3. わかりやすい名前を付けます(例: qualys-user)。
  4. 前の手順で作成した Cloud Storage バケットに対する ストレージ オブジェクト管理者のロールをサービス アカウントに付与します。
  5. サービス アカウントに Cloud Functions 起動元 のロールを付与します。
  6. サービス アカウントのSSH キーを作成します。
  7. サービス アカウントの JSON キーファイルをダウンロードします。このファイルは安全に保管してください。

省略可: Qualys で専用の API ユーザーを作成する

  1. Qualys コンソールにログインします。
  2. [ユーザー] にアクセスします。
  3. [New] > [User] をクリックします。
  4. ユーザーに必要な [General Information] を入力します。
  5. [User Role] タブを選択します。
  6. ロールの [API Access] チェックボックスがオンになっていることを確認します。
  7. [Save] をクリックします。

特定の Qualys API URL を特定する

オプション 1

プラットフォームの特定で説明されているように、URL を特定します。

オプション 2

  1. Qualys コンソールにログインします。
  2. [Help] > [About] に移動します。
  3. スクロールして、[Security Operations Center (SOC)] でこの情報を確認します。
  4. Qualys API の URL をコピーします。

Cloud Functions を構成する

  1. コンソールで [Cloud Functions] に移動します。 Google Cloud
  2. [ファンクションを作成] をクリックします。
  3. 関数を構成します。

    • Name: 関数の名前を入力します(例: fetch-qualys-vscanner)。
    • Region: バケットに近いリージョンを選択します。
    • Trigger: 必要に応じて HTTP トリガーを選択します。スケジュール設定された実行の場合は Cloud Pub/Sub を選択します。
    • Authentication: 認証で保護します。
    • インライン エディタでコードを記述します。
    ```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. 構成が完了したら、[Deploy] をクリックします。

Cloud Scheduler を構成する

  1. コンソールで [Cloud Scheduler] に移動します。 Google Cloud
  2. [ジョブを作成] をクリックします。
  3. ジョブを構成します。

    • Name: ジョブの名前を入力します(例: trigger-fetch-qualys-vscanner)。
    • Frequency: cron 構文を使用してスケジュールを指定します(例: 0 0 * * * は毎日午前 0 時)。
    • Time Zone: 使用するタイムゾーンを設定します。
    • Trigger Type: [HTTP] を選択します。
    • Trigger URL: Cloud Functions の関数の URL を入力します(デプロイ後に関数の詳細で確認できます)。
    • Method: [POST] を選択します。
  4. ジョブを作成します。

Qualys Virtual Scanner のログを取り込むように Google SecOps でフィードを構成する

  1. [SIEM Settings] > [Feeds] に移動します。
  2. [新しく追加] をクリックします。
  3. [Feed name] フィールドに、フィードの名前を入力します(例: Qualys Virtual Scanner Logs)。
  4. [Source type] として [Google Cloud Storage] を選択します。
  5. [Log type] として [Qualys Virtual Scanner] を選択します。
  6. [次へ] をクリックします。
  7. 次の入力パラメータの値を指定します。

    • Storage Bucket URI: Google Cloud ストレージ バケットのソース URI。
    • URI is a: [Single file] を選択します。
    • Source deletion option: 必要に応じて削除オプションを選択します。
  8. [次へ] をクリックします。

  9. [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

  • 新しく作成されたパーサー。

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps の専門家から回答を得る。