使用 IAM 控管存取權

本文說明如何在 Dataform 執行下列操作:

事前準備

    In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

    Verify that billing is enabled for your Google Cloud project.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

授予 Dataform 必要存取權

本節說明如何授予 Identity and Access Management (IAM) 角色,讓 Dataform 服務代理和自訂服務帳戶在 BigQuery 執行工作流程。

關於自訂服務帳戶和 Dataform 服務代理

您可以透過下列方式,設定自訂服務帳戶來代您執行工作流程:

  • 在存放區層級,執行特定存放區中的所有工作流程。
  • 個別設定每個工作流程。

建立 Dataform 存放區或工作流程設定時,您可以選取任何具備「扮演」權限的服務帳戶。您必須為與 Dataform 資源相關聯的所有服務帳戶,設定必要的「以身分執行」權限。

建立第一個 Dataform 存放區時,Dataform 會自動產生服務代理。Dataform 會使用服務代理,代表您與 BigQuery 互動。

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

service-PROJECT_NUMBER@gcp-sa-dataform.

將 PROJECT_NUMBER 替換為Google Cloud 專案的數字 ID。您可以在Google Cloud 控制台資訊主頁中找到 Google Cloud 專案 ID。詳情請參閱「尋找專案名稱、編號和 ID」。

Dataform 服務代理、自訂服務帳戶和 Google 帳戶的必要角色

Dataform 服務代理、自訂服務帳戶,以及用於在 Dataform 中驗證的 Google 帳戶使用者憑證,必須具備下列 BigQuery IAM 角色,才能在 BigQuery 中執行工作流程:

此外,請將下列角色授予 Dataform 服務代理,用於工作流程設定的有效服務帳戶。必須具備這些角色,嚴格「以身分執行」模式才能運作。

如要自動發布存放區及執行工作流程,請將有效服務帳戶的 iam.serviceAccounts.actAs 權限授予 Dataform 服務代理。

如要在 Knowledge Catalog 啟用中繼資料擴充功能,以及資料品質評量表整合功能,請將專案或 @bigquery 項目群組的 Dataplex Catalog 編輯者 (roles/dataplex.catalogEditor) 角色,授予用於執行工作流程的自訂服務帳戶或 Google 帳戶。

安全性考量

將 Dataform 所需角色授予 Dataform 服務代理、自訂服務帳戶或使用者的 Google 帳戶時,請考量下列安全性事項:

  • 任何自訂服務帳戶只要具備必要角色,無論是否使用 VPC Service Controls,都可能存取該服務帳戶所屬專案中的 BigQuery、Secret Manager 或 Knowledge Catalog。Dataform 使用自訂服務帳戶執行工作流程時,Dataform 要求會視為來自存放區所在專案的 VPC Service Controls perimeter 內部。因此,如果 Dataform 和其他服務 (例如 BigQuery、Secret Manager 或 Knowledge Catalog) 位於相同的 service perimeter,VPC Service Controls 不會封鎖兩者之間的通訊。

    如要進一步瞭解如何管理這些安全邊界,請參閱「設定 VPC Service Controls」。

  • 任何具備 dataform.repositories.create IAM 權限的使用者,都能使用 Dataform 服務代理,以及授予該服務代理或服務帳戶的所有權限,執行程式碼。

    詳情請參閱「Dataform 權限的安全性考量」。

  • 為維護安全的權限模型,請定期稽核 Dataform 服務代理人角色繫結。如需詳細的監控操作說明,請參閱「使用 Security Command Center 監控服務代理權限」。

如要限制使用者、服務代理或服務帳戶在 BigQuery 中可讀取或寫入的資料,您可以將精細的 BigQuery IAM 權限授予所選 BigQuery 資料集或資料表。詳情請參閱「控管資料集的存取權」和「控管資料表和檢視表的存取權」。

為防止使用者在操作時,使用其他使用者的 Google 帳戶憑證,系統會強制執行下列限制:

  • 如要修改附加其他 Google 帳戶使用者憑證的工作流程設定,您必須將自己 Google 帳戶的使用者憑證附加至工作流程設定,或變更工作流程設定,以便使用自訂服務帳戶進行驗證。
  • 如果參照版本設定的工作流程設定,附加了其他 Google 帳戶使用者的憑證,您就無法修改版本設定的編譯結果。
  • 您無法將工作流程設定設為使用 Google 帳戶使用者憑證進行驗證,並參照具有排程的版本設定。這項限制會造成下列影響:

    • 如果發布設定參照的工作流程設定,設為使用 Google 帳戶使用者憑證進行驗證,則無法更新發布設定來使用排程。
    • 您無法建立工作流程設定,使用 Google 帳戶使用者憑證進行驗證,並指向具有排程的發布設定。
    • 您無法建立或更新工作流程設定,以使用 Google 帳戶使用者憑證,並指向具有排程的發布設定。
  • 如要禁止使用 Google 帳戶使用者憑證,組織管理員可以建立自訂組織政策限制,拒絕設定 end_user_auth_config。詳情請參閱「建立自訂組織政策限制」。

授予必要的 BigQuery 角色

如要將必要的 BigQuery IAM 角色授予 Dataform 服務代理、要在 Dataform 中使用的自訂服務帳戶,或要在 Dataform 中用於驗證的使用者 Google 帳戶,請按照下列步驟操作:

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

    前往 Dataform

  2. 選取或建立存放區。

  3. 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。

    前往「IAM」(身分與存取權管理) 頁面

  4. 點選「授予存取權」。

  5. 在「New principals」(新增主體) 欄位中,輸入服務代理 ID、服務帳戶 ID 或使用者的 Google 帳戶電子郵件。

  6. 在「請選擇角色」清單中,選取「BigQuery 工作使用者」角色。

  7. 點選「新增其他角色」,然後在「請選擇角色」清單中,選取「BigQuery 資料編輯者」角色。

  8. 點選「新增其他角色」,然後在「請選擇角色」清單中,選取「BigQuery 資料檢視者」角色。

  9. 按一下「儲存」。

授予自動化工作流程所需的角色

如要在 Dataform 使用自訂服務帳戶,Dataform 服務代理必須能存取自訂服務帳戶。這樣一來,Dataform 就能使用自訂服務帳戶 (而非服務代理帳戶) 定義的權限,執行工作流程。

如要授予這項存取權,您必須將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予 Dataform 服務代理,做為主體。這樣一來,Dataform 服務代理就能建立稱為權杖的短期憑證,模擬服務帳戶。Dataform 必須取得這些權杖,才能使用自訂服務帳戶的身分執行工作流程。

您也需要將服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Dataform 服務代理。這樣一來,Dataform 服務代理就能為自訂服務帳戶執行的工作流程設定,啟動新的自動工作流程執行作業。

如要將自訂服務帳戶的存取權授予 Dataform 服務代理,請按照下列步驟操作:

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

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

  2. 選取自訂服務帳戶所在的 Google Cloud 專案。

  3. 在 「Service accounts for project ""」(專案「PROJECT_NAME」的服務帳戶) 頁面中,選取自訂服務帳戶。

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

  5. 在「新增主體」欄位輸入 Dataform 服務代理 ID。

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

    service-PROJECT_NUMBER@gcp-sa-dataform.
    
  6. 在「Select a role」(選取角色) 清單中,選取「Service Account Token Creator」(服務帳戶權杖建立者) 角色和「Service Account User」(服務帳戶使用者) 角色。

  7. 按一下「儲存」。

現在可以在 Dataform 存放區中設定自訂服務帳戶。

稽核服務帳戶設定

本節說明如何稽核 Dataform 資源,確保服務帳戶使用方式和權限授予正確無誤。使用自訂服務帳戶時,稽核尤其重要,因為 Dataform 服務代理需要特定權限才能運作。

如果 Dataform 存放區或工作流程設定使用自訂服務帳戶,請務必確認 Dataform 服務代理在自訂服務帳戶上具備服務帳戶使用者角色 (roles/iam.serviceAccountUser)。這個角色會授予 iam.serviceAccounts.actAs 權限,讓 Dataform 服務代理啟動的排定執行作業,能模擬自訂服務帳戶。此外,請確認 Dataform 服務代理在有效服務帳戶上,具備服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator)。

驗證存放區服務帳戶

首先,請找出 Dataform 自行排程和執行作業範圍內的 dataform.Repository 資產。接著,請確認這些範圍內存放區的服務帳戶設定。

  1. 使用 Cloud Asset Inventory 列出 dataform.Repository 類型的所有資源。詳情請參閱「查看資產」。

  2. 針對 Cloud Asset Inventory 輸出內容中的每個存放區,請檢查 resource.data.labels 欄位,判斷是否在範圍內。確切路徑可能會因匯出格式而略有不同。

  3. 檢查標籤對應中的 single-file-asset-type 鍵,找出範圍外的存放區。如果出現這個金鑰,表示 BigQuery 功能正在使用該存放區。如果值為 sql 或 data_canvas,則可將存放區排除在服務帳戶權限檢查之外。

    其餘缺少這個金鑰或這些值的存放區,則在服務帳戶權限檢查的範圍內。

  4. 針對每個範圍內的存放區,檢查 Cloud Asset Inventory 輸出內容中的 resource.data.serviceAccount 欄位,判斷是否已設定自訂服務帳戶:

    • 如果 resource.data.serviceAccount 欄位存在,且值與專案的 Dataform 服務代理電子郵件地址不同,則存放區會使用自訂服務帳戶。
    • 如果沒有 resource.data.serviceAccount 欄位,或欄位值與專案的 Dataform 服務代理相符,存放區就會使用服務代理。

  5. 如果使用自訂服務帳戶,請確認 Dataform 服務代理在該自訂服務帳戶上,同時具備服務帳戶使用者角色 (roles/iam.serviceAccountUser) 和服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator)。

驗證工作流程設定服務帳戶

為 Dataform 工作流程設定使用專屬的自訂服務帳戶,是符合最小權限原則的安全最佳做法。

如要驗證 dataform.WorkflowConfig resources 的服務帳戶用量,請按照下列步驟操作:

  1. 使用 Cloud Asset Inventory 列出 dataform.WorkflowConfig 類型的所有資源。

  2. 針對每項工作流程設定,檢查 Cloud Asset Inventory 輸出內容,判斷有效的服務帳戶:

    • 如果 resource.data.serviceAccount 欄位存在,這個值就是工作流程設定中明確設定的服務帳戶電子郵件地址。
    • 如果沒有 resource.data.serviceAccount 欄位,工作流程設定會沿用上層存放區的服務帳戶。請查看上層存放區的設定,找出有效的服務帳戶。
  3. 比較有效服務帳戶的電子郵件地址,與專案 Dataform 服務代理的電子郵件地址,判斷是否使用自訂服務帳戶。如果兩者不同,代表您使用的是自訂服務帳戶。

  4. 如果使用自訂服務帳戶,請確認 Dataform 服務代理在該自訂服務帳戶上,同時具備服務帳戶使用者角色 (roles/iam.serviceAccountUser) 和服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator)。Dataform 服務代理有了這些權限,就能模擬自訂服務帳戶,啟動工作流程執行作業。

使用 Security Command Center 監控服務代理權限

為確保持續遵循最小權限原則,請在 Security Command Center 主動監控專案,找出與權限過高的服務帳戶和服務代理相關的發現項目。

如要瞭解如何在 Security Command Center 查看及套用修復發現項目,請參閱「IAM 建議工具發現項目」和「在控制台中調查身分發現項目」。

修復 Dataform 服務代理的 SERVICE_AGENT_GRANTED_BASIC_ROLE 發現項目時,請將權限過高的角色替換為預先定義的角色,並授予特定資源的最低必要權限。例如,在特定服務帳戶上授予服務帳戶使用者角色 (roles/iam.serviceAccountUser)。

使用 IAM 控管 Dataform 存取權

本節說明 Dataform 的存取控管選項,以及如何查看和授予 Dataform 角色。Dataform 使用 Identity and Access Management (IAM) 控管存取權。如要進一步瞭解 IAM 中的角色和權限,請參閱「IAM 角色和權限索引」。

預先定義的 Dataform 角色

下表列出可存取 Dataform 資源的預先定義角色:

Role Permissions

(roles/dataform.admin)

Full access to all Dataform resources.

dataform.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update
  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update
  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query
  • dataform.config.get
  • dataform.config.update
  • dataform.folders.addContents
  • dataform.folders.create
  • dataform.folders.delete
  • dataform.folders.deleteTree
  • dataform.folders.get
  • dataform.folders.getIamPolicy
  • dataform.folders.move
  • dataform.folders.queryContents
  • dataform.folders.setIamPolicy
  • dataform.folders.update
  • dataform.locations.get
  • dataform.locations.list
  • dataform.operations.cancel
  • dataform.operations.delete
  • dataform.operations.get
  • dataform.operations.list
  • dataform.releaseConfigs.create
  • dataform.releaseConfigs.delete
  • dataform.releaseConfigs.get
  • dataform.releaseConfigs.list
  • dataform.releaseConfigs.update
  • dataform.repositories.commit
  • dataform.repositories.computeAccessTokenStatus
  • dataform.repositories.create
  • dataform.repositories.createTagBinding
  • dataform.repositories.delete
  • dataform.repositories.deleteTagBinding
  • dataform.repositories.fetchHistory
  • dataform.repositories.fetchRemoteBranches
  • dataform.repositories.get
  • dataform.repositories.getIamPolicy
  • dataform.repositories.list
  • dataform.repositories.listEffectiveTags
  • dataform.repositories.listTagBindings
  • dataform.repositories.move
  • dataform.repositories.queryDirectoryContents
  • dataform.repositories.readFile
  • dataform.repositories.scheduleRelease
  • dataform.repositories.scheduleWorkflow
  • dataform.repositories.setIamPolicy
  • dataform.repositories.update
  • dataform.teamFolders.create
  • dataform.teamFolders.delete
  • dataform.teamFolders.deleteTree
  • dataform.teamFolders.get
  • dataform.teamFolders.getIamPolicy
  • dataform.teamFolders.setIamPolicy
  • dataform.teamFolders.update
  • dataform.workflowConfigs.create
  • dataform.workflowConfigs.delete
  • dataform.workflowConfigs.get
  • dataform.workflowConfigs.list
  • dataform.workflowConfigs.update
  • dataform.workflowInvocations.cancel
  • dataform.workflowInvocations.create
  • dataform.workflowInvocations.delete
  • dataform.workflowInvocations.get
  • dataform.workflowInvocations.list
  • dataform.workflowInvocations.query
  • dataform.workspaces.commit
  • dataform.workspaces.create
  • dataform.workspaces.delete
  • dataform.workspaces.fetchFileDiff
  • dataform.workspaces.fetchFileGitStatuses
  • dataform.workspaces.fetchGitAheadBehind
  • dataform.workspaces.get
  • dataform.workspaces.getIamPolicy
  • dataform.workspaces.installNpmPackages
  • dataform.workspaces.list
  • dataform.workspaces.makeDirectory
  • dataform.workspaces.moveDirectory
  • dataform.workspaces.moveFile
  • dataform.workspaces.pull
  • dataform.workspaces.push
  • dataform.workspaces.queryDirectoryContents
  • dataform.workspaces.readFile
  • dataform.workspaces.removeDirectory
  • dataform.workspaces.removeFile
  • dataform.workspaces.reset
  • dataform.workspaces.searchFiles
  • dataform.workspaces.setIamPolicy
  • dataform.workspaces.writeFile

developerconnect.connections.constructGitHubAppManifest

developerconnect.connections.create

developerconnect.connections.delete

developerconnect.connections.fetchGitHubInstallations

developerconnect.connections.fetchLinkableGitRepositories

developerconnect.connections.generateGitHubStateToken

developerconnect.connections.get

developerconnect.connections.list

developerconnect.connections.processGitHubAppCreationCallback

developerconnect.connections.processGitHubOAuthCallback

developerconnect.connections.update

developerconnect.gitRepositoryLinks.create

developerconnect.gitRepositoryLinks.delete

developerconnect.gitRepositoryLinks.fetchGitRefs

developerconnect.gitRepositoryLinks.fetchReadToken

developerconnect.gitRepositoryLinks.fetchReadWriteToken

developerconnect.gitRepositoryLinks.get

developerconnect.gitRepositoryLinks.gitProxyRead

developerconnect.gitRepositoryLinks.gitProxyWrite

developerconnect.gitRepositoryLinks.list

developerconnect.locations.*

  • developerconnect.locations.get
  • developerconnect.locations.list

developerconnect.operations.*

  • developerconnect.operations.cancel
  • developerconnect.operations.delete
  • developerconnect.operations.get
  • developerconnect.operations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.editor)

Edit access to Workspaces and Repositories.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.config.*

  • dataform.config.get
  • dataform.config.update

dataform.folders.addContents

dataform.folders.create

dataform.folders.delete

dataform.folders.deleteTree

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.move

dataform.folders.queryContents

dataform.folders.update

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.*

  • dataform.operations.cancel
  • dataform.operations.delete
  • dataform.operations.get
  • dataform.operations.list

dataform.releaseConfigs.*

  • dataform.releaseConfigs.create
  • dataform.releaseConfigs.delete
  • dataform.releaseConfigs.get
  • dataform.releaseConfigs.list
  • dataform.releaseConfigs.update

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.delete

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.move

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.repositories.scheduleRelease

dataform.repositories.scheduleWorkflow

dataform.repositories.update

dataform.teamFolders.create

dataform.teamFolders.delete

dataform.teamFolders.deleteTree

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.teamFolders.update

dataform.workflowConfigs.*

  • dataform.workflowConfigs.create
  • dataform.workflowConfigs.delete
  • dataform.workflowConfigs.get
  • dataform.workflowConfigs.list
  • dataform.workflowConfigs.update

dataform.workflowInvocations.*

  • dataform.workflowInvocations.cancel
  • dataform.workflowInvocations.create
  • dataform.workflowInvocations.delete
  • dataform.workflowInvocations.get
  • dataform.workflowInvocations.list
  • dataform.workflowInvocations.query

dataform.workspaces.commit

dataform.workspaces.create

dataform.workspaces.delete

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.installNpmPackages

dataform.workspaces.list

dataform.workspaces.makeDirectory

dataform.workspaces.moveDirectory

dataform.workspaces.moveFile

dataform.workspaces.pull

dataform.workspaces.push

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.removeDirectory

dataform.workspaces.removeFile

dataform.workspaces.reset

dataform.workspaces.searchFiles

dataform.workspaces.writeFile

developerconnect.connections.get

developerconnect.connections.list

developerconnect.gitRepositoryLinks.fetchGitRefs

developerconnect.gitRepositoryLinks.fetchReadToken

developerconnect.gitRepositoryLinks.fetchReadWriteToken

developerconnect.gitRepositoryLinks.get

developerconnect.gitRepositoryLinks.gitProxyRead

developerconnect.gitRepositoryLinks.gitProxyWrite

developerconnect.gitRepositoryLinks.list

developerconnect.locations.*

  • developerconnect.locations.get
  • developerconnect.locations.list

developerconnect.operations.get

developerconnect.operations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.viewer)

Read-only access to all Dataform resources.

dataform.commentThreads.get

dataform.commentThreads.list

dataform.comments.get

dataform.comments.list

dataform.compilationResults.get

dataform.compilationResults.list

dataform.compilationResults.query

dataform.config.get

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.operations.list

dataform.releaseConfigs.get

dataform.releaseConfigs.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.workflowConfigs.get

dataform.workflowConfigs.list

dataform.workflowInvocations.get

dataform.workflowInvocations.list

dataform.workflowInvocations.query

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

developerconnect.connections.get

developerconnect.connections.list

developerconnect.gitRepositoryLinks.fetchReadToken

developerconnect.gitRepositoryLinks.get

developerconnect.gitRepositoryLinks.gitProxyRead

developerconnect.gitRepositoryLinks.list

developerconnect.locations.*

  • developerconnect.locations.get
  • developerconnect.locations.list

developerconnect.operations.get

developerconnect.operations.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeCommenter)

Permissions to comment, at the repository level. Grants CRUD access over commentThread and comment resources.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.folders.get

dataform.folders.queryContents

dataform.locations.get

dataform.repositories.get

dataform.repositories.readFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeCreator)

Access only to private and shared code resources. The permissions in the Code Creator let you create and list code in Dataform, and access only the code that you created and code that was explicitly shared with you.

dataform.commentThreads.get

dataform.commentThreads.list

dataform.comments.get

dataform.comments.list

dataform.folders.create

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.create

dataform.repositories.list

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeEditor)

Edit access code resources.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.addContents

dataform.folders.create

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.createTagBinding

dataform.repositories.deleteTagBinding

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.workspaces.commit

dataform.workspaces.create

dataform.workspaces.delete

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.installNpmPackages

dataform.workspaces.list

dataform.workspaces.makeDirectory

dataform.workspaces.moveDirectory

dataform.workspaces.moveFile

dataform.workspaces.pull

dataform.workspaces.push

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.removeDirectory

dataform.workspaces.removeFile

dataform.workspaces.reset

dataform.workspaces.searchFiles

dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeOwner)

Full access to code resources.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.*

  • dataform.folders.addContents
  • dataform.folders.create
  • dataform.folders.delete
  • dataform.folders.deleteTree
  • dataform.folders.get
  • dataform.folders.getIamPolicy
  • dataform.folders.move
  • dataform.folders.queryContents
  • dataform.folders.setIamPolicy
  • dataform.folders.update

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.operations.list

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.createTagBinding

dataform.repositories.delete

dataform.repositories.deleteTagBinding

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.move

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.repositories.setIamPolicy

dataform.repositories.update

