本頁面說明如何為 GoogleSQL 方言資料庫和 PostgreSQL 方言資料庫設定 Spanner 的精細存取權控管。
如要瞭解精細的存取權控管機制,請參閱「關於精細的存取權控管機制」。
如要設定精細的存取權控管,請按照下列步驟操作:
精細存取權控管使用者接著必須指定資料庫角色,才能對資料庫執行查詢、DML 或資料列作業。
事前準備
請務必為每個精細存取權控管使用者主體授予 Cloud Spanner Viewer
IAM 角色 (roles/spanner.viewer
)。
如果使用者必須在 Google Cloud 控制台中與 Spanner 資源互動,建議在專案層級授予這個角色。
如需操作說明,請參閱「授予主體權限」。
建立資料庫角色並授予權限
資料庫角色是一組精細的存取權限,每個資料庫最多可建立 100 個資料庫角色。
決定資料庫中的角色和角色階層,並以 DDL 編碼。 與 Spanner 中的其他結構定義變更一樣,我們強烈建議您以批次形式發布結構定義變更,而非個別發布。詳情請參閱限制結構定義更新頻率。
控制台
如要建立資料庫角色並授予精細的存取權限,請按照下列步驟操作:
前往 Google Cloud 控制台的「Instances」(執行個體) 頁面。
選取包含要新增角色的資料庫的執行個體。
選取資料庫。
在「總覽」頁面中,按一下「Spanner Studio」。
在「Spanner Studio」頁面中,針對要建立及授予權限的每個資料庫角色,執行下列步驟:
如要建立角色,請輸入下列陳述式:
CREATE ROLE ROLE_NAME;
請先不要點選「提交」。
如要授予角色權限,請在
CREATE ROLE
陳述式後方的下一行輸入GRANT
陳述式。如要瞭解
GRANT
陳述式的語法詳細資料,請參閱 GoogleSQL 資料定義語言。如要瞭解權限,請參閱精細的存取權控管權限。舉例來說,如要將資料表
employees
和contractors
的SELECT
、INSERT
和UPDATE
權限授予資料庫角色hr_manager
,請輸入下列陳述式:GoogleSQL
GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
PostgreSQL
GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_manager;
您可以為
GRANT
陳述式使用 DDL 範本。在「Explorer」(探索) 窗格中,前往要授予權限的角色。按一下「查看動作」 ,然後選取要授予這個角色的權限類型。GRANT
範本陳述式會在新編輯器分頁中填入。
按一下「提交」。
如果 DDL 有錯誤, Google Cloud 控制台會傳回錯誤。
gcloud
如要建立資料庫角色並授予精細的存取權限,請使用 gcloud spanner databases ddl update
指令搭配 CREATE ROLE
和 GRANT
陳述式。
如要瞭解 CREATE ROLE
和 GRANT
陳述式的語法詳細資料,請參閱 GoogleSQL 資料定義語言。
舉例來說,您可以使用下列指令建立資料庫角色,並將一或多個資料表的權限授予該角色。
GoogleSQL
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'
PostgreSQL
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE_NAME;'
更改下列內容:
PRIVILEGES
是以逗號分隔的精細存取控制權限清單。如要瞭解權限,請參閱精細的存取權控管權限。TABLES
是以半形逗號分隔的資料表清單。
舉例來說,如要將 SELECT
、INSERT
和 UPDATE
授予執行個體 hr
中資料庫 hrdb1
的資料表 employees
和 contractors
,請輸入下列陳述式:hr_analyst
GoogleSQL
gcloud spanner databases ddl update hrdb1 --instance=hr \ --ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_analyst;'
PostgreSQL
gcloud spanner databases ddl update hrdb1 --instance=hr \ --ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_analyst;'
用戶端程式庫
這兩個程式碼範例都會建立及捨棄資料庫角色。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
建立具有繼承功能的角色階層
您可以將一個資料庫角色授予另一個角色,藉此建立資料庫角色階層。子角色 (又稱成員角色) 會沿用上層角色的權限。
如要將資料庫角色授予其他資料庫角色,請使用下列陳述式:
GoogleSQL
GRANT ROLE role1 TO ROLE role2;
PostgreSQL
GRANT role1 TO role2;
詳情請參閱「資料庫角色階層和繼承」。
將資料庫角色授予主體
如要存取 Spanner 資源,主體必須使用下列其中一種方式,取得必要的資料庫角色:
控制台
在資料庫的「總覽」頁面上,如果「資訊面板」尚未開啟,請按一下「顯示資訊面板」。
按一下「新增主體」。
在「新增主體」下方的「新增主體」中,輸入一或多個主體。
在「指派角色」下方的「請選擇角色」中,依序選取「Cloud Spanner」>「Cloud Spanner Fine-grained Access User」(Cloud Spanner 細部存取權使用者)。
您只需要為每個主體授予一次這個角色。這會將主體設為精細存取權控管使用者。
按一下「新增其他角色」。
在「請選擇角色」中,依序選取「Cloud Spanner」>「Cloud Spanner 資料庫角色使用者」。
請按照下列步驟建立 IAM 條件,指定要授予的角色。
在「Cloud Spanner 資料庫角色使用者」角色旁邊,按一下「新增 IAM 條件」。
在「新增條件」面板中,輸入條件的標題和說明 (選填)。
如果您要授予單一資料庫角色,通常會在條件標題中加入角色名稱。如果您要授予多個角色,可以指出角色組合的相關事項。
按一下「條件編輯器」。
在「運算式」欄位中,輸入下列程式碼:
resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE")
將
ROLE
換成您的角色名稱。如要將多個角色授予主體,請使用 or (
||
) 運算子新增更多條件,如下列範例所示:resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))
這段程式碼會授予兩個角色。將
ROLE1
和ROLE2
替換為您的角色名稱。如要授予兩個以上的角色,請新增更多「或」條件。您可以使用 IAM 支援的任何條件運算式。詳情請參閱「身分與存取權管理條件總覽」。
按一下 [儲存]。
確認條件顯示在「角色」欄位旁的「IAM 條件」欄中。
按一下 [儲存]。
返回「資訊面板」,在「角色/主體」下方,注意「Cloud Spanner 資料庫角色使用者」會針對每個定義的條件顯示。
條件旁邊括號中的數字,表示該條件授予資料庫角色的主體數量。您可以點選展開箭頭,查看主體清單。
如要修正資料庫角色名稱或條件的錯誤,或是為主體新增其他資料庫角色,請按照下列步驟操作:
展開列出所需條件的「Cloud Spanner Database Role User」(Cloud Spanner 資料庫角色使用者) 項目。
按一下主體旁的「編輯」 (鉛筆) 圖示。
在「Edit access to database_name」(編輯「database_name」的存取權) 面板中,執行下列任一操作:
按一下「新增其他角色」。
如要編輯條件,請按一下條件名稱旁的「編輯」 (鉛筆) 圖示。接著在「編輯條件」頁面中,按一下「條件編輯器」,進行修正,然後按兩下「儲存」。
gcloud
使用
gcloud spanner databases add-iam-policy-binding
指令,為主體啟用精細的存取權控管機制,如下所示:gcloud spanner databases add-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=roles/spanner.fineGrainedAccessUser \ --member=MEMBER_NAME \ --condition=None
MEMBER_NAME
是主體的 ID。必須使用下列其中一種語法:user|group|serviceAccount:email
或domain:domain
。這項指令會將主體設為精細存取權控管使用者。每個主體只能提交一次這個指令。
如果成功,指令會輸出資料庫的完整政策。
使用
gcloud spanner databases add-iam-policy-binding
指令授予使用一或多個資料庫角色的權限,如下所示:gcloud spanner databases add-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=roles/spanner.databaseRoleUser \ --member=MEMBER_NAME \ --condition=CONDITION
MEMBER_NAME
是主體的 ID。必須使用下列其中一種語法:user|group|serviceAccount:email
或domain:domain
。CONDITION
是 IAM 條件運算式,用於指定要授予主體的角色。CONDITION
的格式如下:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE1")),title=TITLE,description=DESCRIPTION'
如要將多個角色的存取權授予主體,請使用 or (
||
) 運算子新增更多條件,如下列範例所示:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
這段程式碼會授予兩個角色。將
ROLE1
和ROLE2
替換為您的角色名稱。如要授予兩個以上的角色,請使用||
運算子新增更多 or 條件。您可以使用 IAM 支援的任何條件運算式。詳情請參閱「身分與存取權管理條件總覽」。
如果成功,指令會輸出資料庫的完整政策。
下列範例會將資料庫角色
hr_rep
和hr_manager
授予給主體jsmith@example.com
。gcloud spanner databases add-iam-policy-binding myDatabase \ --instance=myInstance \ --role=roles/spanner.databaseRoleUser \ --member=user:jsmith@example.com \ --condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/hr_rep") || resource.name.endsWith("/hr_manager"))),title=HR roles,description=Grant permissions on HR roles'
用戶端程式庫
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
通知使用者和開發人員開始使用資料庫角色
完成初始的精細存取權控管設定後,請通知使用者和應用程式開發人員,他們必須開始使用資料庫角色。
精細存取權控管使用者透過 Google Cloud 控制台或 Google Cloud CLI 存取 Spanner 資料庫時,必須開始指定資料庫角色。
使用精細存取權控管機制的應用程式存取資料庫時,必須指定資料庫角色。
詳情請參閱「使用精細的存取權控管機制存取資料庫」。
將主體轉換為精細的存取權控管機制
如要將主體從資料庫層級存取權控管機制,轉換為精細存取權控管機制,請按照下列步驟操作:
為主體啟用精細存取權控管,並授予所有必要資料庫角色的存取權,如「授予主體資料庫角色」一文所述。
更新以這個主體身分執行的所有應用程式。在呼叫用戶端程式庫方法時,指定適當的資料庫角色。
撤銷主體的所有 IAM 資料庫層級角色。 這樣一來,主體的存取權只會由一種方法控管。
例外狀況:如要在Google Cloud 控制台中與 Spanner 資源互動,所有使用者都必須具備
roles/spanner.viewer
IAM 角色。如要撤銷 IAM 資料庫層級角色,請按照「移除資料庫層級權限」一文中的操作說明進行。
列出資料庫角色
您可以列出與資料庫相關聯的資料庫角色。
控制台
如要列出資料庫角色,請在資料庫的 Spanner Studio 頁面輸入下列查詢:
GoogleSQL
SELECT * FROM INFORMATION_SCHEMA.ROLES;
PostgreSQL
SELECT * FROM information_schema.enabled_roles;
回應會包含目前角色,以及目前角色可透過繼承使用的角色權限。如要擷取所有角色,請使用 Google Cloud CLI 指令。
gcloud
如要取得未經過濾的資料庫角色清單,請輸入下列指令。
這項功能需要 spanner.databaseRoles.list
權限。
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
用戶端程式庫
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
查看授予資料庫角色的權限
如要查看授予角色的權限,請執行下列查詢:
GoogleSQL
SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE grantee = 'ROLE_NAME'; SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE grantee = 'ROLE_NAME'; SELECT * FROM INFORMATION_SCHEMA.CHANGE_STREAM_PRIVILEGES WHERE grantee = 'ROLE_NAME';
INFORMATION_SCHEMA.TABLE_PRIVILEGES
會傳回資料表和檢視表的權限。TABLE_PRIVILEGES
中的 SELECT
、INSERT
和 UPDATE
權限也會顯示在 COLUMN_PRIVILEGES
中。
PostgreSQL
SELECT * FROM information_schema.table_privileges WHERE grantee = 'ROLE_NAME'; SELECT * FROM information_schema.column_privileges WHERE grantee = 'ROLE_NAME'; SELECT * FROM information_schema.change_stream_privileges WHERE grantee = 'ROLE_NAME';
information_schema.table_privileges
會傳回資料表和檢視表的權限。
table_privileges
中的 SELECT
、INSERT
和 UPDATE
權限也會顯示在 column_privileges
中。
查看精細存取權控管機制使用者
如要查看細部存取控制使用者主體的清單,請執行下列指令。如要執行指令,您必須在專案中啟用 Cloud Asset API,並具備 cloudasset.assets.searchAllIamPolicies
IAM 權限。
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.fineGrainedAccessUser AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[].members[] \ --format='table(policy.bindings.members)'
輸出內容會與以下所示內容類似:
MEMBERS user:222larabrown@gmail.com user:baklavainthebalkans@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com serviceAccount:cs-fgac-sa-2@cloud-spanner-demo.google.com.iam.gserviceaccount.com
詳情請參閱「在專案中啟用 API」一文。 Google Cloud
查看具有資料庫存取權的主體
如要查看已獲准存取特定資料庫的主體清單,請執行下列指令。如要執行這些指令,您必須在專案中啟用 Cloud Asset API,並具備 cloudasset.assets.searchAllIamPolicies
IAM 權限。
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.databaseRoleUser AND policy:"resource.name" AND policy:/ROLE_NAME AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[].members[] \ --format='table(policy.bindings.members)'
輸出內容會與以下所示內容類似:
MEMBERS 222larabrown@gmail.com
查看主體的 IAM 條件
如要查看授予主體「Cloud Spanner 資料庫角色使用者」角色時指定的 IAM 條件清單,請執行下列指令:
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.databaseRoleUser AND policy:resource.name AND policy:"PRINCIPAL_IDENTIFIER" AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[] \ --format='table(policy.bindings.condition.expression)'
其中 PRINCIPAL_IDENTIFIER 為:
{ user:user-account-name | serviceAccount:service-account-name }
PRINCIPAL_IDENTIFIER範例:
user:222larabrown@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com
下列範例輸出內容顯示兩個條件運算式。
EXPRESSION resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_analyst") resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_manager")
檢查 IAM 政策是否缺少資料庫角色條件
將資料庫角色存取權授予主體後,建議您確保每個 IAM 繫結都指定了條件。
如要執行這項檢查,請執行下列指令:
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles:roles/spanner.databaseRoleUser AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' --flatten=policy.bindings[].members[]
輸出結果會與下列內容相似:
ROLE MEMBERS EXPRESSION roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-1@... roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-2@... resource.type == "spanner…"
請注意,第一個結果缺少條件,因此這個繫結中的主體可以存取所有資料庫角色。
捨棄資料庫角色
刪除資料庫角色時,系統會自動撤銷該角色在其他角色中的成員資格,並撤銷其他角色在該角色中的成員資格。
如要捨棄資料庫角色,請先執行下列操作:
- 從角色撤銷所有精細存取權控管權限。
- 移除參照該角色的所有 IAM 政策繫結,這樣之後建立的同名資料庫角色就不會沿用這些繫結。
控制台
如要捨棄資料庫角色,請按照下列步驟操作:
在資料庫的「總覽」頁面中,按一下「Spanner Studio」。
如要撤銷角色的權限,請輸入
REVOKE
陳述式。GoogleSQL
如要瞭解
REVOKE
陳述式的語法詳細資料,請參閱 GoogleSQL 資料定義語言。如要瞭解權限,請參閱精細的存取權控管權限。舉例來說,如要從資料庫角色
hr_manager
撤銷資料表employees
和contractors
的SELECT
、INSERT
和UPDATE
權限,請輸入下列陳述式:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
PostgreSQL
如要瞭解
REVOKE
陳述式的語法詳細資料,請參閱 PostgreSQL 資料定義語言。如要瞭解權限,請參閱精細的存取權控管權限。舉例來說,如要從資料庫角色
hr_manager
撤銷employees
和contractors
資料表的SELECT
、INSERT
和UPDATE
權限,請輸入下列陳述式:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM hr_manager;
您可以為
REVOKE
陳述式使用 DDL 範本。在「Explorer」窗格中,前往要撤銷權限的角色。按一下「查看動作」 ,然後選取要撤銷此角色存取權的權限類型。REVOKE
範本陳述式會在新編輯器分頁中填入。刪除與該角色相關聯的所有 IAM 條件。
在「資訊面板」的角色清單中,找出旁邊有感興趣條件標題的「Cloud Spanner 資料庫角色使用者」角色,然後展開該角色,查看有權存取該角色的主體。
按一下其中一個主體的「編輯主體」 (鉛筆) 圖示。
在「編輯存取權」頁面,點選「Cloud Spanner 資料庫角色使用者」角色旁的「刪除角色」 (垃圾桶) 圖示。
按一下 [儲存]。
針對條件下列出的其他主體,重複前三個步驟。
如要捨棄角色,請前往「Spanner Studio」頁面,然後輸入下列陳述式:
DROP ROLE ROLE_NAME;
按一下「提交」。
gcloud
如要撤銷角色的所有權限,然後捨棄該角色,請使用
gcloud spanner databases ddl update
指令,如下所示:GoogleSQL
gcloud spanner databases ddl update DATABASE_NAME \ --instance=INSTANCE_NAME \ --ddl='REVOKE PERMISSIONS ON TABLE TABLE_NAME FROM ROLE ROLE_NAME; DROP ROLE ROLE_NAME;'
PostgreSQL
gcloud spanner databases ddl update DATABASE_NAME \ --instance=INSTANCE_NAME \ --ddl='REVOKE PERMISSIONS ON TABLE TABLE_NAME FROM ROLE_NAME; DROP ROLE ROLE_NAME;'
PERMISSIONS
的有效值為SELECT
、INSERT
、UPDATE
和DELETE
。如要刪除任何相關的 IAM 條件,請使用
gcloud spanner databases remove-iam-policy-binding
指令,如下所示:gcloud spanner databases remove-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=ROLE_NAME \ --member=MEMBER_NAME \ --condition=CONDITION
MEMBER_NAME
是主體的 ID。格式必須為user|group|serviceAccount:email
或domain:domain
。CONDITION
是 IAM 條件運算式,用於指定要授予主體的角色。CONDITION
的格式如下:--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
整個條件規格必須與授權指令中使用的條件規格完全相符,包括標題和說明。
用戶端程式庫
這兩個程式碼範例都會建立及捨棄資料庫角色。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby