G-genの杉村です。Google Cloud(旧称 GCP)のリソースインベントリサービスである Cloud Asset Inventory を解説します。
Cloud Asset Inventory とは
Cloud Asset Inventory とは、Google Cloud のリソースやポリシーの構成情報を取得、保存、検索するためのサービスです。
Cloud Asset Inventory は、Compute Engine VM、BigQuery テーブル、Cloud Storage バケットなどの Google Cloud リソースや、それらが持つ IAM ポリシーなどのアセット情報(設定の状態)を過去35日間分、保存します。これらのアセット情報に対して、クエリを投入して検索したり、設定に変更が行われた際のリアルタイム通知を設定することもできます。
Cloud Asset Inventory は、以下のようなユースケースに役立ちます。
- 意図しない設定変更が行われた際に、管理者に通知する
- 意図しない設定変更が発生した際に、切り戻しのために過去の状態を参照する
- 過去の設定変更のタイミングや変更内容を確認する
- ある特定の Google アカウントが、組織(プロジェクト)内のどのリソースに IAM 権限を持っているか確認する
- 設定が想定どおりの状態かどうか、定期的に棚卸しする
Cloud Asset Inventory は、何も設定しなくても Google Cloud 組織やプロジェクトでデフォルトで有効化されており、最新のアセット情報に加えて、過去35日間分の履歴が保存されます。
過去35日間分より以前のデータを保持したい場合、Cloud Storage や BigQuery テーブルにエクスポートすることも可能です。
料金
Cloud Asset Inventory は無料です。
エクスポートを実行した場合、書き込み先の Cloud Storage や BigQuery の料金が発生します。
用語
アセット
Cloud Asset Inventory におけるアセットとは、Google Cloud のリソース、ポリシー、またはランタイム情報のことです。
リソースとは Compute Engine VM、BigQuery テーブル、Cloud Storage バケットなどを指します。
ポリシーとは、IAM ポリシー、組織のポリシー、Access Context Manager(VPC Service Controls)のアクセスポリシーのことです。
ランタイム情報とは、OS Inventory Management(VM Manager が取得する Compute Engine VM 内部の OS やパッケージ情報)のことです。
これら3つを総称しアセットと呼びます。Cloud Asset Inventory は、これらアセットの状態を取得し、保存します。ただし、一部の Google Cloud サービスの中には Cloud Asset Inventory で対応されていないものもあります。どのタイプのリソースやポリシーがサポートされているかは、以下のドキュメントをご参照ください。
- 参考 : サポートされているアセットタイプ
アセットのスナップショット情報(ある時点での設定の状態)は、履歴として35日間保存されます。この期間内であれば、リソースやポリシーの設定が変更された前後での状態の比較が可能です。
アセットタイプ
Web コンソールや gcloud コマンド、REST API 等を使ってアセットをクエリする際、フィルタのためにアセットタイプを指定します。
アセットタイプには、以下のようなものがあります。クエリ時には、括弧の中の文字列を使用します。
- 組織(
cloudresourcemanager.googleapis.com/Organization
) - フォルダ(
cloudresourcemanager.googleapis.com/Folder
) - プロジェクト(
cloudresourcemanager.googleapis.com/Project
) - BigQuery データセット(
bigquery.googleapis.com/Dataset
) - BigQuery テーブル(
bigquery.googleapis.com/Table
) - Compute Engine VM(
compute.googleapis.com/Instance
) - Cloud Storage バケット(
storage.googleapis.com/Bucket
)
アセット関係
アセット関係(Asset relationships)は、関係性のあるアセット同士のリレーション情報です。
例えば、Compute Engine のインスタンスグループは、VM リソースとリレーションを持っています。アセット関係をクエリすることで、こういったリソース同士のリレーション情報も確認できます。
ただし、アセット関係を利用するには Security Command Center のプレミアムティアにサブスクライブする必要があります。Security Command Center については以下の記事をご参照ください。
フィード
フィードは、リソースやポリシーの設定変更を検知するために作成する、通知設定です。
対象のアセット名、もしくはアセットタイプを指定すると、そのアセットに変更が発生した際に通知が可能です。
エクスポート
アセット情報は35日間分しか保持されないため、それ以上にアセット情報を保存しておきたい場合は、Cloud Storage バケットまたは BigQuery テーブルにアセットをエクスポートします。
2024年10月現在、エクスポートの設定は gcloud コマンドまたは REST API を使用して行います。Web コンソールから設定することはできません。
Cloud Storage へのエクスポートの場合、ファイルフォーマットは JSONL(改行区切り JSON)になります。
エクスポートはワンショットで行われるため、継続的にアセット情報をエクスポートするには、Cloud Run functions 等で定期的にエクスポート API を実行する必要があります。
- 参考 : BigQuery へのエクスポート
- 参考 : Cloud Storage へのエクスポート
代表的なユースケース
アセット履歴の確認
最も一般的なユースケースは、ある時点と別の時点でのリソース(ポリシー)の設定状況の比較です。
たとえば、管理者が把握しないうちに Compute Engine VM の設定が変更されていたことに気がついたとします。Cloud Asset Inventory の Web コンソール画面で、以下のように、ある時点とある時点の設定状態の差分を確認することができます。
この画面では、VM のサービスアカウント設定やマシンタイプなどリソースの設定状態に加えて、各リソースの IAM ポリシーへの変更も確認することができます。
アセット履歴は、Google Cloud の Web コンソールのほか、gcloud コマンドラインや REST API で取得することができます。
プリンシパルの検索
アセットに対してクエリを行うことで、あるプリンシパル(Google アカウントやグループ)が組織やプロジェクトでどのリソースに対して IAM 権限を持っているかを一覧表示することができます。
例えば、ID が 1234567890
の組織内で、john@example.com
アカウントがオーナー権限を持っている IAM ポリシーを一覧化するには、以下のコマンドを実行します。
gcloud asset search-all-iam-policies \ --scope=organizations/1234567890 \ --query="policy:(roles/owner john@example.com)" \ --format=json
- 参考 : IAM 許可ポリシーの検索
- 参考 : IAM 許可ポリシーの検索のサンプル
有効な IAM 権限を表示
あるリソースに対して有効な IAM 権限を調べようとしたとき、単純にそのリソースの IAM ポリシーを確認(describe)しても、そのリソースに直接的に書き込まれている IAM ポリシーが見えるだけであり、親リソース(組織やプロジェクトなど)から継承した IAM 権限は表示されません。
Cloud Assets Inventory には、継承された権限を含めて、有効(effective)な IAM 権限を一覧表示することができます。
gcloud asset get-effective-iam-policy \ --scope=organizations/1234567890 \ --names=//bigquery.googleapis.com/projects/my-project/datasets/my_dataset/tables/my_table \ --format=json
出力は以下のようになります。
{ "policyResults": [ { "fullResourceName": "//bigquery.googleapis.com/projects/my-project/datasets/my_dataset", "policies": [ { "attachedResource": "//bigquery.googleapis.com/projects/my-project/datasets/my_dataset", "policy": { "bindings": [ { "members": [ "projectEditor:my-project" ], "role": "roles/bigquery.dataEditor" }, { "members": [ "projectOwner:my-project", "user:john@example.com" ], "role": "roles/bigquery.dataOwner" }, { "members": [ "projectViewer:my-project" ], "role": "roles/bigquery.dataViewer" } ] } }, { "attachedResource": "//cloudresourcemanager.googleapis.com/projects/my-project", "policy": { "bindings": [ { "members": [ "serviceAccount:firebase-measurement@system.gserviceaccount.com", "serviceAccount:p1234567890-123123@gcp-sa-logging.iam.gserviceaccount.com", "serviceAccount:search-console-data-export@system.gserviceaccount.com", "serviceAccount:service-1234567890@gcp-sa-dataform.iam.gserviceaccount.com" ], "role": "roles/bigquery.dataEditor" }, ] } }, { "attachedResource": "//cloudresourcemanager.googleapis.com/folders/098765432109", "policy": { "bindings": [ .... (略) }
アセット変更の通知
アセット名もしくはアセットタイプ( compute.googleapis.com/Network
など)を指定してフィードを作成し、リソースやポリシーに設定変更が行われたときにニアリアルタイムで通知を受け取ることができます。
例として、頻繁に変更されないはずのプロジェクトの IAM ポリシーに対する変更を監視する、などのユースケースが考えられます。
- 参考 : アセットの変更のモニタリング
通知は Pub/Sub に対して行われます。Pub/Sub へ投入されたメッセージは、Cloud Run functions などを通して取得し、Slack や E メール通知、その他の後続アクションにつなげることが可能です。
また通知先として Pub/Sub を指定しない場合、通知は Cloud Logging に対して記録されます。Cloud Logging へメッセージを記録すれば、プログラムを作成しなくてもログベースのアラート機能により簡単に E メールや Slack への通知が実装できます。
また、CEL(Common Expression Language)フォーマットで条件を記述し、詳細に通知条件をカスタマイズすることもできます。
Asset Insight
Asset Insight は、Cloud Asset Inventory が収集したアセット情報を Google Cloud の Recommender API が分析し、潜在的なリスクを検出するためのツールです。
2024年10月現在、gcloud コマンドラインや REST API 経由でのみ利用可能であり、Web コンソール画面は用意されていません。
Asset Insight ではサブタイプという検査種別を指定して分析を実行します。それぞれのサブタイプでは、以下のようなリスクを検知できます。
サブタイプ名 | 検知内容 |
---|---|
EXTERNAL_MEMBER | 別組織のアカウントまたはグループを含む IAM ポリシーを検出 |
EXTERNAL_POLICY_EDITOR | IAM ポリシーを変更する権限が付与された別組織のアカウントまたはグループを含む IAM ポリシーを検出 |
EXTERNAL_CLOUD_STORAGE_OBJECT_VIEWER | Cloud Storage のオブジェクト取得または一覧表示権限が付与された、別組織のアカウントまたはグループを含む IAM ポリシーを検出 |
EXTERNAL_SERVICE_ACCOUNT_IMPERSONATOR | サービスアカウントの権限を借用(impersonate)する権限が付与されている、別組織のアカウントまたはグループを含む IAM ポリシーを検出 |
TERMINATED_MEMBER | 無効化や削除されたアカウントまたはグループを含む IAM ポリシーを検出 |
PUBLIC_IAM_POLICY | 任意の認証済みアカウント( allUsers )、つまりログイン済みのすべての Google アカウントに対する許可を含む IAM ポリシーを検出 |
OWNER_TERMINATED_PROJECT | プロジェクトの IAM ポリシーにアクティブなアカウントまたはグループが含まれないプロジェクトを検出 |
以下は、あるプロジェクトに、組織外のメンバーが IAM 権限を持っていないかどうかを調べるコマンドラインです。
gcloud recommender insights list \ --project=my-test-project \ --location=global \ --insight-type=google.cloudasset.asset.Insight \ --filter="insightSubtype:EXTERNAL_MEMBER" \ --format="json"
出力は、以下のようになります。
[ { "category": "SECURITY", "content": { "domain": "example.co.jp", "matchedPolicies": [ { "matchedBindings": [ { "matchedMembers": [ "user:external-user@example.co.jp" ], "role": "roles/bigquery.dataViewer" } ], "project": "projects/1234567890", "resource": "//bigquery.googleapis.com/projects/my-test-project/datasets/my_dataset/tables/my_table" } ], "policyCount": 1, "policySearchQuery": "policy: example.co.jp" }, "description": "Domain example.co.jp detected in 1 IAM policies", "etag": "\"12345678abcdefgh\"", "insightSubtype": "EXTERNAL_MEMBER", "lastRefreshTime": "2024-09-16T08:13:25Z", "name": "projects/1234567890/locations/global/insightTypes/google.cloudasset.asset.Insight/insights/1234abcd-1234-12ab-12ab-123456sbcdef", "observationPeriod": "0s", "severity": "LOW", "stateInfo": { "state": "ACTIVE" }, "targetResources": [ "//cloudresourcemanager.googleapis.com/projects/1234567890" ] } ]
- 参考 : Asset Insights の使用
杉村 勇馬 (記事一覧)
執行役員 CTO / クラウドソリューション部 部長
元警察官という経歴を持つ現 IT エンジニア。クラウド管理・運用やネットワークに知見。AWS 12資格、Google Cloud認定資格11資格。X (旧 Twitter) では Google Cloud や AWS のアップデート情報をつぶやいています。
Follow @y_sugi_it