BigQuery データセットのロールの推奨事項を確認して適用する

このページでは、BigQuery データセットの IAM ロールに関する推奨事項を表示、理解、適用する方法について説明します。ロールの推奨事項により、プリンシパルが実際に必要な権限のみを持つようにすることで、最小権限の原則を徹底できます。

始める前に

必要な IAM のロール

データセットレベルのロールの推奨事項を管理するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、データセット レベルのロールの推奨事項を管理するために必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

データセット レベルのロールの推奨事項を管理するには、次の権限が必要です。

  • 推奨事項を表示するには:
    • プロジェクトに対する iam.roles.get
    • プロジェクトに対する iam.roles.list
    • プロジェクトに対する recommender.iamPolicyRecommendations.get
    • プロジェクトに対する recommender.iamPolicyRecommendations.list
    • プロジェクトに対する recommender.iamPolicyInsights.get
    • プロジェクトに対する recommender.iamPolicyInsights.list
    • データセットに対する bigquery.datasets.getIamPolicy
  • 推奨事項を適用、拒否するには:
    • プロジェクトに対する recommender.iamPolicyRecommendations.update
    • データセットに対する bigquery.datasets.setIamPolicy

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

推奨事項の確認と適用

データセット レベルのロールに関する推奨事項を確認して適用するには、Google Cloud CLI と Recommender API を使用します。

gcloud

推奨事項を確認する:

データセットレベルの推奨事項を一覧表示するには、gcloud recommender recommendations list コマンドを実行し、BigQuery データセットの推奨事項のみをフィルタします。

gcloud recommender recommendations list \
    --location=LOCATION \
    --recommender=google.iam.policy.Recommender \
    --project=PROJECT_ID \
    --format=json \
    --filter="recommenderSubtype:REMOVE_ROLE_BIGQUERY_DATASET OR recommenderSubtype:REPLACE_ROLE_BIGQUERY_DATASET"

次の値を置き換えます。

  • LOCATION: Cloud Storage データセットが配置されているリージョン(例: usus-central1)。
  • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。

レスポンスは次の例のようになります。この例では、プロジェクト my-project に対する編集者のロール(projectEditor:my-project)を持つすべてのユーザーが、データセット dataset-1 で BigQuery データ編集者のロール(roles/bigquery.dataEditor)を持ちます。ただし、このロールは過去 90 日間使用されていません。そのため、ロールの推奨事項により、次のロールは取り消しが提案されます。

[
  {
    "associatedInsights": [
      {
        "insight": "projects/1069248613794/locations/us/insightTypes/google.iam.policy.Insight/insights/984eccca-0241-472f-baab-2557dd0d7282"
      }
    ],
    "content": {
      "operationGroups": [
        {
          "operations": [
            {
              "action": "remove",
              "path": "/iamPolicy/bindings/*/members/*",
              "pathFilters": {
                "/iamPolicy/bindings/*/condition/expression": "",
                "/iamPolicy/bindings/*/members/*": "projectEditor:my-project",
                "/iamPolicy/bindings/*/role": "roles/bigquery.dataEditor"
              },
              "resource": "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1",
              "resourceType": "bigquery.googleapis.com/Dataset"
            }
          ]
        }
      ],
      "overview": {
        "addedRoles": [],
        "member": "projectEditor:my-project",
        "minimumObservationPeriodInDays": "0",
        "removedRole": "roles/bigquery.dataEditor",
        "resource": "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1"
      }
    },
    "description": "This role has not been used during the observation window.",
    "etag": "\"3b123bc08d028128\"",
    "lastRefreshTime": "2024-02-04T08:00:00Z",
    "name": "projects/1069248613794/locations/us/recommenders/google.iam.policy.Recommender/recommendations/0e9831fe-6810-476b-b14d-2b64bda17288",
    "primaryImpact": {
      "category": "SECURITY",
      "securityProjection": {
        "details": {
          "revokedIamPermissionsCount": 37
        }
      }
    },
    "priority": "P4",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    "stateInfo": {
      "state": "ACTIVE"
    },
    "targetResources": [
      "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1"
    ]
  },
  {
    "associatedInsights": [
      {
        "insight": "projects/1069248613794/locations/us/insightTypes/google.iam.policy.Insight/insights/9d11057e-9c71-410f-ad55-fc82d87761d0"
      }
    ],
    "content": {
      "operationGroups": [
        {
          "operations": [
            {
              "action": "remove",
              "path": "/iamPolicy/bindings/*/members/*",
              "pathFilters": {
                "/iamPolicy/bindings/*/condition/expression": "",
                "/iamPolicy/bindings/*/members/*": "user:alicexz@google.com",
                "/iamPolicy/bindings/*/role": "roles/bigquery.dataOwner"
              },
              "resource": "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1",
              "resourceType": "bigquery.googleapis.com/Dataset"
            }
          ]
        }
      ],
      "overview": {
        "addedRoles": [],
        "member": "user:alicexz@google.com",
        "minimumObservationPeriodInDays": "0",
        "removedRole": "roles/bigquery.dataOwner",
        "resource": "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1"
      }
    },
    "description": "This role has not been used during the observation window.",
    "etag": "\"1da285f7aa6438f1\"",
    "lastRefreshTime": "2024-02-04T08:00:00Z",
    "name": "projects/1069248613794/locations/us/recommenders/google.iam.policy.Recommender/recommendations/56013294-cf81-402a-8cde-25489545777c",
    "primaryImpact": {
      "category": "SECURITY",
      "securityProjection": {
        "details": {
          "revokedIamPermissionsCount": 64
        }
      }
    },
    "priority": "P4",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    "stateInfo": {
      "state": "ACTIVE"
    },
    "targetResources": [
      "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1"
    ]
  }
]

推奨事項を慎重に確認し、それによってプリンシパルの Google Cloud リソースへのアクセスがどのように変化するかを見極めてください。gcloud CLI から推奨事項を確認する方法については、このページの推奨事項を確認するをご覧ください。

推奨事項を適用するには:

  1. gcloud recommender recommendations mark-claimed コマンドを使用して、推奨事項の状態を CLAIMED, に変更します。これにより、推奨事項を適用している間は変更できなくなります。

    gcloud recommender recommendations mark-claimed \
        RECOMMENDATION_ID \
        --location=LOCATION \
        --recommender=google.iam.policy.Recommender \
        --project=PROJECT_ID \
        --format=FORMAT \
        --etag=ETAG \
        --state-metadata=STATE_METADATA
    

    次の値を置き換えてください。

    • RECOMMENDATION_ID: レコメンデーションの一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、推奨事項 ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • LOCATION: BigQuery データセットが配置されているリージョン(例: usus-central1)。
    • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • FORMAT: レスポンスの形式。json または yaml を使用してください。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。この値には引用符を含めることができます。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータを含むカンマで区切られた Key-Value ペア。たとえば、--state-metadata=reviewedBy=alice,priority=high です。メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    コマンドが成功した場合、レスポンスは次の例のように CLAIMED ステータスにレコメンデーションを表示します。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "priority": "P1",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    "stateInfo": {
      "state": "CLAIMED"
    }
    ...
  2. データセットの許可ポリシーを取得し、推奨事項が反映されるように許可ポリシーを変更して設定します。

  3. レコメンデーションを適用できた場合はレコメンデーションのステータスを SUCCEEDED に更新し、レコメンデーションを適用できない場合は FAILED に更新します。

    gcloud recommender recommendations COMMAND \
        RECOMMENDATION_ID \
        --location=LOCATION \
        --recommender=google.iam.policy.Recommender \
        --project=PROJECT_ID \
        --format=FORMAT \
        --etag=ETAG \
        --state-metadata=STATE_METADATA
    

    次の値を置き換えてください。

    • COMMAND: レコメンデーションを適用できた場合は mark-succeeded を使用し、レコメンデーションを適用できなかった場合は mark-failed を使用します。
    • RECOMMENDATION_ID: レコメンデーションの一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、推奨事項 ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • LOCATION: BigQuery データセットが配置されているリージョン(例: usus-central1)。
    • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • FORMAT: レスポンスの形式。json または yaml を使用してください。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。この値には引用符を含めることができます。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータを含むカンマで区切られた Key-Value ペア。たとえば、--state-metadata=reviewedBy=alice,priority=high です。メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    たとえば、レコメンデーションを「完了」に設定した場合、レスポンスにより SUCCEEDED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "priority": "P1",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    "stateInfo": {
      "state": "SUCCEEDED"
    }
    ...

REST

この手順は、ユーザーが認証済みで、GOOGLE_APPLICATION_CREDENTIALS 環境変数が設定されていることを前提としています。

推奨事項を確認する:

