查看貴機構 OS 政策的自訂資料

本文說明如何使用 VM 管理工具、Cloud Asset Inventory 和 BigQuery,查看整個機構中 OS 政策的自訂資料和強制執行錯誤訊息。如果需要針對標準法規遵循狀態未擷取的自訂 VM 設定、指令碼輸出內容或政策執行失敗情形,產生全機構報表,請使用這個工作流程。

如要收集自訂資料,請在 OS 政策中設定 outputFilePath ,這是 VM 上的本機路徑,政策指令碼會將自訂文字或 JSON 輸出內容寫入這個路徑。VM 管理員會讀取這個路徑的輸出內容,並儲存在 OS 政策指派作業報表中。接著,您可以使用 Cloud Asset Inventory 查詢 VM 叢集中的結果,然後將這些報告匯出至 BigQuery。

事前準備

必要的角色

如要取得將資源資料匯出至 BigQuery,以及查詢自訂 OS 政策資料所需的權限,請要求管理員在專案、資料夾或機構中,授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備將資源資料匯出至 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,請按照下列步驟操作:

  1. 如要找出組織 ID,請執行下列指令:

    gcloud projects get-ancestors PROJECT_ID
    

    將 PROJECT_ID 替換為專案 ID。

  2. 如要匯出 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)。
  3. 如要將資源中繼資料 (包括 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 中執行查詢,請按照下列步驟操作:

  1. 前往 Cloud de Confiance 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在查詢編輯器中,貼上下列其中一個 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)。

      查詢輸出內容類似下表:

      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 欄位,並以每個 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)。

      查詢輸出內容類似下表:

      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. 點按「執行」,以執行查詢。

詳情請參閱「執行查詢」。

查看強制執行錯誤訊息

如果 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 政策及分析合規資料,請參閱下列資源: