本页面介绍如何为 Cloud Spanner 数据库配置精细的访问权限控制。
如需了解精细访问权限控制,请参阅精细访问权限控制简介。
配置精细的访问权限控制涉及以下步骤:
这样,精细的访问权限控制用户就必须指定数据库角色,才能对数据库执行查询、DML 或行操作。
创建数据库角色并授予权限
数据库角色是一组精细的访问权限。您最多可以为每个数据库创建 100 个数据库角色。
确定数据库中的角色和角色层次结构,并以 DDL 对其进行编码。与 Spanner 中的其他架构更改一样,我们强烈建议您批量发出架构更改,而不是单独发出更改。如需了解详情,请参阅限制架构更新频率。
控制台
如需创建数据库角色并向其授予细化的访问权限,请按以下步骤操作:
前往 Google Cloud 控制台中的实例页面。
选择包含要为其添加角色的数据库的实例。
选择数据库。
在概览页面上,点击编写 DDL。
在编写 DDL 语句页面上,对于您要创建和向其授予权限的每个数据库角色,请按以下步骤操作:
如需创建角色,请输入以下语句:
CREATE ROLE ROLE_NAME;
先不要点击 Submit。
如需向该角色授予权限,请在
CREATE ROLE
语句后的下一行输入GRANT
语句。如需详细了解
GRANT
语句的语法,请参阅 GoogleSQL 数据定义语言。如需了解权限,请参阅精细访问权限控制。例如,如需将表
employees
和contractors
上的SELECT
、INSERT
和UPDATE
授予数据库角色hr_manager
,请输入以下语句:GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
您可以对
GRANT
语句使用 DDL 模板。在 DDL 模板下拉菜单中,选择数据库角色,然后在授予角色权限下选择一个模板。
点击提交。
如果 DDL 中存在错误,Google Cloud 控制台会返回错误。
gcloud
如需创建数据库角色并向其授予细化的访问权限,请将 gcloud spanner databases ddl update
命令与 CREATE ROLE
和 GRANT
语句一起使用。
如需详细了解 CREATE ROLE
和 GRANT
语句,请参阅 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;'
PRIVILEGES
是以英文逗号分隔的精细访问权限控制权限的列表。如需了解权限,请参阅精细访问权限控制权限。TABLES
是以英文逗号分隔的表列表。
例如,如需向表 hr
中的数据库 hrdb1
授予表 employees
和 contractors
的 SELECT
、INSERT
和 UPDATE
权限,请输入以下语句:
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;'
客户端库
这些代码示例均可创建和删除数据库角色。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
创建具有继承的角色层次结构
您可以通过向一个数据库角色授予另一个数据库角色来创建数据库角色层次结构。子角色(称为成员角色)会继承父角色的权限。
如需向另一个数据库角色授予某个数据库角色,请使用以下语句:
GRANT ROLE role1 TO ROLE role2;
如需了解详情,请参阅数据库角色层次结构和继承。
向 IAM 主帐号授予数据库角色的访问权限
您可以使用 IAM 授予对数据库角色的访问权限。
控制台
如需向 IAM 主帐号授予对数据库角色的访问权限,请按以下步骤操作:
在数据库概览页面上,如果信息面板尚未打开,请点击显示信息面板。
点击添加主帐号。
在授予 database_name 的访问权限面板的添加主帐号下,指定一个或多个 IAM 主帐号。
在分配角色下的选择角色菜单中,依次选择 Cloud Spanner > Cloud Spanner Fine-粒度访问权限用户。
您只需向每个主帐号授予此角色一次。这会使主帐号成为精细的访问权限控制用户。
点击添加其他角色
在选择角色菜单中,选择 Cloud Spanner > Cloud Spanner Database Role User。
请按照以下步骤创建 IAM 条件,以指定要授予的角色。
在 Cloud Spanner Database Role User 角色旁边,点击添加 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 条件概览。
点击保存。
返回上一面板,验证条件显示在 Role 字段旁边的 IAM Condition 列下。
点击保存。
返回信息面板,在角色/主帐号下,请注意对于每个定义的条件,系统会显示 Cloud Spanner Database Role User。
条件旁边的括号中的数字表示该条件授予数据库角色的主帐号数量。您可以点击展开箭头查看主帐号列表。
如需更正数据库角色名称或条件中的错误,或者为主帐号添加其他数据库角色,请按以下步骤操作:
展开 Cloud Spanner Database Role User 条目,该条目会列出所需的条件。
点击主帐号旁边的修改(铅笔)图标。
在对“database_name”的修改权限上,执行以下操作之一:
点击添加其他角色
如需修改条件,请点击条件名称旁边的修改(铅笔)图标。然后在修改条件页面上,点击条件编辑器,进行更正,然后点击保存两次。
gcloud
如需向 IAM 主帐号授予对数据库角色的访问权限,请按以下步骤操作:
使用
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
是主帐号的标识符。它必须采用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
是主帐号的标识符。它必须采用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
替换为您的角色名称。如需授予两个以上的角色,请使用||
运算符添加更多条件。您可以使用 IAM 支持的任何条件表达式。如需了解详情,请参阅 IAM 条件概览。
如果成功,该命令将输出数据库的完整政策。
以下示例会向主帐号
jsmith@example.com
授予数据库角色hr_rep
和hr_manager
。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
将主帐号转换为精细的访问权限控制机制
如需将 IAM 主帐号从数据库级访问权限控制转换为精细访问权限控制,请按以下步骤操作:
按照向 IAM 主帐号授予数据库角色的访问权限中所述,为主帐号启用精细的访问权限控制,并授予对所有必需的数据库角色的访问权限。
更新以主帐号身份运行的所有应用。在调用客户端库方法时指定适当的数据库角色。
撤消主帐号的所有 IAM 数据库级角色。这样,主帐号的访问权限便只受一种方法控制。
如需撤消 IAM 数据库级角色,请按照移除数据库级权限中的说明操作。
列出数据库角色
您可以列出与数据库关联的数据库角色。
控制台
如需列出数据库角色,请在数据库的查询页面上输入以下查询:
SELECT * FROM INFORMATION_SCHEMA.ROLES;
响应包括当前角色及其当前角色通过继承可以使用的角色。如需提取所有角色,请使用 gcloud 命令。
gcloud
如需获取未经过滤的数据库角色列表,请输入以下命令。
它需要 spanner.databaseRoles.list
权限。
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
客户端库
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
查看授予数据库角色的权限
如需查看授予某角色的权限,请运行以下查询:
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
如需了解详情,请参阅在 Google Cloud 项目中启用 API。
查看有权访问数据库角色的 IAM 主帐号
如需查看已被授予特定数据库角色的主帐号列表,请运行以下命令。如需运行该命令,您必须在项目中启用 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 Database Role User 角色时指定的 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 政策绑定,以便稍后使用相同名称创建的数据库角色不会继承这些绑定。
控制台
如需删除数据库角色,请按以下步骤操作:
在数据库概览页面上,点击编写 DDL。
如需撤消此角色的权限,请输入
REVOKE
语句。如需详细了解
REVOKE
语句的语法,请参阅 GoogleSQL 数据定义语言。如需了解权限,请参阅精细访问权限控制。例如,如需从数据库角色
hr_manager
上撤消表employees
和contractors
的SELECT
、INSERT
和UPDATE
,请输入以下语句:REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
您可以对
REVOKE
语句使用 DDL 模板。在 DDL 模板下拉菜单中,选择数据库角色,然后在撤消角色权限下选择一个模板。删除与角色关联的所有 IAM 条件。
在信息面板上的角色列表中,找到具有相关条件标题的 Cloud Spanner Database Role User 角色,然后展开该角色以查看有权访问该角色的主帐号。
对于其中一个主帐号,请点击修改主帐号(铅笔)图标。
在修改访问权限页面上,点击与 Cloud Spanner Database Role User 角色旁边的删除角色(垃圾桶)图标。
点击保存。
针对满足该条件的其他主帐号重复执行上述三个步骤。
如需撤消此角色,请转到编写 DDL 页面,然后输入以下语句:
DROP ROLE ROLE_NAME;
点击提交。
gcloud
如需撤消某个角色的所有权限,然后删除该角色,请使用
gcloud spanner databases ddl update
命令,如下所示: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;'
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
是主帐号的标识符。它必须采用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