BigQuery データセットで利用可能なすべての推奨事項を一覧表示するには、Recommender API の recommendations.list メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
  • LOCATION: BigQuery データセットが配置されているリージョン(例: usus-central1)。
  • PAGE_SIZE: 省略可。このリクエストから返される結果の最大数。指定しなかった場合、サーバーが結果数を決定します。推奨事項の数がページサイズより大きい場合、レスポンスにページ設定トークンが含まれます。このトークンを使用して、結果の次のページを取得できます。
  • PAGE_TOKEN: 省略可。以前のレスポンスでこのメソッドから返されたページ設定トークン。指定すると、前のリクエストが終了した時点から推奨事項のリストが開始します。
  • PROJECT_ID: Google Cloud プロジェクト IDプロジェクト ID は英数字からなる文字列です(例: my-project)。

HTTP メソッドと URL:

GET https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations?filter=recommenderSubtype%20%3D%20REMOVE_ROLE_BIGQUERY_DATASET%20OR%20recommenderSubtype%20%3D%20REPLACE_ROLE_BIGQUERY_DATASET&pageSize=PAGE_SIZE&pageToken=PAGE_TOKEN

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスは次の例のようになります。この例では、プロジェクト「my-project」に対する編集者の役割を持つすべてのユーザー(projectEditor:my-project)が、データセットdataset-1 で BigQuery データ編集者のロール(roles/bigquery.dataEditor)を持ちます。 ただし、このロールは過去 90 日間使用されていません。そのため、ロールの推奨事項により、次のロールは取り消しが提案されます。

{
  "recommendations": [
    {
      "name": "projects/1069248613794/locations/us/recommenders/google.iam.policy.Recommender/recommendations/0e9831fe-6810-476b-b14d-2b64bda17288",
      "description": "This role has not been used during the observation window.",
      "lastRefreshTime": "2024-02-02T08:00:00Z",
      "primaryImpact": {
        "category": "SECURITY",
        "securityProjection": {
          "details": {
            "revokedIamPermissionsCount": 37
          }
        }
      },
      "content": {
        "operationGroups": [
          {
            "operations": [
              {
                "action": "remove",
                "resourceType": "bigquery.googleapis.com/Dataset",
                "resource": "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1",
                "path": "/iamPolicy/bindings/*/members/*",
                "pathFilters": {
                  "/iamPolicy/bindings/*/condition/expression": "",
                  "/iamPolicy/bindings/*/members/*": "projectEditor:my-project",
                  "/iamPolicy/bindings/*/role": "roles/bigquery.dataEditor"
                }
              }
            ]
          }
        ],
        "overview": {
          "resource": "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1",
          "member": "projectEditor:my-project",
          "removedRole": "roles/bigquery.dataEditor",
          "addedRoles": [],
          "minimumObservationPeriodInDays": "0"
        }
      },
      "stateInfo": {
        "state": "ACTIVE"
      },
      "etag": "\"d008ad3780bad5e0\"",
      "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
      "associatedInsights": [
        {
          "insight": "projects/1069248613794/locations/us/insightTypes/google.iam.policy.Insight/insights/984eccca-0241-472f-baab-2557dd0d7282"
        }
      ],
      "priority": "P4",
      "targetResources": [
        "//bigquery.googleapis.com/projects/my-project/datasets/dataset-1"
      ]
    }
  ]
}

推奨事項を慎重に確認し、それによってプリンシパルの Google Cloud リソースへのアクセスがどのように変化するかを見極めてください。REST API から推奨事項を確認する方法については、このページの推奨事項を確認するをご覧ください。