dataform.workspaces.*

  • dataform.workspaces.commit
  • dataform.workspaces.create
  • dataform.workspaces.delete
  • dataform.workspaces.fetchFileDiff
  • dataform.workspaces.fetchFileGitStatuses
  • dataform.workspaces.fetchGitAheadBehind
  • dataform.workspaces.get
  • dataform.workspaces.getIamPolicy
  • dataform.workspaces.installNpmPackages
  • dataform.workspaces.list
  • dataform.workspaces.makeDirectory
  • dataform.workspaces.moveDirectory
  • dataform.workspaces.moveFile
  • dataform.workspaces.pull
  • dataform.workspaces.push
  • dataform.workspaces.queryDirectoryContents
  • dataform.workspaces.readFile
  • dataform.workspaces.removeDirectory
  • dataform.workspaces.removeFile
  • dataform.workspaces.reset
  • dataform.workspaces.searchFiles
  • dataform.workspaces.setIamPolicy
  • dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.codeScheduler)

Access for scheduling workflows and releases.

dataform.releaseConfigs.create

dataform.workflowConfigs.create

(roles/dataform.codeViewer)

Read-only access to all code resources.

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderCommenter)

View and comment access to a team folder and its contents.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderContributor)

Edit access to a team folder and its contents.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.addContents

dataform.folders.create

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.createTagBinding

dataform.repositories.deleteTagBinding

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.teamFolders.update

dataform.workspaces.commit

dataform.workspaces.create

dataform.workspaces.delete

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.installNpmPackages

dataform.workspaces.list

dataform.workspaces.makeDirectory

dataform.workspaces.moveDirectory

dataform.workspaces.moveFile

dataform.workspaces.pull

dataform.workspaces.push

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.removeDirectory

dataform.workspaces.removeFile

dataform.workspaces.reset

dataform.workspaces.searchFiles

dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderCreator)

Access to create new team folders.

dataform.teamFolders.create

(roles/dataform.teamFolderOwner)

Full access to a team folder and its contents. Can share the team folder and its contents.

dataform.commentThreads.*

  • dataform.commentThreads.create
  • dataform.commentThreads.delete
  • dataform.commentThreads.get
  • dataform.commentThreads.list
  • dataform.commentThreads.update

dataform.comments.*

  • dataform.comments.create
  • dataform.comments.delete
  • dataform.comments.get
  • dataform.comments.list
  • dataform.comments.update

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.*

  • dataform.folders.addContents
  • dataform.folders.create
  • dataform.folders.delete
  • dataform.folders.deleteTree
  • dataform.folders.get
  • dataform.folders.getIamPolicy
  • dataform.folders.move
  • dataform.folders.queryContents
  • dataform.folders.setIamPolicy
  • dataform.folders.update

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.operations.get

dataform.operations.list

dataform.repositories.commit

dataform.repositories.computeAccessTokenStatus

dataform.repositories.create

dataform.repositories.createTagBinding

dataform.repositories.delete

dataform.repositories.deleteTagBinding

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.move

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.repositories.setIamPolicy

dataform.repositories.update

dataform.teamFolders.delete

dataform.teamFolders.deleteTree

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.teamFolders.setIamPolicy

dataform.teamFolders.update

dataform.workspaces.*

  • dataform.workspaces.commit
  • dataform.workspaces.create
  • dataform.workspaces.delete
  • dataform.workspaces.fetchFileDiff
  • dataform.workspaces.fetchFileGitStatuses
  • dataform.workspaces.fetchGitAheadBehind
  • dataform.workspaces.get
  • dataform.workspaces.getIamPolicy
  • dataform.workspaces.installNpmPackages
  • dataform.workspaces.list
  • dataform.workspaces.makeDirectory
  • dataform.workspaces.moveDirectory
  • dataform.workspaces.moveFile
  • dataform.workspaces.pull
  • dataform.workspaces.push
  • dataform.workspaces.queryDirectoryContents
  • dataform.workspaces.readFile
  • dataform.workspaces.removeDirectory
  • dataform.workspaces.removeFile
  • dataform.workspaces.reset
  • dataform.workspaces.searchFiles
  • dataform.workspaces.setIamPolicy
  • dataform.workspaces.writeFile

resourcemanager.projects.get

resourcemanager.projects.list

(roles/dataform.teamFolderViewer)

View access to a team folder and its contents.

dataform.compilationResults.*

  • dataform.compilationResults.create
  • dataform.compilationResults.get
  • dataform.compilationResults.list
  • dataform.compilationResults.query

dataform.folders.get

dataform.folders.getIamPolicy

dataform.folders.queryContents

dataform.locations.*

  • dataform.locations.get
  • dataform.locations.list

dataform.repositories.computeAccessTokenStatus

dataform.repositories.fetchHistory

dataform.repositories.fetchRemoteBranches

dataform.repositories.get

dataform.repositories.getIamPolicy

dataform.repositories.list

dataform.repositories.listEffectiveTags

dataform.repositories.listTagBindings

dataform.repositories.queryDirectoryContents

dataform.repositories.readFile

dataform.teamFolders.get

dataform.teamFolders.getIamPolicy

dataform.workspaces.fetchFileDiff

dataform.workspaces.fetchFileGitStatuses

dataform.workspaces.fetchGitAheadBehind

dataform.workspaces.get

dataform.workspaces.getIamPolicy

dataform.workspaces.list

dataform.workspaces.queryDirectoryContents

dataform.workspaces.readFile

dataform.workspaces.searchFiles

resourcemanager.projects.get

resourcemanager.projects.list

Service agent roles

Service agent roles should only be granted to service agents.

Role Permissions

(roles/dataform.serviceAgent)

Gives permission for the Dataform API to access a secret from Secret Manager

dataform.compilationResults.create

dataform.workflowInvocations.create

resourcemanager.projects.get

resourcemanager.projects.list

自訂 Dataform 角色

自訂角色可包含您指定的任何權限。您可以建立自訂角色,並授予執行特定管理作業的權限,例如建立開發工作區,或在開發工作區中建立檔案和目錄。如要建立自訂角色,請參閱「建立及管理自訂角色」。

