使用嚴格的「充當」模式

嚴格的「以…身分執行」模式會對 Dataform 中的下列使用者動作進行額外安全檢查:

  • 建立或更新存放區
  • 建立或更新工作流程設定
  • 建立工作流程調用
  • 更新版本設定

這項額外的安全檢查會要求執行這些動作的使用者,對有效服務帳戶 (即用於執行工作流程的服務帳戶) 具有 iam.serviceAccounts.actAs 權限。詳情請參閱「將服務帳戶附加至資源」。

您可以透過下列方式啟用這些權限:

  • 建立存放區
  • 使用 strict_act_as_checks 存放區旗標更新現有存放區

必要的角色

如要取得完成本文工作所需的權限,請要求管理員授予您下列 IAM 角色:

  • 服務帳戶使用者 (roles/iam.serviceAccountUser) 自訂服務帳戶
  • 在 Logging 中查看記錄: 專案中的「記錄檢視器」 (roles/logging.viewer)
  • 將 IAM 角色授予使用者或服務帳戶: 專案的服務帳戶管理員 (roles/iam.serviceAccountAdmin)

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

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

驗證有效服務帳戶的 act-as 權限

為確保 Dataform 工作流程安全無虞地執行,且不會中斷,請務必驗證工作流程所用服務帳戶的「以服務帳戶身分執行」權限。本節說明如何找出資源的有效服務帳戶、使用 Cloud Logging 檢查權限問題,然後解決發現的任何問題。

判斷有效服務帳戶

您可以根據資源類型和下列條件,判斷執行工作流程的有效服務帳戶:

資源類型 有效服務帳戶
存放區

如果您在建立存放區時選取自訂服務帳戶,系統就會使用 Repository.ServiceAccount 服務帳戶。

否則預設為 Dataform 服務代理

工作流程設定

您可以在建立工作流程設定時選取自訂服務帳戶。

否則,系統會預設為存放區的 Dataform 服務代理程式

工作流程叫用

如果編譯結果為 WORKFLOW_CONFIG,系統會使用工作流程設定的有效服務帳戶。

如果您從編譯結果建立工作流程叫用,系統會使用 WorkflowInvocation.InvocationConfig 服務帳戶 (如有設定)。

否則,系統會預設為存放區的 Dataform 服務代理程式

在 Cloud Logging 中檢查權限問題

為提升安全性,Dataform 會檢查 Dataform 資源使用的服務帳戶是否缺少 iam.serviceAccounts.actAs 權限。

這些檢查的結果 (包括任何潛在的權限問題) 都會記錄在 Cloud Logging 中。建議您定期查看這些記錄,找出並授予任何缺少的 iam.serviceAccounts.actAs 權限。檢查這些記錄檔可確保 Dataform 工作流程和設定持續運作,不會中斷。

在 Cloud Logging 查看記錄

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

    前往 Logs Explorer

  2. 選取要查看記錄的 Google Cloud 專案。

  3. 使用查詢編輯器,透過下列選項篩選 Dataform actAs 記錄:

    • 如要只列出失敗且需要採取行動的 actAs 檢查,請使用下列查詢:

      logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
      jsonPayload.dryRunResult = false
      
    • 如要列出所有 actAs 檢查,請使用下列查詢:

      logName: "projects/PROJECT_ID/logs/dataform.googleapis.com%2Factas_dry_run_result"
      

    PROJECT_ID 替換為您的Google Cloud 專案 ID。

  4. 點選「執行查詢」

解讀記錄項目

展開查詢結果中的記錄項目,即可查看下列jsonPayload欄位:

欄位 類型 說明
dryRunResult 布林值 true:權限檢查通過。

false:檢查失敗。呼叫端主體缺少服務帳戶的 iam.serviceAccounts.actAs 權限。
caller 字串 發起 API 呼叫的主體 (使用者或服務帳戶) 電子郵件地址。
serviceAccount 字串 呼叫者主體嘗試模擬的服務帳戶。如果 dryRunResult 欄位為 false,通常會出現這個欄位。
apiMethod 字串 觸發檢查的 Dataform API 方法,例如 CreateWorkflowInvocationUpdateRepository
*_context 物件 這個物件包含與所呼叫 API 方法相關的資源名稱。詳情請參閱「情境物件」。
背景資訊物件

記錄項目包含 jsonPayload 欄位中的內容物件。這個物件中的欄位包含所涉 Dataform 實體的完整 Google Cloud 資源名稱。這些名稱遵循下列清單所示的標準結構,可讓您精確識別資源。

  • create_workflow_invocation_context:API 方法為 CreateWorkflowInvocation 時會顯示。

    • workflowInvocation:工作流程調用的資源名稱。
      • 資源名稱的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowInvocations/WORKFLOW_INVOCATION_ID
    • compilationResultworkflowConfig:用於呼叫的來源資源名稱。
      • compilationResult 的資源名稱格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/compilationResults/COMPILATION_RESULT_ID
      • workflowConfig 的資源名稱格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_ID
  • create_repository_contextupdate_repository_context:當 API 方法為 CreateRepositoryUpdateRepository 時,必須提供這項資訊。

    • repository:Dataform 存放區的資源名稱。
      • 資源名稱的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID
  • update_release_config_context:API 方法為 UpdateReleaseConfig 時會顯示。

    • releaseConfig:發布設定的資源名稱。
      • 資源名稱的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/releaseConfigs/RELEASE_CONFIG_ID
  • create_workflow_config_contextupdate_workflow_config_context:當 API 方法為 CreateWorkflowConfigUpdateWorkflowConfig 時,會顯示此欄位。

    • workflowConfig:工作流程設定的資源名稱。
      • 資源名稱的格式如下: projects/PROJECT_ID/locations/LOCATION_ID/repositories/REPOSITORY_ID/workflowConfigs/WORKFLOW_CONFIG_ID

如要比較記錄的格式與記錄項目,請替換下列項目:

  • PROJECT_ID:Google Cloud 專案的專屬 ID。
  • LOCATION_ID:Dataform 存放區所在的區域。
  • REPOSITORY_ID:使用者定義的 Dataform 存放區 ID。這是建立存放區時所用的名稱。
  • COMPILATION_RESULT_ID:系統為 Dataform 編譯結果產生的專屬 ID。
  • RELEASE_CONFIG_ID:使用者定義的 Dataform 發布版本設定 ID。
  • WORKFLOW_CONFIG_ID:使用者定義的 Dataform 工作流程設定 ID。

解決權限問題

如果發現 dryRunResult 欄位為 false 的記錄項目,請執行下列操作:

  1. jsonPayload 詳細資料中,記下 caller 欄位中的電子郵件地址,以識別主體。

  2. 請記下「serviceAccount」欄位中的電子郵件地址,以識別服務帳戶。

  3. 確認呼叫端主體具備以服務帳戶身分執行的權限。授予這項權限後,呼叫者就能使用服務帳戶擁有的權限。

  4. 如果存取要求是預期行為,請將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予目標服務帳戶的呼叫端主體。詳情請參閱「授予服務帳戶使用者 IAM 角色」一文。

授予角色後,這個呼叫端和服務帳戶組合的未來記錄檔應會顯示 dryRunResult: true

授予服務帳戶使用者 IAM 角色

服務帳戶使用者角色 (roles/iam.serviceAccountUser) 包含 iam.serviceAccounts.actAs 權限,這是嚴格的「以服務帳戶身分執行動作」模式的必要權限。使用 Dataform API 時,您必須根據所呼叫的 projects.locations.repositories 方法,為有效服務帳戶授予服務帳戶使用者角色:

  • createpatch
    • 如果設定 Repository.ServiceAccount 屬性,您應該已獲得該屬性的服務帳戶使用者角色。
    • 如果您要呼叫 patch 方法,則應為存放區中所有工作流程設定的所有有效服務帳戶,授予服務帳戶使用者角色。
  • workflowConfigs.createworkflowConfigs.patch
    • 您應為工作流程設定中使用的有效服務帳戶授予服務帳戶使用者角色。
  • releaseConfigs.patch
    • 您應為工作流程設定中使用的所有有效服務帳戶,授予服務帳戶使用者角色,並使用這個發布設定。
  • workflowInvocations.create
    • 您應為工作流程叫用時使用的有效服務帳戶授予服務帳戶使用者角色。

如要將服務帳戶使用者角色授予自訂服務帳戶,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,依序前往「IAM」>「Service accounts」(服務帳戶)

    前往「Service accounts」(服務帳戶)

  2. 選取專案。

  3. 在「專案『PROJECT_NAME』的服務帳戶」頁面,選取自訂服務帳戶。

  4. 前往「具備存取權的主體」,然後點選「授予存取權」

  5. 在「新增主體」欄位中,輸入預設的 Dataform 服務代理程式 ID。

    預設 Dataform 服務代理程式 ID 的格式如下:

    service-PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
    
  6. 在「Select a role」(選取角色) 清單中,選取「Service Account User」(服務帳戶使用者) 角色。

  7. 按一下 [儲存]

詳情請參閱「建立工作流程設定的必要角色」和「建立發布設定的必要角色」。

嚴格 act-as 模式對自動發布和執行的影響

啟用嚴格 act-as 模式後,系統會按照下列方式影響自動存放區發布和自動工作流程執行作業:

如果存放區連結至第三方存放區:

  • 您無法在發布設定中,為自動發布設定 Cron 時間表。強制執行這項限制,可防止系統自動部署使用者所做的程式碼變更,因為使用者可能沒有下游服務帳戶的必要 iam.serviceAccounts.actAs 權限。
  • 使用工作流程設定中的 Cron 時間表排定工作流程執行時間的功能仍可使用。如要讓這些自動執行作業順利完成,您必須在工作流程設定中指定的有效服務帳戶上,授予預設的 Dataform 服務代理程式 iam.serviceAccounts.actAs 權限。

如果存放區連結至第三方存放區:

  • 允許排定發布時間和工作流程執行時間。
  • 如要從發布設定啟用自動發布功能,或從工作流程設定啟用自動執行功能,您必須在相關有效服務帳戶中,授予預設 Dataform 服務代理程式 iam.serviceAccounts.actAs 權限:
    • 如果是自動發布設定,請在所有由這項發布設定觸發的工作流程設定的有效服務帳戶上,授予權限。
    • 如要自動設定工作流程,請授予該工作流程設定所用有效服務帳戶的權限。

後續步驟

  • 如要瞭解如何建立存放區,請參閱「建立存放區」。
  • 如要進一步瞭解 Dataform 如何與 BigQuery 搭配運作,請參閱「工作流程總覽」。
  • 如要瞭解如何建立工作流程設定,請參閱「排定執行時間」。
  • 如要瞭解如何建立發布設定,請參閱「設定編譯」。