Asset Insights の使用

このトピックでは、Asset Insights を使用してアセット構成内の潜在的なリスクを検出し、セキュリティ体制を強化する方法について説明します。

概要

Cloud Asset Insights は、組織のリソースに関連付けられた IAM ポリシーに基づいて分析情報を生成します。これは Recommender サービスの一部であり、google.cloudasset.asset.Insight 分析情報タイプとして生成されます。分析情報とは、適切なアクションを決定するために詳細な分析を必要とする特定の異常状態を指します。それらの情報は、Cloud Asset Inventory に保存されているデータのスナップショットに基づいて毎日生成されます。

始める前に

Asset Insights を使用するには、まず次の手順を行う必要があります。

  1. Recommender API を有効にします

  2. アカウントに次の権限が付与されていることを確認します。

    • recommender.cloudAssetInsights.get
    • recommender.cloudAssetInsights.list
    • recommender.cloudAssetInsights.update

    これらの権限は、個別に付与することも、次のいずれかのロールを付与することもできます。

    • Cloud Asset Insights 閲覧者(roles/recommender.cloudAssetInsightsViewer)のロール
    • Cloud Asset Insights 管理者(roles/recommender.cloudAssetInsightsAdmin)のロール

アセット分析情報のリクエスト

アセット分析情報をリクエストする最も簡単な方法は、次の手順で分析情報を一覧表示することです。他のタイプの分析情報の操作については、Recommender API の分析情報ガイドをご覧ください。

プロジェクト分析情報のリクエスト

プロジェクトの分析情報をリクエストするには、次の手順を行います。

gcloud

次の gcloud ツールコマンドを実行します。

gcloud recommender insights list \
  --project=PROJECT \
  --billing-project=BILLING_PROJECT \
  --location=global \
  --insight-type=google.cloudasset.asset.Insight \
  --filter="insightSubtype:SUBTYPE" \
  --format=FORMAT

ここで

  • BILLING_PROJECT は、Recommender API を有効にしたプロジェクトです。gcloud ツール構成でプロジェクトを billing/quota_project として設定する場合、このパラメータは必要ありません。
  • --filter は省略可能ですが、分析情報のサブタイプで結果をフィルタするために使用できます。
  • FORMAT は、gcloud ツールでサポートされている出力形式です。たとえば、分析情報の内容をフラット テーブルとして表示するには、次のようにします。
gcloud recommender insights list \
    --project=PROJECT \
    --location=global \
    --insight-type=google.cloudasset.asset.Insight \
    --flatten="content.matchedPolicies[].matchedBindings[].matchedMembers[]" \
    --format="table(insightSubtype, name,
    content.matchedPolicies.matchedBindings.matchedMembers,
    content.matchedPolicies.matchedBindings.role,
    content.matchedPolicies.resource)"

API

次の curl コマンドを実行します。

curl \
  -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
  -H "x-goog-user-project: WHITELISTED_PROJECT" \
  "https://recommender.googleapis.com/v1/projects/PROJECT/locations/global/insightTypes/google.cloudasset.asset.Insight/insights"

フォルダ分析情報のリクエスト

フォルダの分析情報をリクエストするには、次の手順を行います。

gcloud

次の gcloud ツールコマンドを実行します。

gcloud recommender insights list \
  --folder=FOLDER_NUMBER \
  --billing-project=BILLING_PROJECT \
  --location=global \
  --insight-type=google.cloudasset.asset.Insight \
  --filter="insightSubtype:SUBTYPE" \
  --format=FORMAT

ここで

  • BILLING_PROJECT は、Recommender API を有効にしたプロジェクトです。gcloud ツール構成でプロジェクトを billing/quota_project として設定する場合、このパラメータは必要ありません。
  • --filter は省略可能ですが、分析情報のサブタイプで結果をフィルタするために使用できます。
  • FORMAT は、gcloud ツールでサポートされている出力形式です。たとえば、分析情報の内容をフラット テーブルとして表示するには、次のようにします。
gcloud recommender insights list \
    --folder=FOLDER_NUMBER \
    --location=global \
    --insight-type=google.cloudasset.asset.Insight \
    --flatten="content.matchedPolicies[].matchedBindings[].matchedMembers[]" \
    --format="table(insightSubtype, name,
    content.matchedPolicies.matchedBindings.matchedMembers,
    content.matchedPolicies.matchedBindings.role,
    content.matchedPolicies.resource)"

API

次の curl コマンドを実行します。

curl \
  -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
  -H "x-goog-user-project: PROJECT" \
  "https://recommender.googleapis.com/v1/folders/FOLDER_NUMBER/locations/global/insightTypes/google.cloudasset.asset.Insight/insights"

組織の分析情報のリクエスト

組織の分析情報をリクエストするには、次の手順を行います。

gcloud

次の gcloud ツールコマンドを実行します。

gcloud recommender insights list \
  --organization=ORGANIZATION \
  --billing-project=BILLING_PROJECT \
  --location=global \
  --insight-type=google.cloudasset.asset.Insight \
  --filter="insightSubtype:SUBTYPE" \
  --format=FORMAT

ここで

  • BILLING_PROJECT は、Recommender API を有効にしたプロジェクトです。gcloud ツール構成でプロジェクトを billing/quota_project として設定する場合、このパラメータは必要ありません。
  • --filter は省略可能ですが、分析情報のサブタイプで結果をフィルタするために使用できます。
  • FORMAT は、gcloud ツールでサポートされている出力形式です。たとえば、分析情報の内容をフラット テーブルとして表示するには、次のようにします。
