本頁說明如何以非同步方式分析 Identity and Access Management (IAM) 政策,並將分析結果寫入 BigQuery。這個程序與分析 IAM 政策類似,但分析結果會寫入 BigQuery 資料表。
事前準備
啟用 Cloud Asset API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色。
您必須在用於傳送查詢的專案中啟用 API。這不一定要是您查詢範圍內的資源。
必要角色和權限
您必須具備下列角色和權限,才能執行政策分析,並將結果匯出至 BigQuery。
必要的 IAM 角色
如要取得分析政策並將結果匯出至 BigQuery 所需的權限,請要求系統管理員在您要將查詢範圍設為的專案、資料夾或組織中,授予您下列 IAM 角色:
- BigQuery 資料編輯者 (
roles/bigquery.dataEditor) - Cloud Asset Viewer (
roles/cloudasset.viewer) -
如要使用自訂 IAM 角色分析政策,請使用角色檢視器 (
roles/iam.roleViewer)。 -
如要使用 Google Cloud CLI 分析政策,請執行下列步驟:
服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這些預先定義的角色具備分析政策,以及將結果匯出至 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 權限。「群組讀者管理員」角色,以及「群組管理員」或「超級管理員」等更強大的角色,都具備這項權限。詳情請參閱「指派特定管理員角色」。
分析政策並匯出結果
控制台
前往 Google Cloud 控制台的「政策分析工具」頁面。
在「分析政策」部分中,找出要使用的查詢範本,然後點選「建立查詢」。如要建立自訂查詢,請按一下「建立自訂查詢」。
在「Select query scope」(選取查詢範圍) 欄位中,選取要將查詢範圍限定於其中的專案、資料夾或機構。政策分析工具會分析該專案、資料夾或機構的存取權,以及該專案、資料夾或機構中的任何資源。
確認已設定查詢參數:
- 如果使用查詢範本,請確認預填的查詢參數。
- 如要建立自訂查詢,請設定要查詢的資源、主體、角色和權限。
如要進一步瞭解可建立的查詢類型,請參閱「分析 IAM 政策」。
在標示查詢名稱的窗格中,依序點選「分析」> 僅匯出結果。「匯出結果」窗格隨即開啟。
在「設定匯出目的地」部分,輸入下列資訊:
- 專案:BigQuery 資料集所在的專案。
- 資料集:要將結果匯出至其中的 BigQuery 資料集。
- 資料表:分析結果寫入的 BigQuery 資料表前置字串。如果沒有指定前置字串的資料表,BigQuery 會建立新資料表。
按一下「繼續」。
選用:在「設定其他設定」部分,選取所需選項:
- 分區:是否要將資料表分區。如要進一步瞭解分區資料表,請參閱分區資料表簡介。
- 寫入偏好設定:指定目的地資料表或分區已存在時要執行的動作。根據預設,如果資料表或分區已存在,BigQuery 會將資料附加至資料表或最新分區。
按一下 [匯出]。
政策分析工具會執行查詢,並將結果匯出至指定資料表。
gcloud
您可以使用 AnalyzeIamPolicyLongrunning 方法發出分析要求,並在指定的 BigQuery 目的地取得結果。
使用下列任何指令資料之前,請先替換以下項目:
RESOURCE_TYPE:要將搜尋範圍限定於的資源類型。系統只會分析附加至這個資源及其後代的 IAM 允許政策。請使用project、folder或organization值。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 CloudDATASET_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 允許政策。請使用projects、folders或organizations值。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_1、PERMISSION_2...PERMISSION_N:選用。您要檢查的權限,例如compute.instances.get。如果您列出多項權限,政策分析工具會檢查是否列出任何權限。DATASET:BigQuery 資料集,格式為projects/PROJECT_ID/datasets/DATASET_ID,其中PROJECT_ID是專案的英數 ID, Google CloudDATASET_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 政策分析結果,請按照下列步驟操作:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
如要顯示資料集中的資料表和檢視表,請開啟導覽面板。 在「Explorer」部分中,選取專案並展開,然後選取資料集。
從清單中選取含有前置字元的資料表。含有
analysis後置字串的資料表包含查詢和中繼資料 (例如作業名稱、要求時間和非重大錯誤)。帶有analysis_result後置字串的表格會列出{identity, role(s)/permission(s), resource}的元組,以及產生這些元組的 IAM 政策。如要查看資料樣本集,請選取「預覽」分頁標籤。
API
如要瀏覽資料表中的資料,請呼叫 tabledata.list。在 tableId 參數中指定資料表名稱。
您可以設定下列選用參數來控管輸出。
maxResults是要傳回的結果數上限。selectedFields是以逗號分隔的資料欄清單,如果未指定,則會傳回所有資料欄。startIndex是讀取的起始列,索引從零開始。
傳回的值會以 JSON 物件包裝,而您必須剖析這個物件,如 tabledata.list 參考文件所述。
查詢 BigQuery
本節提供 SQL 查詢範例,說明如何使用 AnalyzeIamPolicyLongrunning 寫入的 BigQuery 資料表。如要進一步瞭解 BigQuery 語法,請參閱「標準 SQL 查詢語法」。
OP_ID 是大多數查詢的必要條件,您可以從
AnalyzeIamPolicyLongrunning
回應中取得。舉例來說,在 gcloud 中,您會發現 OP_ID 是 123456,
「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 ;