排解 BigQuery 中的 IAM 權限問題

本文說明如何排解 BigQuery 中身分與存取權管理 (IAM) 權限的問題。IAM 權限問題通常會導致 Access Denied 錯誤,例如:

  • Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.
  • Access Denied: Project PROJECT_ID: User does not have bigquery.datasets.get permission on dataset DATASET.
  • User does not have permission to query table PROJECT_ID:DATASET.TABLE.
  • Access Denied: Table PROJECT_ID:DATASET.TABLE: User does not have permission to query table PROJECT_ID:DATASET.TABLE, or perhaps it does not exist.
  • Access Denied: User PRINCIPAL does not have permission to perform bigquery.tables.getData on resource 'projects/PROJECT_ID/datasets/DATASET/tables/TABLE'.

事前準備

  • 如要排解主體存取 BigQuery 資源的問題,請確認您具備必要 IAM 權限

收集問題相關資訊

如要排解資源存取權問題,第一步是找出缺少的權限、遭拒存取權的 IAM 主體,以及主體嘗試存取的資源。

從錯誤或工作記錄取得資訊

如要取得主體、資源和權限的相關資訊,請檢查 bq 指令列工具的輸出內容、API 回應或 Google Cloud 控制台中的 BigQuery。

舉例來說,如果您嘗試執行權限不足的查詢, Google Cloud 控制台的「Query results」(查詢結果) 專區中,「Job information」(工作資訊) 分頁會顯示類似以下的錯誤訊息。

「查詢結果」部分的「工作資訊」分頁發生存取遭拒錯誤。

檢查錯誤,判斷主體、資源和權限。

在某些情況下,您可以直接從錯誤訊息要求缺少的權限。詳情請參閱 IAM 說明文件中的「排解權限錯誤訊息」。

從 Cloud 稽核記錄取得資訊

如果錯誤訊息是通用訊息、缺少資訊,或動作在背景程序中失敗,請使用 Cloud 稽核記錄記錄瀏覽器取得錯誤相關資訊。

  1. 前往 Google Cloud 控制台的「Logs Explorer」頁面。

    前往記錄檔探索工具

    或者,從導覽選單中選擇「監控」>「記錄檔探索工具」

  2. 在記錄檢視器中,選擇「專案記錄」做為記錄範圍。

  3. 在查詢視窗中輸入下列查詢,從 BigQuery 資料存取記錄取得權限相關錯誤:

    resource.type="bigquery_resource" AND
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
    protoPayload.status.message:"Access Denied" OR
    protoPayload.status.message:"Permission denied" OR
    protoPayload.status.code=7

    PROJECT_ID 替換為您的專案 ID。

  4. 在查詢結果中,展開與失敗作業對應的記錄項目。

  5. protoPayload 區段中,展開 authorizationInfo 陣列,然後展開 authorizationInfo 陣列中的每個節點。

    authorizationInfo 陣列會顯示 API 呼叫期間執行的每項權限檢查。

  6. 如要查看錯誤原因,請尋找 granted: false 項目。「granted: false」項目會顯示下列資訊:

    • permission:已檢查的 IAM 權限字串。例如:bigquery.tables.getData
    • resource:主體嘗試存取的資源完整名稱。例如:projects/myproject/datasets/mydataset/tables/mytable
    • principalEmail (如有):在「參照」protoPayload.authenticationInfo中,這是嘗試執行動作的主體。

    protoPayload 的 authorizationInfo 區段,顯示權限、資源和 principalEmail。

使用 Policy Analyzer 檢查允許政策

您可以使用允許政策的政策分析工具,根據 IAM 允許政策,瞭解哪些 IAM 主體具備哪些 BigQuery 資源的存取權。

收集權限錯誤的相關資訊後,您可以使用政策分析工具,瞭解主體缺少必要存取權的原因。這項工具會分析所有相關政策、Google 群組成員資格,以及專案、資料夾和機構等父項資源的繼承項目。

如要使用 Policy Analyzer 進行允許政策分析,請建立分析查詢、指定分析範圍,然後執行查詢。

  1. 前往 Google Cloud 控制台的「Policy Analyzer」頁面。

    前往政策分析工具

    或者,從導覽選單中依序選擇「IAM 與管理」>「政策分析器」

  2. 按一下「建立自訂查詢」

  3. 在「設定查詢」頁面中,輸入先前收集的資訊:

    1. 在「選取範圍」部分,確認「選取查詢範圍」欄位中顯示的是目前專案,或按一下「瀏覽」選擇其他資源。

    2. 在「設定查詢參數」部分,為「參數 1」選擇「主體」,然後在「主體」欄位中輸入使用者、群組或服務帳戶的電子郵件地址。

    3. 按一下 「新增參數」

    4. 針對「Parameter 2」(參數 2),選擇「Permission」(權限),然後在「Permission」(權限)欄位中,依序點選「Select」(選取)、選擇 BigQuery 權限,以及點選「Add」(新增)。例如選取 bigquery.tables.getData

    5. 按一下 「新增參數」

    6. 針對「參數 3」,選擇「資源」,並在「資源」欄位中輸入完整合格的資源名稱。資源名稱必須包含服務前置字串,如以下範例所示:

      • BigQuery 專案//cloudresourcemanager.googleapis.com/projects/PROJECT_ID
      • BigQuery 資料集//bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET
      • BigQuery 資料表//bigquery.googleapis.com/projects/PROJECT/datasets/DATASET/tables/TABLE
  4. 在「Custom query」(自訂查詢) 窗格中,依序點選「Analyze」(分析)「Run query」(執行查詢)

  5. 查看查詢結果。結果可能是下列其中一項:

    • 空白清單。如果沒有結果,表示主體沒有必要權限。您需要授予主體角色,提供適當的權限。
    • 一或多個結果。如果分析工具找到允許政策,表示主體具備某種形式的存取權。按一下每個結果的「查看繫結」,即可查看提供資源存取權的角色,主體是這些資源的成員。政策繫結會顯示存取權是透過群組成員資格或繼承授予,還是因 IAM 條件IAM 拒絕政策而遭拒。

找出可授予必要權限的正確 IAM 角色

確認主體沒有足夠的存取權後,下一步是找出適當的預先定義或自訂 IAM 角色,授予必要權限。您選擇的角色應遵循最低權限原則。

如果貴機構使用自訂角色,可以列出專案或機構中建立的所有自訂角色,找出正確的角色。舉例來說,在 Google Cloud 控制台的「Roles」(角色) 頁面,您可以依「Type:Custom」(類型:自訂) 篩選清單,只查看自訂角色。

如要找出正確的預先定義 IAM 角色,請按照下列步驟操作。

  1. 開啟 BigQuery IAM 角色和權限頁面的「BigQuery 權限」部分

  2. 在「Enter a permission」(輸入權限) 搜尋列中,輸入您從錯誤訊息、工作記錄或稽核記錄中擷取的權限。例如:bigquery.tables.getData

    搜尋結果會顯示授予該權限的所有預先定義 BigQuery 角色。

  3. 採用最低權限原則:在角色清單中,選擇授予必要權限的最低權限角色。舉例來說,如果您搜尋「bigquery.tables.getData」來授予查詢資料表資料的權限,則 BigQuery 資料檢視者是授予該權限的最低權限角色。

  4. 將適當角色授予主體。如要瞭解如何將 IAM 角色授予 BigQuery 資源,請參閱「使用 IAM 控管資源存取權」。

後續步驟