推奨事項を適用するには、次の手順を行います。

  1. レコメンデーションを CLAIMED とマークします。

    推奨事項を CLAIMED としてマークし、適用中に推奨事項を変更できないようにするには、Recommender API の recommendations.markClaimed メソッドを使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • LOCATION: BigQuery データセットが配置されているリージョン(例: usus-central1)。
    • RECOMMENDATION_ID: 推奨事項の一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、レコメンデーション ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。バックスラッシュを使用して引用符をエスケープします(例: "\"df7308cca9719dcc\"")。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータと Key-Value ペアを含むオブジェクト。例: {"reviewedBy": "alice", "priority": "high"}メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    HTTP メソッドと URL:

    POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations/RECOMMENDATION_ID:markClaimed

    リクエストの本文(JSON):

    {
      "etag": "ETAG",
      "stateMetadata": {
        "STATE_METADATA"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスでは、次の例のように CLAIMED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "stateInfo": {
      "state": "CLAIMED"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    ...
    

  2. プロジェクトの許可ポリシーを取得して、推奨事項が反映されるように許可ポリシーを変更します。

  3. レコメンデーションを適用できた場合はレコメンデーションのステータスを SUCCEEDED に更新し、レコメンデーションを適用できない場合は FAILED に更新します。

    SUCCEEDED

    推奨事項を SUCCEEDED としてマークして、適用可能であることを示すには、Recommender API の recommendations.markSucceeded メソッドを使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • LOCATION: BigQuery データセットが配置されているリージョン(例: usus-central1)。
    • RECOMMENDATION_ID: 推奨事項の一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、レコメンデーション ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。バックスラッシュを使用して引用符をエスケープします(例: "\"df7308cca9719dcc\"")。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータと Key-Value ペアを含むオブジェクト。例: {"reviewedBy": "alice", "priority": "high"}メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    HTTP メソッドと URL:

    POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations/RECOMMENDATION_ID:markSucceeded

    リクエストの本文(JSON):

    {
      "etag": "ETAG",
      "stateMetadata": {
        "STATE_METADATA"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスでは、次の例のように SUCCEEDED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "stateInfo": {
      "state": "SUCCEEDED"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    ...
    

    FAILED

    推奨事項を適用できなかったことを示す FAILED とマークするには、Recommender API の recommendations.markFailed メソッドを使用します。

    リクエストのデータを使用する前に、次のように置き換えます。

    • PROJECT_ID: BigQuery データセットを含む Google Cloud プロジェクトの ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。
    • LOCATION: BigQuery データセットが配置されているリージョン(例: usus-central1)。
    • RECOMMENDATION_ID: 推奨事項の一意の識別子。この値は、レコメンデーションの name フィールドの最後に表示されます。たとえば、name フィールドが projects/example-project/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fb927dc1-9695-4436-0000-f0f285007c0f の場合、レコメンデーション ID は fb927dc1-9695-4436-0000-f0f285007c0f です。
    • ETAG: レコメンデーションの etag フィールドの値("dd0686e7136a4cbb" など)。バックスラッシュを使用して引用符をエスケープします(例: "\"df7308cca9719dcc\"")。
    • STATE_METADATA: 省略可。レコメンデーションに関する任意のメタデータと Key-Value ペアを含むオブジェクト。例: {"reviewedBy": "alice", "priority": "high"}メタデータにより、レコメンデーションの stateInfo.stateMetadata フィールドが置き換わります。

    HTTP メソッドと URL:

    POST https://recommender.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/recommenders/google.iam.policy.Recommender/recommendations/RECOMMENDATION_ID:markFailed

    リクエストの本文(JSON):

    {
      "etag": "ETAG",
      "stateMetadata": {
        "STATE_METADATA"
      }
    }
    

    リクエストを送信するには、次のいずれかのオプションを展開します。

    レスポンスでは、次の例のように FAILED ステータスにレコメンデーションが表示されます。この例では、わかりやすくするためにほとんどのフィールドを省略しています。

    ...
    "stateInfo": {
      "state": "FAILED"
    },
    "etag": "\"7caf4103d7669e12\"",
    "recommenderSubtype": "REMOVE_ROLE_BIGQUERY_DATASET",
    ...
    

推奨事項について

各推奨事項には、それが作られた理由の理解に役立つ情報が含まれます。

推奨事項のフィールドの詳細については、Recommendation リファレンスをご覧ください。

この推奨事項のベースとなる権限の使用状況を確認するには、推奨事項に関連付けられたポリシー分析情報を表示します。これらの分析情報は associatedInsights フィールドにリストされています。推奨事項に関連付けられたポリシー分析情報を表示するには、次のようにします。

  1. 関連付けられた分析情報の ID をコピーします。ID は、insight フィールドの insights/ より後の部分です。たとえば、insight フィールドが projects/123456789012/locations/us/insightTypes/google.iam.policy.Insight/insights/7849add9-73c0-419e-b169-42b3671173fb の場合、分析情報 ID は 7849add9-73c0-419e-b169-42b3671173fb です。
  2. コピーした分析情報 ID を使用して、手順どおりに操作を行い、ポリシーの分析情報を取得します。

次のステップ