查看组织操作系统政策中的自定义数据

本文档介绍了如何使用虚拟机管理器、Cloud Asset Inventory 和 BigQuery 查看组织中操作系统政策的自定义数据和强制执行错误消息。如果您需要组织范围内的报告,其中包含标准合规性状态未捕获的自定义虚拟机配置、脚本输出或政策执行失败情况,请使用此工作流。

如需收集自定义数据,请在操作系统政策中配置 outputFilePath,这是虚拟机上政策脚本写入自定义文本或 JSON 输出的本地路径。虚拟机管理器会读取此路径中的输出,并将其存储在操作系统政策分配报告中。然后,您可以使用 Cloud Asset Inventory 查询整个虚拟机群的结果,将这些报告导出到 BigQuery。

准备工作

所需的角色

如需获得将资源数据导出到 BigQuery 并查询自定义操作系统政策数据所需的权限,请让管理员为您授予项目、文件夹或组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

这些预定义角色包含将资源数据导出到 BigQuery 和查询自定义操作系统政策数据所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需将资源数据导出到 BigQuery 并查询自定义操作系统政策数据,您需要具备以下权限:

  • cloudasset.assets.exportOSInventories
  • cloudasset.assets.exportResource
  • bigquery.datasets.get
  • bigquery.tables.create
  • bigquery.tables.update
  • bigquery.tables.get
  • bigquery.jobs.create

您也可以使用自定义角色或其他预定义角色来获取这些权限。

操作系统政策示例

在 BigQuery 中导出和查询自定义数据之前,您必须创建并分配一个 OS 政策,用于从虚拟机收集自定义输出。如需了解详情,请参阅创建操作系统政策分配任务。

如需收集自定义数据,请定义一个包含以下部分的 exec 资源的操作系统政策:

  • validate:检查虚拟机是否与所选状态匹配。在以下示例政策中,validate 脚本以代码 101 退出,表示资源与所选状态不匹配。此退出代码会在每次评估时触发 enforce 脚本。
  • enforce:指定 outputFilePath 字段,运行自定义命令,将输出写入指定路径,并以代码 100 退出,以指示成功强制执行。

输出字符串的操作系统政策

以下示例操作系统政策会输出一个包含虚拟机实例内核版本的字符串:

id: return-kernel-version-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.txt
          script: uname -r > policy-output.txt && exit 100

输出 JSON 文件的操作系统政策

以下操作系统政策示例会输出一个包含操作系统名称和内核版本的 JSON 对象:

id: return-kernel-version-js-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version-js
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.json
          script: |-
            k=$(uname -r)
            o=$(uname -a)
            echo "{ \"name\": \""$o"\", \"kernel\": \""$k"\" }" > policy-output.json
            exit 100

将虚拟机管理器数据导出到 BigQuery

虚拟机管理器强制执行操作系统政策后,Cloud Asset Inventory 会收集整个组织中生成的操作系统清单和操作系统政策分配报告。使用 --per-asset-type 标志将此数据导出到 BigQuery 时,Cloud Asset Inventory 会为每种资产类型创建一个单独的表。生成的 <prefix>_osconfig_googleapis_com_OSPolicyAssignmentReport 表会存储您的自定义政策输出和强制执行错误消息。

如需将操作系统清单和资源数据导出到 BigQuery,请按以下步骤操作:

  1. 如需确定您的组织 ID,请运行以下命令:

    gcloud projects get-ancestors PROJECT_ID
    

    将 PROJECT_ID 替换为您的项目 ID。

  2. 如需导出虚拟机管理器从虚拟机实例收集的操作系统清单数据,请运行以下命令:

    gcloud asset export \
        --content-type=os-inventory \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/os"
    

    将以下占位符替换为您的值:

    • ORGANIZATION_ID:您的组织 ID。
    • BQ_PROJECT_ID:包含您的 BigQuery 数据集的项目的 ID。
    • DATASET_ID:BigQuery 数据集的 ID(例如 cai_exp)。
  3. 如需将资源元数据(包括操作系统政策分配报告)导出到 BigQuery,请运行以下命令:

    gcloud asset export \
        --content-type=resource \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"
    

    将以下占位符替换为您的值:

    • ORGANIZATION_ID:您的组织 ID。
    • BQ_PROJECT_ID:包含您的 BigQuery 数据集的项目的 ID。
    • DATASET_ID:BigQuery 数据集的 ID(例如 cai_exp)。

    导出完成后,Cloud Asset Inventory 会在您的 BigQuery 数据集中创建 res_osconfig_googleapis_com_OSPolicyAssignmentReport 表。如需了解详情,请参阅导出资产快照。

在 BigQuery 中查询自定义操作系统政策数据

将资产数据导出到 BigQuery 后,您可以查询 res_osconfig_googleapis_com_OSPolicyAssignmentReport 表,以查看操作系统政策的自定义输出和强制执行错误消息。

如需在 BigQuery 中运行查询,请按以下步骤操作:

  1. 在 Cloud de Confiance 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下任一 SQL 查询:

    • 查询文本输出:

      以下查询会返回操作系统政策为每个虚拟机实例收集的内核版本:

      SELECT
        resource.data.instance as instance,
        ANY_VALUE(
          SAFE_CONVERT_BYTES_TO_STRING(FROM_BASE64(REPLACE(REPLACE(
            resource_compliances.execResourceOutput.enforcementOutput
            , '-', '+'), '_', '/')))
          HAVING MAX updateTime) as compliance_results
      FROM
        `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
        UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
        UNNEST(resource_compliances.configSteps) as config_steps
      WHERE
        resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-policy"
        AND resource_compliances.osPolicyResourceId = "return-kernel-version"
        AND config_steps.type = "VALIDATION"
      GROUP BY
        instance
      

      将 DATASET_ID 替换为您的 BigQuery 数据集的 ID(例如 cai_exp)。

      查询输出类似于下表:

      instance compliance_results
      ubuntu-1 5.15.0-1036-gcp
      ubuntu-2 5.15.0-1044-gcp
      rhel9-1 5.14.0-162.18.1.el9_1.x86_64
    • 查询 JSON 输出:

      以下查询从 JSON 输出中提取 name 和 kernel 字段,并针对每个虚拟机实例以单独列的形式返回这些字段:

      WITH compliance_history AS (
        SELECT
          updateTime,
          resource.data.instance,
          SAFE_CONVERT_BYTES_TO_STRING(
            FROM_BASE64(
              REPLACE(
                REPLACE(
                  resource_compliances.execResourceOutput.enforcementOutput, '-', '+'
                ), '_', '/'
              )
            )
          ) as compliance_results
        FROM
          `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
          UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
          UNNEST(resource_compliances.configSteps) as config_steps
        WHERE
          resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-js-policy"
          AND resource_compliances.osPolicyResourceId = "return-kernel-version-js"
          AND config_steps.type = "VALIDATION"
      ),
      compliance_latest AS (
        SELECT
          instance,
          ANY_VALUE(compliance_results HAVING MAX updateTime) as compliance_results
        FROM compliance_history
        GROUP BY instance
      )
      SELECT
        instance,
        JSON_EXTRACT_SCALAR(compliance_results, "$.name") as os_name,
        JSON_EXTRACT_SCALAR(compliance_results, "$.kernel") as kernel_version
      FROM compliance_latest
      

      将 DATASET_ID 替换为您的 BigQuery 数据集的 ID(例如 cai_exp)。

      查询输出类似于下表:

      instance os_name kernel_version
      ubuntu-1 Linux ubuntu-1 5.15.0-1036-gcp #39-Ubuntu SMP 5.15.0-1036-gcp
      rhel9-1 Linux rhel9-1 5.14.0-162.18.1.el9_1.x86_64 #1 SMP 5.14.0-162.18.1.el9_1.x86_64
  3. 点击运行执行查询。

如需了解详情,请参阅运行查询。

查看违规处置错误消息

当操作系统政策资源未能通过验证或强制执行时,虚拟机管理器会在 res_osconfig_googleapis_com_OSPolicyAssignmentReport 表的 configSteps.errorMessage 字段中记录错误消息。您可以在 BigQuery 中查询此字段,以排查组织中的政策执行失败问题。

以下查询会针对每个虚拟机实例返回最新的验证或强制执行错误消息:

SELECT
  resource.data.instance AS instance,
  resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId AS policy_id,
  resource_compliances.osPolicyResourceId AS resource_id,
  config_steps.type AS step_type,
  ANY_VALUE(config_steps.errorMessage HAVING MAX updateTime) AS error_message
FROM
  `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
  UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) AS resource_compliances,
  UNNEST(resource_compliances.configSteps) AS config_steps
WHERE
  config_steps.errorMessage IS NOT NULL
  AND config_steps.errorMessage != ""
GROUP BY
  instance,
  policy_id,
  resource_id,
  step_type

将 DATASET_ID 替换为您的 BigQuery 数据集的 ID(例如 cai_exp)。

查询输出类似于下表:

instance policy_id resource_id step_type error_message
ubuntu-2 return-kernel-version-policy return-kernel-version DESIRED_STATE_ENFORCEMENT Error running enforce script: exit status 1

后续步骤

如需详细了解如何管理操作系统政策和分析合规性数据,请参阅以下资源: