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

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

事前準備

  • 如果 IAM 和 Recommender API 尚未啟用,請啟用這些 API。

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    啟用 API

  • 請確認您已在機構或專案層級啟用 Security Command Center 的 Premium 或 Enterprise 方案。詳情請參閱「帳單問題」。

  • 瞭解角色建議。

  • 設定驗證方法。

    選取這個頁面上您打算如何使用範例的分頁:

    gcloud

    在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

    控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。 Google Cloud Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已針對您目前的專案設定好相關值。工作階段可能要幾秒鐘的時間才能初始化。

    REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

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

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

必要的 IAM 角色

如要取得管理資料集層級角色建議所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備管理資料集層級角色建議所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要管理資料集層級的角色建議,必須具備下列權限:

  • 如要查看建議:
    • 專案的 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 資料集所在的區域,例如 us 或 us-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 資料集所在的區域,例如 us 或 us-central1。
    • PROJECT_ID:包含 BigQuery 資料集的 Google Cloud 專案 ID。專案 ID 是英數字元字串,例如 my-project。
    • FORMAT:回應格式。使用 json 或 yaml。
    • 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 資料集所在的區域,例如 us 或 us-central1。
    • PROJECT_ID:包含 BigQuery 資料集的 Google Cloud 專案 ID。專案 ID 是英數字元字串,例如 my-project。
    • FORMAT:回應格式。使用 json 或 yaml。
    • 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 資料集所在的區域,例如 us 或 us-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 資料集的Google Cloud 專案 ID。專案 ID 是英數字元字串,例如 my-project。
    • LOCATION:BigQuery 資料集所在的區域,例如 us 或 us-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 資料集的Google Cloud 專案 ID。專案 ID 是英數字元字串,例如 my-project。
    • LOCATION:BigQuery 資料集所在的區域,例如 us 或 us-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 資料集的Google Cloud 專案 ID。專案 ID 是英數字元字串,例如 my-project。
    • LOCATION:BigQuery 資料集所在的區域,例如 us 或 us-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 取得政策洞察。

後續步驟