將政策分析結果寫入 BigQuery

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

事前準備

啟用 Cloud Asset API。

啟用 API 時所需的角色

如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

啟用 API

您必須在用於傳送查詢的專案中啟用 API。這不一定要是您查詢範圍內的資源。

必要角色和權限

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

必要的 IAM 角色

如要取得分析政策並將結果匯出至 BigQuery 所需的權限,請要求系統管理員在您要將查詢範圍設為的專案、資料夾或組織中,授予您下列 IAM 角色:

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

這些預先定義的角色具備分析政策,以及將結果匯出至 BigQuery 所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要分析政策並將結果匯出至 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.readGoogle Workspace 權限。「群組讀者管理員」角色,以及「群組管理員」或「超級管理員」等更強大的角色,都具備這項權限。詳情請參閱「指派特定管理員角色」。

分析政策並匯出結果

控制台

  1. 前往 Google Cloud 控制台的「政策分析工具」頁面。

    前往政策分析工具

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

  3. 在「Select query scope」(選取查詢範圍) 欄位中,選取要將查詢範圍限定於其中的專案、資料夾或機構。政策分析工具會分析該專案、資料夾或機構的存取權,以及該專案、資料夾或機構中的任何資源。

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

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

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

  5. 在標示查詢名稱的窗格中,依序點選「分析」> 僅匯出結果。「匯出結果」窗格隨即開啟。

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

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

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

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

政策分析工具會執行查詢,並將結果匯出至指定資料表。

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。如需主體類型的完整清單,請參閱「主體 ID」。
  • PERMISSIONS:以逗號分隔的權限清單,您要檢查這些權限,例如 compute.instances.get,compute.instances.start。如果您列出多項權限,政策分析工具會檢查是否列出任何權限。
  • DATASET:BigQuery 資料集,格式為 projects/PROJECT_ID/datasets/DATASET_ID,其中 PROJECT_ID 是專案的英數 ID, Google Cloud DATASET_ID 是資料集的 ID。
  • TABLE_PREFIX:分析結果將寫入的 BigQuery 資料表前置字元。如果沒有指定前置字串的資料表,BigQuery 會建立新資料表。
  • PARTITION_KEY:選用。BigQuery 分區資料表的分區鍵。政策分析工具僅支援 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。如需主體類型的完整清單,請參閱「主體 ID」。
  • PERMISSION_1PERMISSION_2... PERMISSION_N:選用。您要檢查的權限,例如 compute.instances.get。如果您列出多項權限,政策分析工具會檢查是否列出任何權限。
  • DATASET:BigQuery 資料集,格式為 projects/PROJECT_ID/datasets/DATASET_ID,其中 PROJECT_ID 是專案的英數 ID, Google Cloud DATASET_ID 是資料集的 ID。
  • TABLE_PREFIX:分析結果將寫入的 BigQuery 資料表前置字元。如果沒有指定前置字串的資料表,BigQuery 會建立新資料表。
  • PARTITION_KEY:選用。BigQuery 分區資料表的分區鍵。政策分析工具僅支援 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. 如要查看資料樣本集,請選取「預覽」分頁標籤。

API

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

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

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

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

查詢 BigQuery

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

OP_ID 是大多數查詢的必要條件,您可以從 AnalyzeIamPolicyLongrunning 回應中取得。舉例來說,在 gcloud 中,您會發現 OP_ID123456, 「Use [gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456] to check the status of the operation.」

可列出作業

資料表可能會儲存多個 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 和產生這個 ACE 的 IAM 政策繫結,以供分析。

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 政策繫結

在這項查詢中,我們會列出一次分析中出現的 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
;