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

本文說明如何使用 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 政策指派作業,輸出自訂資料。
  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上範例的預計用途分頁:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  • 設定預設區域和可用區。

必要的角色

如要取得將資源資料匯出至 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. 前往 Google Cloud 控制台的「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 政策及分析合規資料,請參閱下列資源: