本文档介绍了如何使用虚拟机管理器、Cloud Asset Inventory 和 BigQuery 查看组织中操作系统政策的自定义数据和强制执行错误消息。如果您需要组织范围内的报告,其中包含标准合规性状态未捕获的自定义虚拟机配置、脚本输出或政策执行失败情况,请使用此工作流。
如需收集自定义数据,请在操作系统政策中配置 outputFilePath,这是虚拟机上政策脚本写入自定义文本或 JSON 输出的本地路径。虚拟机管理器会读取此路径中的输出,并将其存储在操作系统政策分配报告中。然后,您可以使用 Cloud Asset Inventory 查询整个虚拟机群的结果,将这些报告导出到 BigQuery。
准备工作
- 设置虚拟机管理器。
- 启用 Cloud Asset Inventory API。
- 创建一个 BigQuery 数据集来存储导出的数据。
- 创建输出自定义数据的操作系统政策分配任务。
-
如果您尚未设置身份验证,请进行设置。身份验证用于验证您的身份,以便访问 Cloud de Confiance by S3NS 服务和 API。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
选择标签页以了解您打算如何使用本页面上的示例:
控制台
当您使用 Cloud de Confiance 控制台访问 Cloud de Confiance by S3NS 服务和 API 时,无需设置身份验证。
gcloud
-
安装 Google Cloud CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:
gcloud init
-
- 设置默认区域和可用区。
所需的角色
如需获得将资源数据导出到 BigQuery 并查询自定义操作系统政策数据所需的权限,请让管理员为您授予项目、文件夹或组织的以下 IAM 角色:
- Cloud Asset Viewer (
roles/cloudasset.viewer) - BigQuery Data Editor (
roles/bigquery.dataEditor) - BigQuery Job User (
roles/bigquery.jobUser)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含将资源数据导出到 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,请按以下步骤操作:
如需确定您的组织 ID,请运行以下命令:
gcloud projects get-ancestors PROJECT_ID将
PROJECT_ID替换为您的项目 ID。如需导出虚拟机管理器从虚拟机实例收集的操作系统清单数据,请运行以下命令:
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)。
如需将资源元数据(包括操作系统政策分配报告)导出到 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 中运行查询,请按以下步骤操作:
在 Cloud de Confiance 控制台中,前往 BigQuery 页面。
在查询编辑器中,粘贴以下任一 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)。查询输出类似于下表:
instancecompliance_resultsubuntu-15.15.0-1036-gcpubuntu-25.15.0-1044-gcprhel9-15.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)。查询输出类似于下表:
instanceos_namekernel_versionubuntu-1Linux ubuntu-1 5.15.0-1036-gcp #39-Ubuntu SMP5.15.0-1036-gcprhel9-1Linux rhel9-1 5.14.0-162.18.1.el9_1.x86_64 #1 SMP5.14.0-162.18.1.el9_1.x86_64
点击运行执行查询。
如需了解详情,请参阅运行查询。
查看违规处置错误消息
当操作系统政策资源未能通过验证或强制执行时,虚拟机管理器会在 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 |
后续步骤
如需详细了解如何管理操作系统政策和分析合规性数据,请参阅以下资源: