查看並套用 BigQuery 資料集的角色建議

本頁說明如何查看、瞭解及套用 BigQuery 資料集的 IAM 角色建議。角色建議可確保主體只會有實際所需的權限,協助您強制執行最低權限原則。

事前準備

  • Enable the IAM and Recommender APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  • 請確認您已在機構或專案層級啟用Security Command Center 的進階或企業方案。詳情請參閱帳單問題

  • 瞭解角色建議

  • 設定驗證方法。

    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 的憑證。

      安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using 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) 中具有編輯者角色的所有使用者,在資料集 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:建議的專屬 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:建議的專屬 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 資料集的專案 ID。Google Cloud 專案 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` (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 資料集的專案 ID。Google Cloud 專案 ID 為英數字元字串,例如 my-project
    • LOCATION:BigQuery 資料集所在的區域,例如 usus-central1
    • RECOMMENDATION_ID:建議的專屬 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 資料集的專案 ID。Google Cloud 專案 ID 為英數字元字串,例如 my-project
    • LOCATION:BigQuery 資料集所在的區域,例如 usus-central1
    • RECOMMENDATION_ID:建議的專屬 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 資料集的專案 ID。Google Cloud 專案 ID 為英數字元字串,例如 my-project
    • LOCATION:BigQuery 資料集所在的區域,例如 usus-central1
    • RECOMMENDATION_ID:建議的專屬 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 取得政策洞察

後續步驟