收集 Qualys 资源上下文日志

支持的语言:

此解析器会从 Qualys JSON 日志中提取资产上下文信息,并将其转换为 UDM 格式。它会解析各种字段(例如 ID、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 存储分区

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

    进入“存储桶”

  3. 点击创建

  4. 配置存储桶:

    • 名称:输入符合存储桶名称要求的唯一名称(例如 qualys-asset-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 Function

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

    • 名称:输入函数的名称(例如 fetch-qualys-assets)。
    • 区域:选择靠近您的 Bucket 的区域。
    • 触发器:根据需要选择 HTTP 触发器或 Cloud Pub/Sub 以进行预定执行。
    • 身份验证:通过身份验证确保安全。
    • 使用内嵌编辑器编写代码
    ```python
    from google.cloud import storage
    import requests
    import base64
    import json
    
    # Cloud Storage configuration
    BUCKET_NAME = "<bucket-name>"
    FILE_NAME = "qualys_assets.json"
    
    # Qualys API credentials
    QUALYS_USERNAME = "<qualys-username>"
    QUALYS_PASSWORD = "<qualys-password>"
    QUALYS_BASE_URL = "https://<qualys_base_url>"
    
    def fetch_qualys_assets():
        auth = base64.b64encode(f"{QUALYS_USERNAME}:{QUALYS_PASSWORD}".encode()).decode()
        headers = {
            "Authorization": f"Basic {auth}",
            "Content-Type": "application/xml"
        }
        payload = """
        <ServiceRequest>
            <filters>
                <Criteria field="asset.name" operator="LIKE">%</Criteria>
            </filters>
        </ServiceRequest>
        """
        response = requests.post(f"{QUALYS_BASE_URL}/qps/rest/2.0/search/am/asset", headers=headers, data=payload)
        return response.json()
    
    def upload_to_gcs(data):
        client = storage.Client()
        bucket = client.get_bucket(BUCKET_NAME)
        blob = bucket.blob(FILE_NAME)
        blob.upload_from_string(json.dumps(data), content_type="application/json")
    
    def main(request):
        assets = fetch_qualys_assets()
        upload_to_gcs(assets)
        return "Data uploaded to Cloud Storage successfully!"
    
    ```
    
  4. 完成配置后,点击部署

配置 Cloud Scheduler

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

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

设置 Feed

您可以通过两种不同的入口点在 Google SecOps 平台中设置 Feed:

  • SIEM 设置 > Feed
  • 内容中心 > 内容包

通过“SIEM 设置”>“Feed”设置 Feed

如需配置 Feed,请按以下步骤操作:

  1. 依次前往 SIEM 设置 > Feed
  2. 点击添加新 Feed
  3. 在下一页上,点击配置单个 Feed
  4. Feed name 字段中,输入 Feed 的名称,例如 Qualys Asset Context Logs
  5. 选择 Google Cloud Storage 作为来源类型
  6. 选择 Qualys 资产上下文作为日志类型
  7. 点击下一步
  8. 为以下输入参数指定值:

    • GCS URI:Cloud Storage URI。
    • URI is a(URI 是):选择 Single file(单个文件)。
    • 来源删除选项:根据您的偏好设置选择删除选项。
  9. 点击下一步

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

设置来自内容中心的 Feed

为以下字段指定值:

  • GCS URI:Cloud Storage URI。
  • URI is a(URI 是):选择 Single file(单个文件)。
  • 来源删除选项:根据您的偏好设置选择删除选项。

高级选项

  • Feed 名称:用于标识 Feed 的预填充值。
  • 来源类型:用于将日志收集到 Google SecOps 中的方法。
  • 资源命名空间:与 Feed 关联的命名空间。
  • 提取标签:应用于相应 Feed 中所有事件的标签。

UDM 映射表

日志字段 UDM 映射 逻辑
ASSET_ID entity.entity.asset.asset_id 直接从 ASSET_ID 字段映射。
CLOUD_PROVIDER entity.relations.entity.resource.resource_subtype 直接从 CLOUD_PROVIDER 字段映射。
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 字段映射。
CLOUD_SERVICE entity.relations.entity.resource.resource_type 如果 CLOUD_SERVICE 为“VM”,则将值设置为“VIRTUAL_MACHINE”。
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 字段映射。
IP entity.entity.asset.ip 直接从 IP 字段映射。
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”。
TAGS.TAG[].NAME entity.relations.entity.resource.attribute.labels.key 直接从 TAGS.TAG[].NAME 字段映射。
TAGS.TAG[].TAG_ID entity.relations.entity.resource.attribute.labels.value 将字符串“TAG_ID: ”与 TAGS.TAG[].TAG_ID 的值连接起来。从原始日志的 create_time 字段复制。硬编码为“ASSET”。硬编码为“QUALYS ASSET CONTEXT”。硬编码为“QUALYS ASSET CONTEXT”。硬编码为“RESOURCE”。硬编码为“MEMBER”。从原始日志的 create_time 字段复制。

需要更多帮助?从社区成员和 Google SecOps 专业人士那里获得解答。