gcloud recommender insights list \
    --organization=ORGANIZATION \
    --location=global \
    --insight-type=google.cloudasset.asset.Insight \
    --flatten="content.matchedPolicies[].matchedBindings[].matchedMembers[]" \
    --format="table(insightSubtype, name,
    content.matchedPolicies.matchedBindings.matchedMembers,
    content.matchedPolicies.matchedBindings.role,
    content.matchedPolicies.resource)"

API

次の curl コマンドを実行します。

curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)"  \
-H "x-goog-user-project: PROJECT" \
"https://recommender.googleapis.com/v1/organizations/ORGANIZATION

分析情報のレスポンスの解釈

Asset Insights には、標準の分析情報の属性に加え、特殊なサブタイプとフィールドもいくつか存在します。

分析情報のサブタイプ

Asset Insights の個別のサブタイプは 7 種類あります。

  • EXTERNAL_MEMBER: 組織のドメイン外部に存在するドメインに属するユーザーまたはグループを含む IAM ポリシーを検出します。
  • EXTERNAL_POLICY_EDITOR: IAM ポリシーを変更する権限を付与された組織のドメイン外部のユーザーまたはグループを含む IAM ポリシーを検出します。
  • EXTERNAL_CLOUD_STORAGE_OBJECT_VIEWER: ストレージ オブジェクト(storage.objects.list または storage.objects.get permission)を取得または一覧表示する権限を付与された、組織のドメイン外部のユーザーまたはグループを含む IAM ポリシーを検出します。
  • EXTERNAL_SERVICE_ACCOUNT_IMPERSONATOR: サービス アカウントになりすます権限が付与されている組織外部のユーザーまたはグループを含む IAM ポリシーを検出します。
  • TERMINATED_MEMBER: 無効化、削除、またはパージされたアカウントを持つユーザーまたはグループを含む IAM ポリシーを検出します。
  • PUBLIC_IAM_POLICY: すべてのユーザーまたはすべての認証済みユーザーを含む IAM ポリシーを検出します。
  • OWNER_TERMINATED_PROJECT: プロジェクトの IAM ポリシー内にアクティブなユーザーまたはグループが含まれないプロジェクトを検出します。

その他の content フィールド

レスポンスの標準フィールドに加えて、Asset Insights の content フィールドには複数の特殊フィールドが存在します。

  • user: この特定の分析情報のポリシー バインディングのメンバー内で検出された特定のユーザーのメールアドレス。このフィールドは、TERMINATED_MEMBER サブタイプに含まれています。
  • domain: この特定の分析情報のポリシー バインディングのメンバー内で検出された特定のドメイン。このフィールドは、EXTERNAL_MEMBEREXTERNAL_POLICY_EDITOREXTERNAL_CLOUD_STORAGE_OBJECT_VIEWEREXTERNAL_SERVICE_ACCOUNT_IMPERSONATOR のサブタイプに含まれています。
  • assetName: この特定の分析情報でアクセスが検出されたアセット名。このフィールドは、OWNER_TERMINATED_PROJECTPUBLIC_IAM_POLICY のサブタイプに含まれています。
  • policyCount: この特定の分析情報で検出された一致するメンバーの個別の IAM ポリシーの合計数。このフィールドは、すべての Asset 分析情報のサブタイプに含まれます。
  • matchedPolicies: 検出された分析情報に一致する IAM ポリシーのサンプリング。一致ポリシーには、検出された分析情報と一致するバインディングとバインディング メンバーのサブセットのみが含まれます。このフィールドは、すべてのアセット分析情報のサブタイプに含まれます。
  • policySearchQuery: 関連するすべてのポリシーをリアルタイムで取得するために Cloud Asset Inventory の IAM ポリシー検索 API で使用できるクエリ。

レスポンスの例

次のスニペットは、サンプル レスポンスの形式を示します。

[{
   "name":"organizations/1234567/locations/global/insightTypes/google.cloudasset.asset.Insight/insights/0ab35ae7-afa8-42a3-a173-92da8771a489",
   "description":"Domain example.com detected in 1 IAM policies",
   "content":{
      "domain":"example.com",
      "policyCount":1,
      "policySearchQuery":"policy: example.com",
      "matchedPolicies":[
         {
            "resource":"//cloudresourcemanager.googleapis.com/projects/5678910",
            "project":"projects/5678910",
            "matchedBindings":[
               {
                  "role":"roles/viewer",
                  "matchedMembers":[
                     "user:example@example.com"
                  ]
               }
            ]
         }
      ]
   },
   "lastRefreshTime":"2020-12-04T06:59:04Z",
   "observationPeriod":"0s",
   "stateInfo":{
      "state":"ACTIVE"
   },
   "category":"SECURITY",
   "targetResources":[
      "//cloudresourcemanager.googleapis.com/organizations/1234567"
   ],
   "insightSubtype":"EXTERNAL_MEMBER",
   "etag":"\"00000000000\"",
   "initialRefreshTime":"2020-12-01T06:58:03Z"
}]

制限事項

  • これらの分析情報では、グループのメンバーシップは知見の一部としては考慮されず、一致する脆弱性をすべて網羅したものではありません。
  • 個々の分析情報には、各ポリシー 100 個を上限とする、一致 IAM ポリシーのサンプリングが含まれます。すべての一致ポリシーを取得するには、Cloud Asset Inventory ポリシー検索を呼び出します。
  • アセット分析情報では、分析情報の生成を目的とするサービス アカウントは考慮されません。