BigQuery へのポリシー分析の書き込み

このページでは、Identity and Access Management(IAM)ポリシーを非同期で分析し、結果を BigQuery に書き込む方法について説明します。プロセスは、分析結果が BigQuery テーブルに書き込まれる点以外は、IAM ポリシーの分析と似ています。

始める前に

  • プロジェクトで Cloud Asset API を有効にする必要があります

  • API を使用して、これらのクエリを実行する場合は、環境と gcurl を設定する必要があります。

    1. 環境を設定する

    2. gcurl エイリアスを設定するには、次の手順を実行します。

      Compute Engine インスタンス上の場合は、次のコマンドを実行します。

      alias gcurl='curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "Content-Type: application/json" -X POST'
      

      Compute Engine インスタンス上ではない場合は、次のコマンドを実行します。

      alias gcurl='curl -H "$(oauth2l header --json CREDENTIALS cloud-platform)" \
      -H "Content-Type: application/json" -X POST'
      

      ここで CREDENTIALS は認証情報ファイルのパスです(~/credentials.json など)。

AnalyzeIamPolicyLongrunning を呼び出しています

AnalyzeIamPolicyLongrunning メソッドを使用すると、分析リクエストを発行して、指定された BigQuery の宛先で結果を取得できます。

gcloud

asset analyze-iam-policy-longrunning gcloud コマンドを使用して、API 対応プロジェクトで AnalyzeIamPolicyLongrunning を呼び出せます。Cloud SDK バージョン 314.0.0 以降を実行している必要があります。gcloud version コマンドでバージョンを確認できます。

gcloud asset analyze-iam-policy-longrunning \
    --organization="ORG_ID" \
    --full-resource-name="FULL_RESOURCE_NAME" \
    --permissions="COMMA_SEPARATED_PERMISSIONS" \
    --bigquery-dataset="projects/BQ_PROJECT_ID/datasets/BQ_DATASET_NAME" \
    --bigquery-table-prefix="BQ_TABLE_PREFIX"

たとえば、組織 123456789 の Compute Engine インスタンス ipa-gce-instance-2 に対する compute.instances.get 権限と compute.instances.start 権限をどのユーザーが持つかの分析結果を、some_prefix のテーブル接頭辞を有する BigQuery データセット projects/project1/datasets/bq-dataset-01 に書き込むには:

gcloud asset analyze-iam-policy-longrunning --organization=123456789 \
    --full-resource-name="//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2" \
    --permissions="compute.instances.get,compute.instances.start" \
    --bigquery-dataset="projects/project1/datasets/bq-dataset-01" \
    --bigquery-table-prefix="some_prefix"

詳しくは以下をご覧ください。

gcloud asset analyze-iam-policy-longrunning --help

REST

IAM ポリシーを分析し、gcurl エイリアスを使用して結果を書き込みます。

gcurl -d "$JSON_REQUEST" \
"https://cloudasset.googleapis.com/v1/organizations/${YOUR_ORG_ID}:analyzeIamPolicyLongrunning"

ここで

  • YOUR_ORG_ID は、123456789 のような組織 ID です。

  • JSON_REQUEST は JSON 形式の分析リクエストです。たとえば、some_prefix のテーブル接頭辞を有する BigQuery データセット projects/project1/datasets/bq-dataset-01 向けに、組織 123456789 の Compute Engine インスタンス ipa-gce-instance-2 への compute.instances.get 権限と compute.instances.start 権限をどのユーザーが持つかを分析するには:

    JSON_REQUEST='{
      "analysisQuery":{
         "scope":"organization/123456789",
         "resourceSelector":{
            "fullResourceName":"//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2"
         },
         "accessSelector":{
            "permissions":[
               "compute.instances.get",
               "compute.instances.start"
            ]
         }
      },
      "outputConfig":{
         "bigqueryDestination":{
            "dataset":"projects/project1/datasets/bq-dataset-01",
            "tablePrefix":"some_prefix"
         }
      }
    }'
    

パーティション キーの設定

BigQuery テーブルを分割して、パーティションをフィルタリングすることでクエリのパフォーマンスを向上させ、クエリ費用を抑えることができます。次のパーティション キーがサポートされています。

  • REQUEST_TIME: リクエストを受信した時刻。

書き込み処理の設定

宛先テーブルまたはパーティションがすでに存在する場合に実施するアクションを指定します。BigQuery の書き込み処理もご覧ください。次の値がサポートされています。

  • WRITE_APPEND: デフォルト値。テーブルまたは最新のパーティションにデータを追加します。
  • WRITE_TRUNCATE: テーブル全体またはすべてのパーティション データを上書きします。
  • WRITE_EMPTY: エラーを返します。