Dataform 權限的安全性考量

任何具備 dataform.repositories.create 權限的使用者,都能使用自訂服務帳戶和授予該服務帳戶的所有權限,在 BigQuery 中執行程式碼。包括執行 Dataform 工作流程,以及在 Knowledge Catalog 管理中繼資料。

由於所有存放區都會強制執行嚴格的「以身分執行」模式,因此 dataform.repositories.create 權限會隱含要求使用者具備自訂服務帳戶的「以身分執行」權限,才能執行後續工作流程。這可確保只有明確具備模擬權限的使用者,才能使用服務帳戶的身分執行程式碼。

dataform.repositories.create 權限包含在下列 IAM 角色中:

如要限制使用者或服務帳戶在 BigQuery 中可讀取或寫入的資料,您可以將精細的 BigQuery IAM 權限授予所選 BigQuery 資料集或資料表。詳情請參閱「控管資料集的存取權」和「控管資料表和檢視表的存取權」。

如要進一步瞭解自訂服務帳戶及其所需的角色和權限,請參閱「授予 Dataform 必要存取權」。

安裝套件期間存取 Secret

如果您使用 Secret Manager 密鑰設定私人 NPM 套件,則有權修改程式碼或觸發存放區中特定 Git 修訂版本程式碼編譯作業的使用者,可能可以存取這些密鑰。

在工作區手動安裝套件,或從特定 Git 修訂版本編譯程式碼時,系統會觸發套件安裝程序。此時,NPM 用戶端會從 .npmrc 檔案讀取憑證,並將驗證權杖傳輸至設定的 NPM 登錄檔。使用者只要有權修改工作區中的 .npmrc 檔案,就能設定存取 Secret 的權限,將登錄檔要求重新導向至外部伺服器。

這類安裝和潛在權杖外洩情形可能發生在下列情況:

  • Workspace 套件安裝:在 Workspace 中手動觸發。這項操作需要工作區編輯權限,您可以在 Dataform 編輯者 (roles/dataform.editor) 或 Dataform 程式碼編輯器 (roles/dataform.codeEditor) 角色中找到這項權限。

  • 編譯 Git commitish:為存放區中的 Git commitish (例如分支版本、標記或修訂版本 SHA) 建立編譯結果時,系統會自動觸發這項作業。這個情境需要 dataform.compilationResults.create 權限。

為保護憑證,建議您採取下列做法:

  • 請只將具備存放區編輯權限 (例如 Dataform 程式碼編輯者) 或編譯權限 (例如 Dataform 程式碼檢視者) 的角色,授予信任的使用者。

  • 使用組織政策,限制 Dataform 可連線的遠端 Git 存放區。詳情請參閱「限制遠端存放區」。

  • 限制 Dataform 服務代理的 Secret Manager 存取權,僅限必要的 Secret。

  • 使用自訂組織政策限制,拒絕設定 end_user_auth_config,禁止使用使用者憑證。詳情請參閱「建立自訂組織政策限制」。

查看 Dataform 角色

在 Google Cloud 控制台中執行下列步驟:

  1. 依序前往「IAM & Admin」(IAM 與管理) >「Roles」(角色) 頁面。

    前往「Roles」(角色)

  2. 在「Filter」(篩選器) 欄位中,選取「Used in」(使用於),輸入 Dataform,然後按下 Enter 鍵。

  3. 按一下列出的角色,即可在右側窗格中查看該角色的權限。

    舉例來說,Dataform 管理員角色具備所有 Dataform 資源的完整存取權。

如要進一步瞭解如何授予專案角色,請參閱「授予角色」。您可以透過這種方式授予預先定義或自訂角色。

控管個別存放區的存取權

如要透過精細權限控管 Dataform 存取權,可以使用 Dataform API repositories.setIamPolicy 要求,為個別存放區設定 Dataform IAM 角色。

如要為個別 Dataform 存放區設定 Dataform IAM 角色,請按照下列步驟操作:

  1. 在終端機中,傳遞 Dataform API repositories.setIamPolicy 要求,並附上存取政策。

  2. 在政策中,將使用者、群組、網域、服務代理或服務帳戶繫結至所選角色,格式如下:

    {
    "policy":
       {
          "bindings": [
          {
             "role": "roles/ROLE",
             "members": [
                "TYPE:IDENTIFIER",
             ]
          },
          ],
       }
    }
    

    更改下列內容:

    • ROLE:您要授予存放區的 Dataform IAM 角色。
    • TYPE:user、group、domain 或 serviceAccount。
    • IDENTIFIER:要授予角色的使用者、群組、網域或服務帳戶。
  3. 在 IAM 頁面中,確認所有使用者都能透過具備 dataform.repositories.list 權限的 Dataform 角色,查看 Dataform 存放區的完整清單。

  4. 在 IAM 中,請確保只有需要完整存取所有 Dataform 存放區的使用者,才能取得所有存放區的 Dataform 管理員角色。

下列指令會傳遞 repositories.setIamPolicy Dataform API 要求,將 sales 存放區的 Dataform 編輯者角色授予單一使用者:

curl -H "Content-Type: application/json" -X POST -d '{ "policy": { "bindings": [{ "role": "roles/dataform.editor", "members": ["user:sasha@examplepetstore.com"]}] }}' "https://dataform.googleapis.com/v1/projects/examplepetstore/locations/us-central1/repositories/sales:setIamPolicy"

授予存放區的公開存取權

如要授予 Dataform 存放區的公開存取權,請將存放區的 IAM 角色授予 allAuthenticatedUsers 主體。

