Cloud Asset Inventoryで組織配下のサービスアカウントキーの一覧を取得してみる

Cloud Asset Inventoryで組織配下のサービスアカウントキーの一覧を取得してみる

2026.03.05

セキュリティ強化の一環で、組織配下のサービスアカウントキーを棚卸しする必要がありました。

Cloud Asset Inventoryを使うと、gcloudコマンド1つで組織全体のサービスアカウントキーの一覧を取得できたので紹介します。

Cloud Asset Inventoryとは

Cloud Asset Inventoryは、Google Cloudのリソースを組織・フォルダ・プロジェクト横断で検索・一覧表示できるサービスです。

BigQueryにエクスポートして分析する方法もありますが、gcloud CLIを使って直接検索することもできます。

https://cloud.google.com/asset-inventory/docs/overview

前提条件

  • gcloud CLIがインストール・認証済みであること
  • Cloud Asset Inventory APIが有効化されていること
  • 必要な権限が付与されていること

APIの有効化

Cloud Asset Inventory APIを有効化します。

gcloud services enable cloudasset.googleapis.com

必要な権限

gcloud asset search-all-resourcesを実行するには、cloudasset.assets.searchAllResources権限が必要です。

以下のいずれかのロールに含まれています。

  • roles/cloudasset.viewer(クラウド アセット閲覧者)
  • roles/cloudasset.owner(クラウド アセット オーナー)

組織全体を検索する場合は、組織レベルでロールを付与する必要があります。

組織ID・フォルダID・プロジェクトIDの確認

組織IDは以下のコマンドで確認できます。

gcloud organizations list
出力例
DISPLAY_NAME: <your-org-name>
ID: <your-org-id>
DIRECTORY_CUSTOMER_ID: <your-org-customer-id>

フォルダIDは以下で確認できます。

gcloud resource-manager folders list --organization=<your-org-id>

プロジェクトIDは以下で確認できます。

gcloud projects list

以降のコマンドで使用するため、環境変数にセットしておきます。

export ORGANIZATION_ID=<your-org-id>
export FOLDER_ID=<your-folder-id>
export PROJECT_A_ID=<your-project-a-id>
export PROJECT_B_ID=<your-project-b-id>

サービスアカウントキーの一覧を取得する

gcloud asset search-all-resourcesコマンドで、組織内のサービスアカウントキーを検索します。

gcloud asset search-all-resources \
  --scope="organizations/$ORGANIZATION_ID" \
  --asset-types="iam.googleapis.com/ServiceAccountKey"
出力例
---
assetType: iam.googleapis.com/ServiceAccountKey
displayName: ServiceAccountKey
location: global
name: //iam.googleapis.com/projects/<your-project-id>/serviceAccounts/<service-account-email>/keys/<key-id>
project: projects/<your-project-number>
state: ACTIVE
---
assetType: iam.googleapis.com/ServiceAccountKey
displayName: ServiceAccountKey
location: global
name: //iam.googleapis.com/projects/<your-project-id>/serviceAccounts/<service-account-email>/keys/<key-id>
project: projects/<your-project-number>
state: ACTIVE

nameフィールドから、どのプロジェクトのどのサービスアカウントに紐付くキーかが確認できます。

スコープを変更する

--scopeを変更することで、検索範囲を絞ることもできます。

# プロジェクト単位
gcloud asset search-all-resources \
  --scope="projects/$PROJECT_ID" \
  --asset-types="iam.googleapis.com/ServiceAccountKey"

# フォルダ単位
gcloud asset search-all-resources \
  --scope="folders/$FOLDER_ID" \
  --asset-types="iam.googleapis.com/ServiceAccountKey"

作成日時でフィルタする

--queryオプションを使うと、特定の日時より前に作成されたキーに絞り込むことができます。

例えば、2025年1月1日より前に作成されたキーを検索する場合は以下のようになります。

gcloud asset search-all-resources \
  --scope="organizations/$ORGANIZATION_ID" \
  --asset-types="iam.googleapis.com/ServiceAccountKey" \
  --query="createTime < 2025-01-01" \
  --order-by="createTime"

長期間ローテーションされていないキーの特定に役立ちます。

https://cloud.google.com/iam/docs/key-rotation?hl=ja

補足: BigQueryにエクスポートする方法との比較

