組織の OS ポリシーのカスタムデータを表示する

このドキュメントでは、VM Manager、Cloud Asset Inventory、BigQuery を使用して、組織全体の OS ポリシーからカスタムデータと適用エラー メッセージを表示する方法について説明します。このワークフローは、標準のコンプライアンス状態では取得できないカスタム VM 構成、スクリプト出力、ポリシー実行エラーに関する組織全体のレポートが必要な場合に使用します。

カスタムデータを収集するには、OS ポリシーで outputFilePath を構成します。これは、ポリシー スクリプトがカスタムテキストまたは JSON 出力を書き込む VM のローカルパスです。VM Manager はこのパスから出力を読み取り、OS ポリシーの割り当てレポートに保存します。これらのレポートを BigQuery にエクスポートするには、Cloud Asset Inventory を使用して VM フリート全体の結果をクエリします。

始める前に

  • VM Manager を設定する。
  • Cloud Asset Inventory API を有効にします。
  • エクスポートされたデータを保存する BigQuery データセットを作成します。
  • カスタム データを出力する OS ポリシーの割り当てを作成します。
  • まだ設定していない場合は、認証を設定します。認証では、 Cloud de Confiance by S3NS サービスと API にアクセスするための ID が確認されます。ローカル開発環境からコードまたはサンプルを実行するには、次のいずれかのオプションを選択して Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Cloud de Confiance コンソールを使用して Cloud de Confiance by S3NS サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Google Cloud CLI をインストールし、 フェデレーション ID を使用して gcloud CLI にログインします。ログイン後、次のコマンドを実行して Google Cloud CLI を初期化します。

      gcloud init
  • デフォルトのリージョンとゾーンを設定します。

必要なロール

リソースデータを BigQuery にエクスポートし、カスタム OS ポリシーデータをクエリするために必要な権限を取得するには、プロジェクト、フォルダ、または組織に対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、リソースデータを BigQuery にエクスポートし、カスタム OS ポリシーデータをクエリするために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

リソースデータを 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 でカスタムデータをエクスポートしてクエリを実行する前に、VM からカスタム出力を収集する OS ポリシーを作成して割り当てる必要があります。詳細については、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 Manager データを BigQuery にエクスポートする

VM Manager が 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 Manager が 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 Manager は 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 ポリシーの管理とコンプライアンス データの分析の詳細については、次のリソースをご覧ください。