將 IAM 角色指派給 allAuthenticatedUsers 主體時,服務帳戶和所有已透過 Google 帳戶驗證身分的網際網路使用者,都會獲得該角色。這包括未連結至 Google Workspace 帳戶或 Cloud Identity 網域的帳戶,例如個人 Gmail 帳戶。未經驗證的使用者 (例如匿名訪客) 則不計入。詳情請參閱「所有已驗證的使用者」。

舉例來說,如果您將 Dataform 檢視者角色授予 sales 存放區上的 allAuthenticatedUsers,則所有已透過 Google 帳戶驗證的服務帳戶和網際網路使用者,都具備所有 sales 程式碼資源的唯讀存取權。

如要授予 Dataform 存放區的公開存取權,請按照下列步驟操作:

  1. 在終端機中,傳遞 Dataform API repositories.setIamPolicy 要求,並附上存取政策。

  2. 在政策中,請以下列格式將 allAuthenticatedUsers 主體繫結至所選角色:

    {
    "policy":
       {
          "bindings": [
          {
             "role": "roles/ROLE",
             "members": [
                "allAuthenticatedUsers",
             ]
          },
          ],
       }
    }
    

    將 ROLE 替換為要授予所有已驗證使用者的 Dataform IAM 角色。

下列指令會傳遞 repositories.setIamPolicy Dataform API 要求,將 sales 存放區的 Dataform 檢視者角色授予 allAuthenticatedUsers:

curl -H "Content-Type: application/json" -X POST -d '{ "policy": { "bindings": [{ "role": "roles/dataform.viewer", "members": ["allAuthenticatedUsers"]}] }}' "https://dataform.googleapis.com/v1/projects/examplepetstore/locations/us-central1/repositories/sales:setIamPolicy"

禁止公開存取存放區

為確保任何 Dataform 存放區都不會向大眾授予存取權,您可以限制專案中的 allAuthenticatedUsers 主體。

如要限制專案中的 allAuthenticatedUsers,您可以設定 iam.allowedPolicyMemberDomains 政策,並從 allowed_values 清單中移除 allAuthenticatedUsers。

在 iam.allowedPolicyMemberDomains 政策中限制 allAuthenticatedUsers 後,專案中的任何 IAM 政策都無法使用 allAuthenticatedUsers 主體,因此無法向所有資源 (包括 Dataform 存放區) 授予公開存取權。

如要進一步瞭解 iam.allowedPolicyMemberDomains 政策和設定操作說明,請參閱「依照網域設定身分限制」。

Dataform 中的員工身分聯盟

透過員工身分聯盟,您可以使用外部身分識別資訊提供者 (IdP),透過 IAM 驗證及授權使用者存取 Google Cloud 服務。

Dataform 支援員工身分聯盟,沒有已知限制。

使用 IAM 控管個別資料表的存取權

本節說明如何授予及撤銷個別 Dataform 資料表和檢視表的 BigQuery IAM 角色。

Dataform 執行資料表或檢視表時,會在 BigQuery 中建立資源。在 Dataform 開發期間,您可以將 BigQuery 角色授予個別資料表和檢視表,以便在執行後控管其在 BigQuery 的存取權。

如要進一步瞭解如何授予及撤銷資源存取權,請參閱「授予資源存取權」。

將 BigQuery 角色授予資料表或檢視表

如要將 BigQuery 角色授予 Dataform 中的資料表或檢視表,請在所選資料表或檢視表的 .sqlx 定義檔案中,新增含有 GRANT DCL 陳述式的 post_operations 區塊。

如要將 BigQuery 角色授予所選資料表或檢視表,請按照下列步驟操作:

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

    前往 Dataform

  2. 選取存放區,然後選取工作區。

  3. 在「檔案」窗格展開「definitions/」目錄。

  4. 選取要授予存取權的資料表或檢視表的 .sqlx 定義檔案。

  5. 在檔案中輸入下列程式碼片段:

    post_operations {
        GRANT "ROLE_LIST"
        ON "RESOURCE_TYPE" ${self()}
        TO "USER_LIST"
    }
    

    更改下列內容:

    • ROLE_LIST:要授予的 BigQuery 角色,或以半形逗號分隔的 BigQuery 角色清單。

    • RESOURCE_TYPE:TABLE 或 VIEW。

    • USER_LIST:以半形逗號分隔的使用者清單,列出獲派角色的使用者。

      如需有效格式清單,請參閱 user_list。

  6. 選用:按一下「格式」。

  7. 執行資料表或檢視表。

  8. 如果您授予了累加資料表的存取權,請在首次執行後,從資料表定義檔案中移除 GRANT 陳述式。

下列程式碼範例顯示授予使用者資料表 BigQuery 檢視者角色:

config { type: "table" }

SELECT ...

post_operations {
  GRANT `roles/bigquery.dataViewer`
  ON TABLE ${self()}
  TO "user:222larabrown@gmail.com"
}

撤銷資料表或檢視表的 BigQuery 角色

如要撤銷資料表或檢視表的 BigQuery 角色,請在所選資料表或檢視表的 .sqlx 定義檔案中,新增含有 REVOKE DCL 陳述式的 post_operations 區塊。

