このドキュメントでは、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
-
Google Cloud CLI をインストールし、 フェデレーション ID を使用して gcloud CLI にログインします。ログイン後、次のコマンドを実行して Google Cloud CLI を初期化します。
gcloud init
-
- デフォルトのリージョンとゾーンを設定します。
必要なロール
リソースデータを BigQuery にエクスポートし、カスタム OS ポリシーデータをクエリするために必要な権限を取得するには、プロジェクト、フォルダ、または組織に対する次の IAM ロールを付与するよう管理者に依頼してください。
- Cloud Asset 閲覧者(
roles/cloudasset.viewer) - BigQuery データ編集者 (
roles/bigquery.dataEditor) - BigQuery ジョブユーザー (
roles/bigquery.jobUser)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、リソースデータを 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 にエクスポートする手順は次のとおりです。
組織 ID を確認するには、次のコマンドを実行します。
gcloud projects get-ancestors PROJECT_IDPROJECT_IDは、実際のプロジェクト ID に置き換えます。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)。
リソース メタデータ(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 instanceDATASET_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_64JSON 出力をクエリする:
次のクエリは、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_latestDATASET_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 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 ポリシーの管理とコンプライアンス データの分析の詳細については、次のリソースをご覧ください。