本文說明如何使用 VM 管理工具、Cloud Asset Inventory 和 BigQuery,查看整個機構中 OS 政策的自訂資料和強制執行錯誤訊息。如果需要針對標準法規遵循狀態未擷取的自訂 VM 設定、指令碼輸出內容或政策執行失敗情形,產生全機構報表,請使用這個工作流程。
如要收集自訂資料,請在 OS 政策中設定
outputFilePath
,這是 VM 上的本機路徑,政策指令碼會將自訂文字或 JSON 輸出內容寫入這個路徑。VM 管理員會讀取這個路徑的輸出內容,並儲存在 OS 政策指派作業報表中。接著,您可以使用 Cloud Asset Inventory 查詢 VM 叢集中的結果,然後將這些報告匯出至 BigQuery。
事前準備
- 設定 VM 管理員。
- 啟用 Cloud Asset Inventory API。
- 建立 BigQuery 資料集來儲存匯出的資料。
- 建立 OS 政策指派作業,輸出自訂資料。
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 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,以及查詢自訂 OS 政策資料所需的權限,請要求管理員在專案、資料夾或機構中,授予您下列 IAM 角色:
- Cloud Asset Viewer (
roles/cloudasset.viewer) - BigQuery 資料編輯者 (
roles/bigquery.dataEditor) - BigQuery 工作使用者 (
roles/bigquery.jobUser)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備將資源資料匯出至 BigQuery,以及查詢自訂 OS 政策資料所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:
所需權限
如要將資源資料匯出至 BigQuery,以及查詢自訂 OS 原則資料,您必須具備下列權限:
-
cloudasset.assets.exportOSInventories -
cloudasset.assets.exportResource -
bigquery.datasets.get -
bigquery.tables.create -
bigquery.tables.update -
bigquery.tables.get -
bigquery.jobs.create
OS 政策範例
如要在 BigQuery 中匯出及查詢自訂資料,您必須先建立及指派 OS 原則,從 VM 收集自訂輸出內容。詳情請參閱「建立 OS 政策指派作業」。
如要收集自訂資料,請使用 exec 資源定義 OS 政策,其中包含下列區段:
validate:檢查 VM 是否符合所選狀態。在下列範例政策中,validate指令碼會以程式碼101結束,表示資源與所選狀態不符。這個結束代碼會在每次評估時觸發enforce指令碼。enforce:指定outputFilePath欄位、執行自訂指令、將輸出內容寫入指定路徑,並以程式碼100結束,表示強制執行成功。
輸出字串的 OS 政策
下列範例 OS 政策會輸出含有 VM 執行個體核心版本的字串:
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 檔案的 OS 政策
下列範例 OS 政策會輸出 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
將 VM 管理員資料匯出至 BigQuery
VM 管理員強制執行 OS 政策後,Cloud Asset Inventory 會收集整個機構的 OS 庫存和 OS 政策指派作業報表。使用 --per-asset-type 旗標將這項資料匯出至 BigQuery 時,Cloud Asset Inventory 會為每個資產類型建立個別資料表。產生的<prefix>_osconfig_googleapis_com_OSPolicyAssignmentReport
表格會儲存自訂政策輸出內容和違規錯誤訊息。
如要將 OS 項目清單和資源資料匯出至 BigQuery,請按照下列步驟操作:
如要找出組織 ID,請執行下列指令:
gcloud projects get-ancestors PROJECT_ID將
PROJECT_ID替換為專案 ID。如要匯出 VM 管理員 從 VM 執行個體收集的 OS 清單資料,請執行下列指令:
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)。
如要將資源中繼資料 (包括 OS 政策指派報表) 匯出至 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 中查詢自訂 OS 政策資料
將資產資料匯出至 BigQuery 後,您可以查詢 res_osconfig_googleapis_com_OSPolicyAssignmentReport 資料表,查看 OS 政策的自訂輸出內容和強制執行錯誤訊息。
如要在 BigQuery 中執行查詢,請按照下列步驟操作:
前往 Cloud de Confiance 控制台的「BigQuery」頁面。
在查詢編輯器中,貼上下列其中一個 SQL 查詢:
查詢文字輸出:
下列查詢會傳回 OS 政策為每個 VM 執行個體收集的核心版本:
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欄位,並以每個 VM 執行個體的個別欄位傳回這些欄位: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
點按「執行」,以執行查詢。
詳情請參閱「執行查詢」。
查看強制執行錯誤訊息
如果 OS 政策資源驗證或強制執行失敗,VM 管理員會在 res_osconfig_googleapis_com_OSPolicyAssignmentReport 表格的 configSteps.errorMessage 欄位中記錄錯誤訊息。您可以在 BigQuery 中查詢這個欄位,排解整個機構的政策執行失敗問題。
下列查詢會傳回每個 VM 執行個體的最新驗證或強制執行錯誤訊息:
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 |
後續步驟
如要進一步瞭解如何管理 OS 政策及分析合規資料,請參閱下列資源: