將政策分析結果寫入 BigQuery

本頁面說明如何以非同步方式分析 Identity and Access Management (IAM) 政策,並將結果寫入 BigQuery。這個程序與分析 IAM 政策類似,但分析結果會寫入 BigQuery 資料表。

事前準備

Enable the Cloud Asset API.

Enable the API

您必須在要用來傳送查詢的專案中啟用 API。這個資源不必與您指定查詢範圍的資源相同。

必要角色和權限

您必須具備下列角色和權限,才能執行政策分析並將結果匯出至 BigQuery。

必要的 IAM 角色

如要取得分析政策及將結果匯出至 BigQuery 所需的權限,請要求管理員為您授予下列 IAM 角色,以便您將查詢範圍限定為專案、資料夾或機構:

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

這些預先定義的角色包含分析政策並將結果匯出至 BigQuery 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

您必須具備下列權限,才能分析政策並將結果匯出至 BigQuery:

  • bigquery.datasets.create
  • bigquery.jobs.create
  • bigquery.tables.create
  • bigquery.tables.get
  • bigquery.tables.updateData
  • bigquery.tables.update
  • cloudasset.assets.analyzeIamPolicy
  • cloudasset.assets.searchAllResources
  • cloudasset.assets.searchAllIamPolicies
  • 如要分析含有自訂 IAM 角色的政策,請按照下列步驟操作: iam.roles.get
  • 如要使用 Google Cloud CLI 分析政策,請按照下列步驟操作: serviceusage.services.use

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

必要的 Google Workspace 權限

如要查看某個使用者是否因加入 Google Workspace 群組而擁有特定角色或權限,您必須具備 groups.read Google Workspace 權限。此權限包含在「群組讀取權限管理員」角色,以及「群組管理員」或「超級管理員」等權限較高的角色。詳情請參閱「指派特定管理員角色」。

分析政策並匯出結果

控制台

  1. 在 Google Cloud 控制台中,前往「Policy Analyzer」(政策分析器) 頁面。

    前往「Policy Analyzer」

  2. 在「分析政策」部分中找出要使用的查詢範本,然後按一下「建立查詢」。如要建立自訂查詢,請按一下「建立自訂查詢」

  3. 在「選取查詢範圍」欄位中,選取要將查詢範圍設為的專案、資料夾或機構。Policy Analyzer 會分析該專案、資料夾或機構的存取權,以及該專案、資料夾或機構中的任何資源。

  4. 確認已設定查詢參數:

    • 如果您使用查詢範本,請確認預先填入的查詢參數。
    • 如果您要建立自訂查詢,請設定要查詢的資源、主體、角色和權限。

    如要進一步瞭解可建立的查詢類型,請參閱「分析 IAM 政策」。

  5. 在標有查詢名稱的窗格中,依序按一下「Analyze」>「Export result only」。「Export results」窗格隨即開啟。

  6. 在「設定匯出目的地」部分中,輸入以下資訊:

    • 專案:BigQuery 資料集所在的專案。
    • 資料集:您要匯出結果的 BigQuery 資料集。
    • Table:BigQuery 資料表的前置字串,系統會將分析結果寫入該資料表。如果沒有指定前置字串的資料表,BigQuery 會建立新資料表。
  7. 按一下「繼續」

  8. 選用:在「設定其他設定」部分中,選取所需選項:

    • 分區:是否要將資料表分區。如要進一步瞭解分區資料表,請參閱分區資料表簡介
    • 寫入偏好設定:指定如果目的地資料表或分區已存在,系統會執行的動作。根據預設,如果資料表或分區已存在,BigQuery 會將資料附加至資料表或最新的分區。
  9. 按一下 [匯出]

Policy Analyzer 會執行查詢,並將結果匯出至指定的資料表。

gcloud

AnalyzeIamPolicyLongrunning 方法可讓您發出分析要求,並在指定的 BigQuery 目的地中取得結果。

使用下列任何指令資料之前,請先替換以下項目:

  • RESOURCE_TYPE:您要將搜尋範圍限定在哪種資源上。系統只會分析附加至此資源及其子項的 IAM 允許政策。請使用 projectfolderorganization 值。
  • RESOURCE_ID:您要將搜尋範圍設為Google Cloud 專案、資料夾或機構的 ID。系統只會分析這項資源及其子項所附加的 IAM 允許政策。專案 ID 是英數字元字串,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012
  • PRINCIPAL:您要分析存取權的實體,格式為 PRINCIPAL_TYPE:ID,例如 user:my-user@example.com。如需主要類型的完整清單,請參閱「主要識別碼」。
  • PERMISSIONS:以逗號分隔的清單,列出您要檢查的權限,例如 compute.instances.get,compute.instances.start。如果您列出多個權限,政策分析工具會檢查所列的任何權限。
  • DATASET:BigQuery 資料集,格式為 projects/PROJECT_ID/datasets/DATASET_ID,其中 PROJECT_ID 是 Google Cloud 專案的英數 ID,DATASET_ID 則是資料集的 ID。
  • TABLE_PREFIX:要寫入分析結果的 BigQuery 資料表前置字元。如果沒有使用指定前置字串的資料表,BigQuery 會建立新資料表。
  • PARTITION_KEY:選用。BigQuery 分區資料表的分區鍵。Policy Analyzer 僅支援 REQUEST_TIME 分割鍵。
  • WRITE_DISPOSITION:選用。指定在目的地資料表或分區已存在的情況下,要執行的動作。如需可能值的清單,請參閱 writeDisposition。根據預設,如果資料表或分區已存在,BigQuery 會將資料附加至資料表或最新的分區。

執行 gcloud asset analyze-iam-policy-longrunning 指令:

Linux、macOS 或 Cloud Shell

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID \
    --full-resource-name=FULL_RESOURCE_NAME \
    --identity=PRINCIPAL \
    --permissions='PERMISSIONS' \
    --bigquery-dataset=DATASET \
    --bigquery-table-prefix=TABLE_PREFIX \
    --bigquery-partition-key=PARTITION_KEY \
    --bigquery-write-disposition=WRITE_DISPOSITION

Windows (PowerShell)

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID `
    --full-resource-name=FULL_RESOURCE_NAME `
    --identity=PRINCIPAL `
    --permissions='PERMISSIONS' `
    --bigquery-dataset=DATASET `
    --bigquery-table-prefix=TABLE_PREFIX `
    --bigquery-partition-key=PARTITION_KEY `
    --bigquery-write-disposition=WRITE_DISPOSITION

Windows (cmd.exe)

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID ^
    --full-resource-name=FULL_RESOURCE_NAME ^
    --identity=PRINCIPAL ^
    --permissions='PERMISSIONS' ^
    --bigquery-dataset=DATASET ^
    --bigquery-table-prefix=TABLE_PREFIX ^
    --bigquery-partition-key=PARTITION_KEY ^
    --bigquery-write-disposition=WRITE_DISPOSITION

您應該會收到類似以下的回應:

Analyze IAM Policy in progress.
Use [gcloud asset operations describe projects/my-project/operations/AnalyzeIamPolicyLongrunning/1195028485971902504711950280359719028666] to check the status of the operation.

REST

AnalyzeIamPolicyLongrunning 方法可讓您發出分析要求,並在指定的 BigQuery 目的地中取得結果。

如要分析 IAM 允許政策並將結果匯出至 BigQuery,請使用 Cloud Asset Inventory API 的 analyzeIamPolicyLongrunning 方法。

使用任何要求資料之前,請先替換以下項目:

  • RESOURCE_TYPE:您要將搜尋範圍限制在哪種資源上。系統只會分析附加至此資源及其子項的 IAM 允許政策。請使用 projectsfoldersorganizations 值。
  • RESOURCE_ID:您要將搜尋範圍設為Google Cloud 專案、資料夾或機構的 ID。系統只會分析這項資源及其子項所附加的 IAM 允許政策。專案 ID 是英數字元字串,例如 my-project。資料夾和機構 ID 為數字,例如 123456789012
  • FULL_RESOURCE_NAME:選用。您要分析存取權的資源完整資源名稱。如需完整的資源名稱格式清單,請參閱「資源名稱格式」。
  • PRINCIPAL:選用。您要分析存取權的使用者,格式為 PRINCIPAL_TYPE:ID,例如 user:my-user@example.com。如需主要類型的完整清單,請參閱「主要識別碼」。
  • PERMISSION_1PERMISSION_2... PERMISSION_N:選填。您要檢查的權限,例如 compute.instances.get。如果您列出多個權限,政策分析工具會檢查所列的任何權限。
  • DATASET:BigQuery 資料集,格式為 projects/PROJECT_ID/datasets/DATASET_ID,其中 PROJECT_ID 是 Google Cloud 專案的英數 ID,DATASET_ID 則是資料集的 ID。
  • TABLE_PREFIX:要寫入分析結果的 BigQuery 資料表前置字元。如果沒有使用指定前置字串的資料表,BigQuery 會建立新資料表。
  • PARTITION_KEY:選用。BigQuery 分區資料表的分區鍵。Policy Analyzer 僅支援 REQUEST_TIME 分割鍵。
  • WRITE_DISPOSITION:選用。指定在目的地資料表或分區已存在的情況下,要執行的動作。如需可能值的清單,請參閱 writeDisposition。根據預設,如果資料表或分區已存在,BigQuery 會將資料附加至資料表或最新的分區。

HTTP 方法和網址:

POST https://cloudasset.googleapis.com/v1/RESOURCE_TYPE/RESOURCE_ID:analyzeIamPolicyLongrunning

JSON 要求主體:

{
  "analysisQuery": {
    "resourceSelector": {
      "fullResourceName": "FULL_RESOURCE_NAME"
    },
    "identitySelector": {
      "identity": "PRINCIPAL"
    },
    "accessSelector": {
      "permissions": [
        "PERMISSION_1",
        "PERMISSION_2",
        "PERMISSION_N"
      ]
    }
  },
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "DATASET",
      "tablePrefix": "TABLE_PREFIX",
      "partitionKey": "PARTITION_KEY",
      "writeDisposition": "WRITE_DISPOSITION"
    }
  }
}

如要傳送要求,請展開以下其中一個選項:

您應該會收到如下的 JSON 回應:

{
  "name": "projects/my-project/operations/AnalyzeIamPolicyLongrunning/1206385342502762515812063858425027606003",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.asset.v1.AnalyzeIamPolicyLongrunningMetadata",
    "createTime": "2022-04-12T21:31:10.753173929Z"
  }
}

查看 IAM 政策分析結果

如要查看 IAM 政策分析結果,請按照下列步驟操作:

主控台

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

    前往 BigQuery

  2. 如要顯示資料集中的資料表和檢視表,請開啟導覽面板。在「Explorer」區段中,選取要展開的專案,然後選取資料集。

  3. 從清單中選取含有前置字串的資料表。附有 analysis 字尾的表格包含查詢和中繼資料 (例如作業名稱、要求時間和非重要錯誤)。帶有 analysis_result 後綴的資料表是結果,列出 {identity, role(s)/permission(s), resource} 的元組,以及產生這些元組的 IAM 政策。

  4. 如要查看資料範例,請選取「Preview」分頁標籤。

API

如要瀏覽資料表的資料,請呼叫 tabledata.list。在 tableId 參數中指定資料表名稱。

您可以設定下列選用參數來控管輸出內容。

  • maxResults 是傳回的結果數上限。
  • selectedFields 是以逗號分隔的資料欄清單。如果未指定,則會傳回所有資料欄。
  • startIndex 是讀取的起始列,索引從零開始。

傳回的值會以 JSON 物件包裝,而您必須剖析這個物件,如 tabledata.list 參考說明文件所述。

查詢 BigQuery

本節提供 SQL 查詢範例,說明如何使用 AnalyzeIamPolicyLongrunning 編寫的 BigQuery 資料表。如要進一步瞭解 BigQuery 語法,請參閱「 標準 SQL 查詢語法」。

大部分查詢都需要 OP_ID,您可以從 AnalyzeIamPolicyLongrunning 回應中取得。舉例來說,在 gcloud 中,您會發現「使用 [gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456] 檢查作業狀態」中的 OP_ID123456

可列出作業

您的資料表可以儲存多個 AnalyzeIamPolicyLongrunning 作業的結果。您可以使用下列查詢列出所有項目:

SELECT DISTINCT
  requestTime,
  opName
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
ORDER BY 1 DESC
;

列出單一作業中的分析

在一個 AnalyzeIamPolicyLongrunning 作業中,可能會產生多個分析記錄。舉例來說,如果您在要求中啟用 analyze_service_account_impersonation 選項,結果可能會包含一個主要分析 (analysisId 0) 和多個服務帳戶冒用分析。

您可以使用以下查詢,透過提供作業名稱來查看所有分析。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisId,
  requestTime,
  TO_JSON_STRING(analysis.analysisQuery, true) as analysisQuery,
  analysis.fullyExplored,
  TO_JSON_STRING(analysis.nonCriticalErrors, true) as nonCriticalErrors
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
WHERE opName=_opName
ORDER BY 1
;

在一個分析中列出 ACE(存取控制項目)

ACE 是存取控管項目 {identity, role(s)/permission(s), resource}。您可以使用下列查詢,在單一分析中列出 ACE。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName
AND analysisId = 0
ORDER BY 1,2,3,4
;

在單一分析中列出與 IAM 政策繫結的 ACE(存取控制項目)

在這個查詢中,我們會列出 ACE 和 IAM 政策繫結,這些項目會為單一分析產生這個 ACE。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission,
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2,3,4
;

在單一分析中列出身分與存取權管理政策繫結

在這項查詢中,我們會列出在某項分析中出現的 IAM 政策繫結。

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`
WHERE opName=_opName AND analysisId = 0
ORDER BY 1, 2
;

在單一分析中列出包含 ACE(存取權控管項目) 的 IAM 政策繫結

在這個查詢中,我們會在單一分析中列出 IAM 政策繫結與衍生出的 ACE

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding,
  TO_JSON_STRING(analysisResult.identityList.identities, true) as identities,
  TO_JSON_STRING(acls.accesses, true) as accesses,
  TO_JSON_STRING(acls.resources, true) as resources
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.accessControlLists) AS acls
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2
;