IAM ポリシー分析結果の表示

IAM ポリシー分析を表示するには:

コンソール

  1. Cloud Console の BigQuery ページに移動します。
    BigQuery ページに移動

  2. データセット内のテーブルとビューを表示するには、ナビゲーション パネルを開きます。[リソース] セクションでプロジェクトを展開し、データセットを選択します。

  3. リストから、接頭辞付きのテーブルを選択します。analysis 接頭辞付きのテーブルには、クエリとメタデータ(オペレーション名、リクエスト時刻、重大でないエラーなど)が含まれます。analysis_result 接頭辞付きのテーブルは、{identity, role(s)/permission(s), resource} のタプルを、それらのタプルを生成する IAM ポリシーとともに一覧表示した結果です。

  4. データのサンプルセットを表示するには、[プレビュー] を選択します。

API

テーブルのデータを閲覧するには、tabledata.list を呼び出します。tableId パラメータで、テーブルの名前を指定します。

次の省略可能パラメータを構成すると、出力を制御できます。

  • maxResults は返される結果の最大数です。
  • selectedFields は返される列のカンマ区切りのリストです。指定しなければ、すべての列が返されます。
  • startIndex は、読み取りを開始する行を指し示す、ゼロから始まるインデックスです。

値は 1 つの JSON オブジェクトにラップされて返されます。このオブジェクトは、tabledata.list リファレンス ドキュメントに記載されている手順に従って解析する必要があります。

クエリの構築

クエリのその他のユースケースとオプションについては、IAM ポリシークエリのサンプルの分析をご覧ください。

BigQuery のクエリ

このセクションでは、AnalyzeIamPolicyLongrunning によって書き込まれた BigQuery テーブルの使用法を示す SQL クエリの例を示します。BigQuery の構文の詳細については、標準 SQL クエリ構文をご覧ください。

ほとんどのクエリには OP_ID が必要であり、AnalyzeIamPolicyLongrunning レスポンスから取得できます。たとえば gcloud では、「[gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456] を使用してオペレーションのステータスを確認します」の OP_ID123456 になります。

オペレーションの一覧表示

テーブルには、複数の AnalyzeIamPolicyLongrunning オペレーションの結果を格納できます。次のクエリを使用して、それらすべてを一覧表示できます。

SELECT DISTINCT
  requestTime,
  opName
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
ORDER BY 1 DESC
;

1 つのオペレーションにおける分析の一覧表示

1 つの AnalyzeIamPolicyLongrunning オペレーションで、複数の分析レコードが生成される可能性があります。たとえば、リクエストで analyze_service_account_impersonation オプションを有効にすると、結果には 1 つのメイン分析(analysisId 0)と複数のサービス アカウントなりすまし分析が含まれる可能性があります。

次のクエリを使用して、オペレーション名を指定すると、すべての分析を確認できます。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisId,
  requestTime,
  TO_JSON_STRING(analysis.analysisQuery, true) as analysisQuery,
  analysis.fullyExplored,
  TO_JSON_STRING(analysis.nonCriticalErrors, true) as nonCriticalErrors
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
WHERE opName=_opName
ORDER BY 1
;

1 つの分析における ACE(アクセス制御エントリ)の一覧表示

ACE はアクセス制御エントリ {identity, role(s)/permission(s), resource} です。次のクエリを使用して、1 つの分析で ACE を一覧表示できます。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName
AND analysisId = 0
ORDER BY 1,2,3,4
;

1 つの分析における IAM ポリシー バインディングを使用した ACE(アクセス制御エントリ)の一覧表示

このクエリでは、ACE および 1 つの分析用にこの ACE を生成する IAM ポリシー バインディングの両方を一覧表示しています。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission,
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2,3,4
;

1 つの分析における IAM ポリシー バインディングの一覧表示

このクエリでは、1 つの分析に表示された IAM ポリシー バインディングを一覧表示します。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`
WHERE opName=_opName AND analysisId = 0
ORDER BY 1, 2
;

1 つの分析における ACE(アクセス制御エントリ)の IAM ポリシー バインディングの一覧表示

このクエリでは、1 つの分析における IAM ポリシー バインディングとその派生した ACE を一覧表示します。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding,
  TO_JSON_STRING(analysisResult.identityList.identities, true) as identities,
  TO_JSON_STRING(acls.accesses, true) as accesses,
  TO_JSON_STRING(acls.resources, true) as resources
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.accessControlLists) AS acls
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2
;