Qualys Continuous Monitoring のログを収集する
以下でサポートされています。
Google SecOpsSIEM
この Logstash パーサー コードは、まず grok パターンを使用して、未加工のログ メッセージから送信元 IP、ユーザー、メソッド、アプリケーション プロトコルなどのフィールドを抽出します。次に、未加工ログデータの特定のフィールドを統合データモデル(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 Storage バケットの作成
- Google Cloud コンソールにログインします。
[Cloud Storage バケット] のページに移動します。
[作成] をクリックします。
バケットを構成します。
- 名前: バケット名の要件を満たす一意の名前を入力します(例: qualys-asset-bucket)。
- データの保存場所の選択: ロケーションを選択します。
- データのストレージ クラスを選択する: バケットの [デフォルトのストレージ クラス] を選択するか、ストレージ クラスの自動管理に [Autoclass] を選択します。
- オブジェクトへのアクセスを制御する方法を選択する: [なし] を選択して公開アクセスの防止を適用し、バケットのオブジェクトの [アクセス制御モデル] を選択します。
- ストレージ クラス: 必要に応じて選択します(Standard など)。
[作成] をクリックします。
Google Cloud サービス アカウントを作成する
- Google Cloud コンソールにログインします。
- [IAM と管理] > [サービス アカウント] に移動します。
- 新しいサービス アカウントを作成します。
- わかりやすい名前を付けます(例: qualys-user)。
- 前の手順で作成した GCS バケットに対する Storage オブジェクト管理者のロールをサービス アカウントに付与します。
- サービス アカウントに Cloud Functions 起動元のロールを付与します。
- サービス アカウント用の SSH キーを作成します。
- サービス アカウント用の JSON キーファイルをダウンロードします。このファイルは安全に保管してください。
省略可: Qualys で専用の API ユーザーを作成する
- Qualys コンソールにログインします。
- [ユーザー] にアクセスします。
- [New] > [User] をクリックします。
- ユーザーに必要な [General Information] を入力します。
- [User Role] タブを選択します。
- ロールの [API Access] チェックボックスがオンになっていることを確認します。
- [Save] をクリックします。
特定の Qualys API URL を識別する
オプション 1
プラットフォームの特定の記事に記載されている方法で URL を特定します。
オプション 2
- Qualys コンソールにログインします。
- [Help] > [About] に移動します。
- スクロールして、[Security Operations Center (SOC)] でこの情報を確認します。
- Qualys API の URL をコピーします。
Cloud Functions を構成する
- Google Cloud コンソールで Cloud Functions に移動します。
- [ファンクションを作成] をクリックします。
ファンクションを構成します。
- 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 ```
構成が完了したら、[Deploy] をクリックします。
Cloud Scheduler を構成する
- Google Cloud コンソールで [Cloud Scheduler] に移動します。
- [ジョブを作成] をクリックします。
ジョブを構成します。
- 名前: ジョブの名前を入力します(例: trigger-fetch-qualys-cm-alerts)。
- 頻度: cron 構文を使用してスケジュールを指定します(例: 1 時間ごとに実行するには
0 * * * *
)。 - タイムゾーン: 任意のタイムゾーンを設定します。
- トリガーのタイプ: [HTTP] を選択します。
- トリガー URL: Cloud Functions のファンクションの URL を入力します(デプロイ後にファンクションの詳細で確認できます)。
- メソッド: [POST] を選択します。
ジョブを作成します
Qualys Continuous Monitoring のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [新しく追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例: Qualys Continuous Monitoring Logs)。
- [Source type] として [Google Cloud Storage] を選択します。
- [Log type] として [Qualys Continuous Monitoring] を選択します。
- [次へ] をクリックします。
次の入力パラメータの値を指定します。
- Storage Bucket URI: Google Cloud ストレージ バケットのソース URI。
- URI is a: [Single file] を選択します。
- Source deletion options: 必要に応じて削除オプションを選択します。
- Asset namespace: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
[次へ] をクリックします。
[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 |
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.ipAddress 、Alert.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 | ログ行「 |
|
network.http.method | ログ行「 |
|
timestamp | event.timestamp | Alert.eventDate フィールドまたは timestamp フィールドから抽出されます。Alert.eventDate が存在する場合は優先されます。存在しない場合は timestamp が使用されます。タイムスタンプは UTC に変換されます。 |
変更
2022-08-30
- 新しく作成されたパーサー。
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。