Qualys Continuous Monitoring のログを収集する

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

この Logstash パーサー コードは、まず grok パターンを使用して、未加工のログ メッセージから送信元 IP、ユーザー、メソッド、アプリケーション プロトコルなどのフィールドを抽出します。次に、未加工ログデータの特定のフィールドを統合データモデル(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-asset-bucket)。
    • データの保存場所の選択: ロケーションを選択します。
    • データのストレージ クラスを選択する: バケットの [デフォルトのストレージ クラス] を選択するか、ストレージ クラスの自動管理に [Autoclass] を選択します。
    • オブジェクトへのアクセスを制御する方法を選択する: [なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトの [アクセス制御モデル] を選択します。
    • ストレージ クラス: 必要に応じて選択します(Standard など)。
  5. [作成] をクリックします。

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

  1. Google Cloud コンソールにログインします。
  2. [IAM と管理] > [サービス アカウント] に移動します。
  3. 新しいサービス アカウントを作成します。
  4. わかりやすい名前を付けます(例: qualys-user)。
  5. 前の手順で作成した GCS バケットに対する Storage オブジェクト管理者のロールをサービス アカウントに付与します。
  6. サービス アカウントに Cloud Functions 起動元のロールを付与します。
  7. サービス アカウント用の SSH キーを作成します。
  8. サービス アカウント用の 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. Google Cloud コンソールで Cloud Functions に移動します。
  2. [ファンクションを作成] をクリックします。
  3. ファンクションを構成します。

    • Name: ファンクションの名前を入力します(例: fetch-qualys-cm-alerts)。
    • Region: バケットに近いリージョンを選択します。
    • Runtime: Python 3.10(または任意のランタイム)。
    • 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_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. 構成が完了したら、[Deploy] をクリックします。

Cloud Scheduler を構成する

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

    • 名前: ジョブの名前を入力します(例: trigger-fetch-qualys-cm-alerts)。
    • 頻度: cron 構文を使用してスケジュールを指定します(例: 1 時間ごとに実行するには 0 * * * *)。
    • タイムゾーン: 任意のタイムゾーンを設定します。
    • トリガーのタイプ: [HTTP] を選択します。
    • トリガー URL: Cloud Functions のファンクションの URL を入力します(デプロイ後にファンクションの詳細で確認できます)。
    • メソッド: [POST] を選択します。
  4. ジョブを作成します

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

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

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

  9. [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。

UDM マッピング テーブル

ログフィールド UDM マッピング 論理
Alert.alertInfo.appVersion metadata.product_version Alert.alertInfo.appVersion から直接マッピングされます
Alert.alertInfo.operatingSystem principal.platform_version Alert.alertInfo.operatingSystem から直接マッピングされます
Alert.alertInfo.port additional.fields.value.string_value Alert.alertInfo.port から直接マッピングされ、additional.fields の Key-Value ペアとして「Alert port」キーで追加されます
Alert.alertInfo.protocol network.ip_protocol Alert.alertInfo.protocol から直接マッピングされます
Alert.alertInfo.sslIssuer network.tls.client.certificate.issuer Alert.alertInfo.sslIssuer から直接マッピングされます
Alert.alertInfo.sslName additional.fields.value.string_value Alert.alertInfo.sslName から直接マッピングされ、additional.fields の Key-Value ペアとして「SSL Name」キーで追加されます
Alert.alertInfo.sslOrg additional.fields.value.string_value Alert.alertInfo.sslOrg から直接マッピングされ、additional.fields の Key-Value ペアとして「SSL Org」キーで追加されます
Alert.alertInfo.ticketId additional.fields.value.string_value Alert.alertInfo.ticketId から直接マッピングされ、additional.fields の Key-Value ペアとして「Ticket Id」キーで追加されます
Alert.alertInfo.vpeConfidence additional.fields.value.string_value Alert.alertInfo.vpeConfidence から直接マッピングされ、additional.fields の Key-Value ペアとして「VPE Confidence」キーで追加されます
Alert.alertInfo.vpeStatus additional.fields.value.string_value Alert.alertInfo.vpeStatus から直接マッピングされ、additional.fields の Key-Value ペアとして「VPE Confidence」キーで追加されます
Alert.eventType additional.fields.value.string_value Alert.eventType から直接マッピングされ、additional.fields の Key-Value ペアとして「Event Type」キーで追加されます
Alert.hostname principal.hostname Alert.hostname から直接マッピングされます
Alert.id security_result.threat_id Alert.id から直接マッピングされます
Alert.ipAddress principal.ip Alert.ipAddress から直接マッピングされます
Alert.profile.id additional.fields.value.string_value Alert.profile.id から直接マッピングされ、additional.fields の Key-Value ペアとして「Profile Id」キーで追加されます
Alert.profile.title additional.fields.value.string_value Alert.profile.title から直接マッピングされ、additional.fields の Key-Value ペアとして「Profile Title」キーで追加されます
Alert.qid vulnerability.name Alert.qid から「QID:」としてマッピングされます
Alert.source additional.fields.value.string_value Alert.source から直接マッピングされ、additional.fields の Key-Value ペアとして「Alert Source」キーで追加されます
Alert.triggerUuid metadata.product_log_id Alert.triggerUuid から直接マッピングされます
Alert.vulnCategory additional.fields.value.string_value Alert.vulnCategory から直接マッピングされ、additional.fields の Key-Value ペアとして「Vulnerability Category」キーで追加されます
Alert.vulnSeverity vulnerability.severity Alert.vulnSeverity の値に基づいてマッピングされます。1~3: LOW、4~6: MEDIUM、7~8: HIGH
Alert.vulnTitle vulnerability.description Alert.vulnTitle から直接マッピングされます
Alert.vulnType additional.fields.value.string_value Alert.vulnType から直接マッピングされ、additional.fields の Key-Value ペアとして「Vulnerability Type」キーで追加されます
ホスト principal.ip ログ行「Host: から解析されます
edr.client.ip_addresses principal.ip からのコピー
edr.client.hostname principal.hostname からのコピー
edr.raw_event_name Alert.ipAddressAlert.hostname、または src_ip が存在する場合は「STATUS_UPDATE」に設定し、それ以外の場合は「GENERIC_EVENT」に設定します。
metadata.event_timestamp Alert.eventDate フィールドまたは timestamp フィールドから抽出されます。Alert.eventDate が存在する場合は優先されます。存在しない場合は timestamp が使用されます。タイムスタンプは UTC に変換されます。
metadata.event_type edr.raw_event_name と同じロジック
metadata.log_type 「QUALYS_CONTINUOUS_MONITORING」に設定します。
metadata.product_name 「QUALYS_CONTINUOUS_MONITORING」に設定します。
metadata.vendor_name 「QUALYS_CONTINUOUS_MONITORING」に設定します。
network.application_protocol ログ行「 /user HTTP」 から解析されます
network.http.method ログ行「 /user HTTP」 から解析されます
timestamp event.timestamp Alert.eventDate フィールドまたは timestamp フィールドから抽出されます。Alert.eventDate が存在する場合は優先されます。存在しない場合は timestamp が使用されます。タイムスタンプは UTC に変換されます。

変更

2022-08-30

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

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。