Cloud Asset InventoryにはBigQueryにエクスポートして分析する方法もあります。

https://dev.classmethod.jp/articles/google-cloud-visibility-with-cloud-asset-inventory/

それぞれの使い分けの目安は以下の通りです。

観点 CLI(今回の方法) BigQueryエクスポート
手軽さ コマンド1つで取得可能 エクスポート設定が必要
クエリの柔軟性 フィルタは限定的 SQLで自由に分析可能
大規模データ 件数が多いとページングが必要 大量データでも高速に集計可能
定期分析 スナップショット的 定期エクスポートで変更履歴を蓄積可能
他データとの結合 難しい 課金データ等とJOIN可能

定期的な監査やレポート化が必要な場合は、BigQueryへのエクスポートを検討してみてください。

やってみる: サービスアカウントキーを取得してみる

フォルダ内の2プロジェクトにサービスアカウントキーを作成して、フォルダ単位のスコープで検索してみます。

サービスアカウントの作成

Project AとBに検証用のサービスアカウントを作成します。

gcloud iam service-accounts create sa-key-test \
  --display-name="SA Key Test A" \
  --project=$PROJECT_A_ID
gcloud iam service-accounts create sa-key-test \
  --display-name="SA Key Test B" \
  --project=$PROJECT_B_ID

サービスアカウントキーの作成

作成したサービスアカウントにキーを発行します。

gcloud iam service-accounts keys create ~/sa-key-test-a.json \
  --iam-account=sa-key-test@$PROJECT_A_ID.iam.gserviceaccount.com
gcloud iam service-accounts keys create ~/sa-key-test-b.json \
  --iam-account=sa-key-test@$PROJECT_B_ID.iam.gserviceaccount.com
出力例
created key [<key-id>] of type [json] as [/Users/<user>/sa-key-test.json] for [sa-key-test@<your-project-id>.iam.gserviceaccount.com]

Cloud Asset Inventoryで検索

フォルダ単位のスコープでサービスアカウントキーを検索します。

gcloud asset search-all-resources \
  --asset-types="iam.googleapis.com/ServiceAccountKey" \
  --format="table(name.segment(4):label=PROJECT, name.segment(6):label=SERVICE_ACCOUNT, name.segment(8):label=KEY_ID, createTime)"
出力例
PROJECT: project-a
SERVICE_ACCOUNT: <sa>
KEY_ID: <key-id>
CREATE_TIME: 2026-03-05T08:38:07Z

PROJECT: project-b
SERVICE_ACCOUNT: <sa>
KEY_ID: <key-id>
CREATE_TIME: 2026-03-05T08:37:59Z

先ほど作成したサービスアカウントキーが取得できました。

nameフィールドを見ると、projects/<プロジェクトID>/serviceAccounts/<サービスアカウント>/keys/<キーID>の形式になっており、どのプロジェクトのどのサービスアカウントのキーかを確認できます。

なお、Cloud Asset Inventoryの検索結果は結果整合性のため、リソースの作成・削除直後は反映されていないことがあります。ほとんどの場合は数分以内に反映されます。

Cloud Asset Inventory provides eventual consistency on current data and best-effort consistency on historical data. While rare, it's possible that Cloud Asset Inventory can miss some data updates.
Unless noted in the following table, almost all asset updates are available in minutes.

https://cloud.google.com/asset-inventory/docs/asset-types

クリーンアップ

検証用に作成したキーとサービスアカウントを削除します。

# ローカルのキーファイルを削除
rm ~/sa-key-test.json

# サービスアカウントを削除(紐付くキーも削除される)
gcloud iam service-accounts delete \
  sa-key-test@$PROJECT_A_ID.iam.gserviceaccount.com \
  --project=$PROJECT_A_ID
gcloud iam service-accounts delete \
    sa-key-test@$PROJECT_B_ID.iam.gserviceaccount.com \
    --project=$PROJECT_B_ID

おわりに

Cloud Asset Inventoryを使って、組織配下のサービスアカウントキーの一覧を取得してみました。

gcloudコマンド1つで組織全体を横断的に検索できるため、手軽にキーの棚卸しができます。

棚卸しの結果を基に、不要なキーの削除やローテーションにつなげていただければと思います。

https://docs.cloud.google.com/asset-inventory/docs/searching-resources

この記事をシェアする

FacebookHatena blogX

関連記事