如要撤銷所選資料表或檢視表的 BigQuery 角色,請按照下列步驟操作:

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

    前往 Dataform

  2. 選取存放區,然後選取工作區。

  3. 在「檔案」窗格展開「definitions/」目錄。

  4. 選取要撤銷存取權的資料表或檢視表 .sqlx 定義檔案。

  5. 在 post_operations 區塊中,輸入下列 REVOKE 陳述式:

        REVOKE "ROLE_LIST"
        ON "RESOURCE_TYPE" ${self()}
        FROM "USER_LIST"
    

    更改下列內容:

    • ROLE_LIST:要撤銷的 BigQuery 角色,或以半形逗號分隔的 BigQuery 角色清單。
    • RESOURCE_TYPE:TABLE 或 VIEW。
    • USER_LIST:以半形逗號分隔的使用者清單,列出要撤銷角色的使用者。如需有效格式清單,請參閱 user_list。
  6. 如要撤銷檔案中 GRANT 陳述式授予的存取權,請將 GRANT 陳述式替換為 REVOKE 陳述式。

  7. 選用:按一下「格式」。

  8. 執行資料表或檢視表。

  9. 如果您撤銷了對增量資料表的存取權,請在首次執行後,從資料表定義檔案中移除 REVOKE 陳述式。

下列程式碼範例顯示從資料表上的使用者撤銷 BigQuery 檢視者角色:

config { type: "table" }

SELECT ...

post_operations {
  REVOKE `roles/bigquery.dataViewer`
  ON TABLE ${self()}
  FROM "user:222larabrown@gmail.com"
}

統一管理資料表和檢視表的 BigQuery 角色

如要在單一位置控管 BigQuery 對個別資料表和檢視表的存取權,您可以使用 GRANT 和 REVOKE DCL 陳述式建立專屬的 type: "operations" 檔案。

如要在單一 type: "operations" 檔案中管理 BigQuery 資料表存取權,請按照下列步驟操作:

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

    前往 Dataform

  2. 選取存放區,然後選取工作區。

  3. 在「Files」(檔案) 窗格中,點按 definitions/ 旁的 新增選單圖示。「更多」選單。

  4. 點選「建立檔案」。

  5. 在「Add a file path」(新增檔案路徑) 欄位中,依序輸入檔案名稱和 .sqlx (位於 definitions/ 後方)。例如:definitions/table-access.sqlx。

    檔案名稱只能包含數字、英文字母、連字號和底線。

  6. 點選「建立檔案」。

  7. 在「Files」(檔案) 窗格中,展開 definitions/ 目錄,然後選取新建立的檔案。

  8. 在檔案中輸入下列程式碼片段:

      config { type: "operations" }
    
      GRANT "ROLE_LIST"
      ON RESOURCE_TYPE RESOURCE_NAME
      TO "USER_LIST"
    
      REVOKE "ROLE_LIST"
      ON { "<var>" }}RESOURCE_TYPE RESOURCE_NAME
      TO "USER_LIST"
    

    更改下列內容:

    • ROLE_LIST:要授予或撤銷的 BigQuery 角色,或以半形逗號分隔的 BigQuery 角色清單。
    • RESOURCE_TYPE:TABLE 或 VIEW。
    • RESOURCE_NAME:資料表或檢視表的名稱。
    • USER_LIST:以半形逗號分隔的使用者清單,列出獲派或遭撤銷角色的使用者。如需有效格式清單,請參閱 user_list。
  9. 視需要新增 GRANT 和 REVOKE 陳述式。

    1. 如要撤銷檔案中 GRANT 陳述式授予的存取權,請將 GRANT 陳述式替換為 REVOKE 陳述式。

      如果移除 GRANT 陳述式,但未新增 REVOKE 陳述式,則不會撤銷存取權。

  10. 選用:按一下「格式」。

  11. 每次更新後,請執行檔案。

    1. 如果您授予或撤銷了對增量資料表的存取權,請在首次執行 GRANT 或 REVOKE 陳述式後,從檔案中移除該陳述式。

使用 Config API 自訂 IAM 行為

您可以使用 projects.locations.updateConfig Dataform API 方法自訂 IAM 行為並強化安全性。

在建立資源時授予特定角色

在 projects.locations.repositories 資源中將 setAuthenticatedUserAdmin 欄位設為 true 時,Dataform 會自動將該存放區的 Dataform 管理員角色 (roles/dataform.admin) 授予建立存放區的使用者。此外,Dataform 會將新工作區的 Dataform 管理員角色,授予在該存放區中建立工作區的所有使用者。

您可以使用 projects.locations.updateConfig 方法中的 creator_role 欄位(預先發布版)覆寫這項行為。如果 setAuthenticatedUserAdmin 為 true,且您使用自訂角色設定 creator_role 欄位,Dataform 會授予自訂角色,而非預設的 dataform.admin 角色。

導入進階排程權限

如要要求使用者必須具備明確權限,才能排定 Dataform 工作流程,請在 projects.locations.updateConfig 方法中將 enable_project_checks_for_scheduling 欄位設為 true。

為排程啟用這些檢查時,使用者需要下列權限:

  • 如要建立工作流程設定,請按照下列步驟操作:

    • 專案的 dataform.workflowConfigs.create 權限,由 Code Scheduler 角色 (roles/dataform.codeScheduler) 授予。
    • 存放區的 dataform.repositories.scheduleWorkflow 權限,由 Dataform 管理員角色 (roles/dataform.admin) 授予。
  • 如何建立版本設定:

    • 專案的 dataform.releaseConfigs.create 權限,由 Code Scheduler 角色 (roles/dataform.codeScheduler) 授予。
    • 存放區的 dataform.repositories.scheduleRelease 權限,由 Dataform 管理員角色 (roles/dataform.admin) 授予。

啟用私人工作區

如要限制 Dataform 工作區存取權,只允許工作區建立者在該工作區中讀取及寫入程式碼,請在 projects.locations.updateConfig 方法中將 enable_private_workspace 欄位設為 true。

這項限制也適用於查看產生的構件,例如已編譯的 SQL、編譯錯誤,以及工作區編譯或工作流程叫用的執行記錄。

這項設定會覆寫標準 IAM 角色,授予其他存放區使用者工作區存取權。

後續步驟