收集 Qualys 虚拟扫描器日志

支持的平台:

此解析器会将采用 JSON 格式的原始 Qualys 虚拟扫描器日志转换为符合 Google 安全运营 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 存储分区

  1. 登录 Google Cloud 控制台。
  2. 前往 Cloud Storage 存储分区页面。

    进入“存储桶”

  3. 点击创建

  4. 配置存储分区:

    • 名称:输入符合存储分区名称要求的唯一名称(例如 qualys-vscanner-bucket)。
    • 选择数据存储位置:选择一个位置。
    • 为数据选择一个存储类别:为存储分区选择默认存储类别,或者选择 Autoclass 以自动管理存储类别。
    • 选择如何控制对象的访问权限:选择以强制执行禁止公开访问,然后为存储分区对象选择访问权限控制模型
    • 存储类别:根据您的需求进行选择(例如标准)。
  5. 点击创建

创建 Google Cloud 服务账号

  1. 依次前往 IAM 和管理 > 服务账号
  2. 创建新的服务账号。
  3. 为其指定一个描述性名称(例如 qualys-user)。
  4. 向服务账号授予您在上一步中创建的 Cloud Storage 存储分区的 Storage Object Admin 角色。
  5. 向服务账号授予 Cloud Functions Invoker 角色。
  6. 为服务账号创建 SSH 密钥
  7. 下载服务账号的 JSON 密钥文件。请妥善保管此文件。

可选:在 Qualys 中创建专用 API 用户

  1. 登录 Qualys 控制台。
  2. 前往用户
  3. 依次点击新建 > 用户
  4. 输入用户所需的一般信息
  5. 选择用户角色标签页。
  6. 确保该角色的 API 访问权限复选框处于选中状态。
  7. 点击保存

确定您的具体 Qualys API 网址

选项 1

按照平台识别中所述的方法识别您的网址。

选项 2

  1. 登录 Qualys 控制台。
  2. 依次前往帮助 > 关于
  3. 滚动到“安全运维中心 (SOC)”下方查看此信息。
  4. 复制 Qualys API 网址。

配置 Cloud Functions 函数

  1. 在 Google Cloud 控制台中,前往 Cloud Functions
  2. 点击创建函数
  3. 配置函数:

    • 名称:输入函数的名称(例如 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
    ```
    
  4. 完成配置后,点击部署

配置 Cloud Scheduler

  1. 在 Google Cloud 控制台中,前往 Cloud Scheduler
  2. 点击创建作业
  3. 配置作业:

    • 名称:输入作业的名称(例如 trigger-fetch-qualys-vscanner)。
    • 频率:使用 cron 语法指定时间表(例如,0 0 * * * 表示每天午夜)。
    • 时区:设置您的首选时区。
    • 触发器类型:选择 HTTP
    • 触发器网址:输入 Cloud Functions 函数的网址(可在部署后的函数详情中找到)。
    • 方法:选择 POST
  4. 创建作业。

在 Google SecOps 中配置 Feed 以提取 Qualys 虚拟扫描器日志

  1. 依次前往 SIEM 设置 > Feed
  2. 点击新增
  3. Feed 名称字段中,输入 Feed 的名称(例如 Qualys 虚拟扫描器日志)。
  4. 选择 Google Cloud Storage 作为来源类型
  5. 选择 Qualys Virtual Scanner 作为日志类型
  6. 点击下一步
  7. 为以下输入参数指定值:

    • 存储分区 URI: Google Cloud 存储分区来源 URI。
    • URI 是:选择单个文件
    • 来源删除选项:根据您的偏好设置选择删除选项。
    • 资源命名空间资源命名空间
    • 提取标签:要应用于此 Feed 中的事件的标签。
  8. 点击下一步

  9. 最终确定界面中查看新的 Feed 配置,然后点击提交

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 字段的直接映射。
操作系统 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

  • 新创建的解析器。