查看和应用 BigQuery 数据集的角色建议

本页介绍了如何查看、了解和应用针对 BigQuery 数据集的 IAM 角色建议。角色建议可确保主账号仅拥有其实际需要的权限,从而帮助您强制执行最小权限原则。

准备工作

  • Enable the IAM and Recommender APIs.

    Enable the APIs

  • 确保您已在组织级或项目级激活 Security Command Center 的高级方案或 Enterprise 方案。如需了解详情,请参阅结算问题

  • 了解角色建议

  • 设置身份验证。

    Select the tab for how you plan to use the samples on this page:

    gcloud

      In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

      REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需 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) 中具有 Editor 角色的所有用户都对数据集 dataset-1 具有 BigQuery Data Editor 角色 (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:响应的格式。请使用 jsonyaml
    • ETAG:建议中 etag 字段的值,例如 "dd0686e7136a4cbb"。请注意,该值可以包含引号。
    • STATE_METADATA:可选。以英文逗号分隔的键值对,其中包含您对建议所选择的元数据。例如 --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:响应的格式。请使用 jsonyaml
    • ETAG:建议中 etag 字段的值,例如 "dd0686e7136a4cbb"。请注意,该值可以包含引号。
    • STATE_METADATA:可选。以英文逗号分隔的键值对,其中包含您对建议所选择的元数据。例如 --state-metadata=reviewedBy=alice,priority=high。元数据会替换建议中的 stateInfo.stateMetadata 字段。

    例如,如果您将建议标记为成功,响应会显示建议处于 SUCCEEDED 状态。为清楚起见,此示例省略了大部分字段:

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

REST

查看您的建议

如需列出 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 方法和网址:

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”中具有 Editor 角色的所有用户 (projectEditor:my-project) 都对数据集 dataset-1 具有 BigQuery Data Editor 角色 (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:可选。包含键值对的对象,其中包含您对建议所选择的元数据。例如 {"reviewedBy": "alice", "priority": "high"}。元数据会替换建议中的 stateInfo.stateMetadata 字段。

    HTTP 方法和网址:

    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:可选。包含键值对的对象,其中包含您对建议所选择的元数据。例如 {"reviewedBy": "alice", "priority": "high"}。元数据会替换建议中的 stateInfo.stateMetadata 字段。

    HTTP 方法和网址:

    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:可选。包含键值对的对象,其中包含您对建议所选择的元数据。例如 {"reviewedBy": "alice", "priority": "high"}。元数据会替换建议中的 stateInfo.stateMetadata 字段。

    HTTP 方法和网址:

    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 来获取政策数据分析

后续步骤