使用 IAM 條件控管存取權
本文件將說明如何使用 IAM 條件控管 BigQuery 資源的存取權。
有了 IAM 條件,您就能在符合指定條件時,授予 BigQuery 資源存取權。舉例來說,您可以授予資源存取權,但時間有限,或是在一天中的特定時段定期存取。您可以在資源的機構、資料夾、專案和資料集層級新增 IAM 條件。子項資源會繼承附帶條件的允許政策。如要進一步瞭解資源層級,請參閱「資源階層」。
如要同時向許多相關資源授予身分與存取權管理 (IAM) 權限,包括尚不存在的資源,IAM 條件就很實用。如要授予 BigQuery 資源不相關群組的權限,建議您使用身分與存取權管理代碼。
事前準備
- 授予使用者 IAM 角色,讓他們具備執行本文各項工作的必要權限。
- 啟用 IAM API。
必要的角色
如要取得將 IAM 條件套用至 BigQuery 資源所需的權限,請管理員授予您下列 IAM 角色:
-
專案:
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
資料集:
BigQuery 資料擁有者 (
roles/bigquery.dataOwner
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色包含將 IAM 條件套用至 BigQuery 資源所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要將 IAM 條件套用至 BigQuery 資源,您必須具備下列權限:
-
在專案層級設定條件式 IAM 存取權:
resourcemanager.projects.setIamPolicy
-
為資料集設定條件式 IAM 存取權:
-
bigquery.datasets.setIamPolicy
-
bigquery.datasets.update
-
如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「IAM 簡介」。
啟用 IAM API
如要啟用 IAM API,請選取下列任一選項:
主控台
前往「Identity and Access Management (IAM) API」頁面,啟用 API。
gcloud
gcloud services enable iam.googleapis.com
查看資料集的條件式存取權政策
選取下列選項之一:
主控台
前往「BigQuery」頁面
在「Explorer」窗格中展開專案並選取資料集。
依序按一下「共用」圖示
>「權限」。按一下相關角色旁的「condition:
TITLE
」,即可查看該角色的條件。
bq
如要在 Cloud Shell 中查看或更新條件式存取權政策,您必須使用 Cloud Shell 503.0.0 以上版本。
如要取得現有的存取權政策,並將其輸出至 JSON 格式的本機檔案,請在 Cloud Shell 中使用 bq show
指令:
bq show --format=prettyjson PROJECT_ID:DATASET > PATH_TO_FILE
更改下列內容:
- PROJECT_ID:您的專案 ID
- DATASET:資料集名稱
- PATH_TO_FILE:本機上的 JSON 檔案路徑
資料集資源 JSON 檔案中的 access
屬性包含存取權政策。
API
如要查看資料集的存取權政策 (含條件),請呼叫 datasets.get
,並將 accessPolicyVersion=3
做為要求參數。資料集資源中的 access
屬性包含存取權政策。
修改資源的條件存取權
下列各節將說明如何新增或移除不同資源的條件式存取權。
為機構、資料夾或專案新增條件
如要在 BigQuery 中為機構、資料夾或專案新增條件式存取權,請參閱「允許含有條件的政策」。建立條件時,請參考屬性格式表。
為資料集新增條件式存取權
如要為資料集新增條件,請選取下列其中一種方法。建立條件時,請參考屬性格式表。
主控台
前往「BigQuery」頁面
在「Explorer」窗格中展開專案並選取資料集。
在詳細資料面板中,依序按一下 >「權限」。
「分享」按一下
「新增主體」。在「新增主體」欄位中輸入主體。
在「選取角色」清單中,選取預先定義的角色或自訂角色。
按一下「新增 IAM 條件」。
使用條件屬性,在
condition
欄位中新增條件。在「新增身分與存取權管理條件」面板中,按一下「儲存」。
在「授予
DATASET
存取權」面板中,按一下「儲存」。
bq
如要在 Cloud Shell 中查看或更新條件式存取權政策,您必須使用 Cloud Shell 503.0.0 以上版本。
如要使用 Cloud Shell 授予資料集的條件存取權,請按照授予資料集存取權的操作說明操作。您可以將條件存取權條件新增至資料集 JSON 檔案的 access
部分。
舉例來說,如果在資料集 JSON 檔案的 access
區段中新增下列內容,系統會將 roles/bigquery.dataViewer
角色授予 cloudysanfrancisco@gmail.com
,有效期限至 2032 年 12 月 31 日:
"access": [ { "role": "roles/bigquery.dataViewer", "userByEmail": "cloudysanfrancisco@gmail.com", "condition": { "title": "Grant roles/bigquery.dataViewer until 2033", "description": "Role expires on December 31, 2032.", "expression": "request.time < timestamp('2032-12-31T12:00:00Z')" } } ]
API
如要使用 BigQuery API 授予資料集的條件存取權,請按照授予資料集存取權的操作說明操作,在要求參數中使用 accessPolicyVersion=3
。
您可以將含有存取權條件的項目新增至資料集資源的 access.condition
屬性。
如果資料集有條件式存取權政策,使用者可以使用標準讀取、修改和更新流程來更新無條件存取權設定,而無須指定 accessPolicyVersion
要求參數。
從資料集中移除條件式存取權
如要從資料集中移除條件,請選擇下列其中一種方法。建立條件時,請參考屬性格式表。
主控台
前往「BigQuery」頁面
在「Explorer」窗格中展開專案並選取資料集。
在詳細資料面板中,依序按一下 >「權限」。
「分享」選取要撤銷存取權的主體。
按一下
「刪除」。在「Delete principal?」對話方塊中,按一下「Delete」。
bq
如要在 Cloud Shell 中查看或更新條件式存取權政策,您必須使用 Cloud Shell 503.0.0 以上版本。
如要使用 Cloud Shell 移除資料集的條件式存取權,請按照「撤銷資料集存取權」一文中的指示操作。您可以從資料集 JSON 檔案的 access
區段中移除含有條件的項目。
API
如要使用 BigQuery API 撤銷資料集的條件式存取權,請按照撤銷資料集的存取權指示操作,在要求參數中使用 accessPolicyVersion=3
。
您可以從資料集資源的 access
屬性中移除含有條件的項目。
如果資料集有條件式存取權政策,使用者可以使用標準讀取、修改和更新流程來更新無條件存取權設定,而無須指定 accessPolicyVersion
要求參數。
條件屬性
您可以根據下列屬性,為 BigQuery 資源設定 IAM 條件:
request.time
:使用者嘗試存取 BigQuery 資源的時間。如需詳細資訊和範例,請參閱「日期/時間屬性」。resource.name
:BigQuery 資源的路徑。如需格式說明,請參閱「屬性格式」中的表格。resource.type
:BigQuery 資源類型。如需格式說明,請參閱「屬性格式」中的表格。resource.service
:BigQuery 資源使用的 Google Cloud 服務。如需格式說明,請參閱屬性格式中的表格。resource.tags
:BigQuery 資源附加的標記。標籤僅支援 BigQuery 資料集、資料表和檢視資源。如需格式說明,請參閱「屬性格式」和 IAM 說明文件中的表格。
屬性格式
為 BigQuery 資料集建立條件時,請使用下列格式:
屬性 | 值 |
---|---|
resource.type |
bigquery.googleapis.com/Dataset |
resource.name |
projects/PROJECT_ID/datasets/DATASET_ID |
resource.service |
bigquery.googleapis.com |
resource.tags |
支援 hasTagKey 、hasTagKeyId 、matchTag 和 matchTagId 。詳情請參閱「資源標記」。 |
為 BigQuery 資料表和檢視表建立條件時,請使用下列格式:
屬性 | 值 |
---|---|
resource.type |
bigquery.googleapis.com/Table |
resource.name |
projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID |
resource.service |
bigquery.googleapis.com |
resource.tags |
支援 hasTagKey 、hasTagKeyId 、matchTag 和 matchTagId 。詳情請參閱「資源標記」。 |
建立 BigQuery 例行程序的條件時,請使用下列格式:
屬性 | 值 |
---|---|
resource.type |
bigquery.googleapis.com/Routine |
resource.name |
projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID |
resource.service |
bigquery.googleapis.com |
建立 BigQuery 模型的條件時,請使用下列格式:
屬性 | 值 |
---|---|
resource.type |
bigquery.googleapis.com/Model |
resource.name |
projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID |
resource.service |
bigquery.googleapis.com |
更改下列內容:
PROJECT_ID
:包含您要授予存取權的資源的專案 IDDATASET_ID
:您要授予存取權的資料集 IDTABLE_ID
:您要授予存取權的資料表或檢視畫面 IDROUTINE_ID
:您要授予存取權的日常生活安排 IDMODEL_ID
:您要授予存取權的模型 ID
條件最佳做法
在 BigQuery 中建立條件時,請遵循下列最佳做法:
- 建議您為
resource.type
、resource.name
和resource.service
使用正面條件,以提高準確度。由於不支援的類型會以空字串表示,因此負面條件可能會與多種資源相符。詳情請參閱負面條件。 - 資料集層級 IAM 條件僅適用於資料集中的資源 (例如資料表、檢視畫面、模型和例行程序) 的角色。請勿將這些角色用於授予資料集或專案層級的角色,例如
bigquery.user
或bigquery.jobUser
。 - 請勿將條件
resource.type == 'bigquery.googleapis.com/Dataset'
用於資料集層級政策,因為這不會影響授權。這個屬性旨在控管資料表、檢視畫面、處理常式和模型等子資料集資源的存取權。 - 即使不需要那麼精確的條件,也請在條件中加入
resource.type
、resource.name
和resource.service
。這項做法有助於在工作流程中資源變更時維持條件,避免日後不小心納入其他資源。 - 授予權限時,請盡可能只授予最少的權限,避免不小心授予過度寬鬆的存取權。
- 請謹慎使用
resource.name.startsWith
。BigQuery 資料表和檢視路徑的前置字串為其父專案 ID 和資料集 ID。條件不夠明確,可能會授予過多存取權。不過,您可以使用resource.name.startsWith
屬性,讓使用者在資料表上執行萬用字元查詢。舉例來說,使用resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix")
條件授予的存取權可讓使用者執行SELECT * FROM my_dataset.table_prefix*
查詢。 - 請勿為資料集、資料表、檢視、處理常式和模型以外的 BigQuery 資源新增條件。
- 請確認您在正確的資源上授予正確的權限。舉例來說,您必須在父項層級授予列出資源的權限 (
bigquery.RESOURCE.list
),但必須在資源層級授予刪除資源的權限 (bigquery.RESOURCE.delete
)。資料集刪除作業會一併刪除所有包含的資源,因此需要資料集的資料表、模型和例行刪除權限。 - 請注意,資料表快照和時間旅行不會影響權限。
負面條件
resource.name != resource
等負面條件可能會不小心授予過度寬鬆的存取權。不支援的 BigQuery 資源會顯示空白的資源屬性,表示符合所有負面條件。BigQuery 以外服務中的資源也可能符合負面條件。
此外,當使用者執行含有萬用字元的查詢時,負面條件會造成問題。舉例來說,請考慮負面條件 resource.name != /projects/my_project/datasets/my_dataset/tables/secret
。這個條件似乎會授予所有資源的存取權,但例外狀況是名為 secret
的資料表。不過,使用者仍可使用萬用字元查詢 (例如 SELECT * from my_project.my_dataset.secre*;
) 查詢該資料表。
此外,表格、例行程序和模型的負面條件可能會對其父項資料集提供過度寬鬆的存取權。由於刪除權限是在資料集層級管理,因此使用者可能可以刪除這些資源。
限制
- 您無法使用 IAM 條件新增授權檢視畫面、授權例行公事或授權資料集授權。
- 如果在查看含有條件的資源時使用了不相容的
accessPolicyVersion
,繫結可能會包含withcond
,後面接著一個雜湊值。詳情請參閱「排解政策和角色繫結中的withcond
問題」。 - 資料集或資料表的條件存取權使用者無法透過 Google Cloud 主控台修改該資源的權限。您只能透過 bq 工具和 BigQuery API 修改權限。
- 系統不支援直接透過 IAM 條件設定列層級和欄層級存取權。不過,具備條件式存取權的使用者可以授予自己資料表的 BigQuery 管理員角色 (
roles/bigquery.admin
),然後修改資料列和資料欄存取權政策。 - IAM 政策的變更最多可能需要五分鐘才會生效。
- 擁有條件式存取權的使用者可能無法查詢
INFORMATION_SCHEMA
檢視畫面。 - 只有條件式資料表存取權的使用者無法執行資料表萬用字元函式。
範例
以下是 BigQuery 中 IAM 條件的用途範例。
授予特定資料表的讀取權限
這個範例會將 BigQuery 資料檢視者角色指派給 cloudysanfrancisco@gmail.com
,以便查看 dataset_1
資料集中的 table_1
資料表。使用者可透過這個角色查詢資料表,並透過 bq 工具存取資料表。使用者沒有資料集的bigquery.tables.list
權限,因此無法在 Google Cloud 控制台中查看資料表。
{ "members": [cloudysanfrancisco@gmail.com], "role": roles/bigquery.dataViewer, "condition": { "title": "Table dataset_1.table_1", "description": "Allowed to read table with name table_1 in dataset_1 dataset", "expression": resource.name == projects/project_1/datasets/dataset_1/tables/table_1 && resource.type == bigquery.googleapis.com/Table } }
授予特定資料集的清單存取權
這個範例會將 BigQuery 中繼資料檢視者角色指派給 cloudysanfrancisco@gmail.com
,以便該使用者存取 dataset_2
資料集。使用者可透過這個角色列出資料集中的所有資源,但無法對這些資源執行任何查詢。
{ "members": [cloudysanfrancisco@gmail.com], "role": roles/bigquery.metadataViewer, "condition": { "title": "Dataset dataset_2", "description": "Allowed to list resources in dataset_2 dataset", "expression": resource.name == projects/project_2/datasets/dataset_2 && resource.type == bigquery.googleapis.com/Dataset } }
授予擁有者存取權,讓他們可以存取所有資料集 (含有特定前置字串) 中的所有資料表
以下範例會將 BigQuery 資料擁有者角色授予 cloudysanfrancisco@gmail.com
,適用於所有資料集中以 public_
前置字開頭的資料表:
{ "members": [cloudysanfrancisco@gmail.com], "role": roles/bigquery.dataOwner, "condition": { "title": "Tables public_", "description": "Allowed owner access to tables in datasets with public_ prefix", "expression": resource.name.startsWith("projects/project_3/datasets/public_") && resource.type == bigquery.googleapis.com/Table } }
授予擁有者存取權,可存取所有具有特定前置字串的資料集中的所有資料表、模型和處理常式
這個範例會將 BigQuery 資料擁有者角色授予 cloudysanfrancisco@gmail.com
,適用於所有以 general_
前置字開頭的資料集中的所有資料表、模型和例行程序:
{ "members": [cloudysanfrancisco@gmail.com], "role": roles/bigquery.dataOwner, "condition": { "title": "Tables general_", "description": "Allowed owner access to tables in datasets with general_ prefix", "expression": resource.name.startsWith("projects/project_4/datasets/general_") && resource.type == bigquery.googleapis.com/Table } }, { "members": [cloudysanfrancisco@gmail.com], "role": roles/bigquery.dataOwner, "condition": { "title": "Models general_", "description": "Allowed owner access to models in datasets with general_ prefix", "expression": resource.name.startsWith("projects/project_4/datasets/general_") && resource.type == bigquery.googleapis.com/Model } }, { "members": [cloudysanfrancisco@gmail.com], "role": roles/bigquery.dataOwner, "condition": { "title": "Routines general_", "description": "Allowed owner access to routines in datasets with general_ prefix", "expression": resource.name.startsWith("projects/project_4/datasets/general_") && resource.type == bigquery.googleapis.com/Routine } }