本页介绍了如何为 GoogleSQL 方言数据库和 PostgreSQL 方言数据库配置精细的访问权限控制。
如需了解精细访问权限控制,请参阅精细访问权限控制简介。
请按以下步骤配置精细访问权限控制:
然后,精细访问权限控制用户必须指定数据库角色,才能对数据库执行查询、DML 或行操作。
准备工作
确保为每个要成为精细访问权限控制用户的主账号授予 Cloud Spanner Viewer
IAM 角色 (roles/spanner.viewer
)。对于必须在 Google Cloud 控制台中与 Spanner 资源互动的用户,建议在项目级层使用此角色。
如需了解相关说明,请参阅向正文授予权限。
创建数据库角色并授予权限
数据库角色是一组精细访问权限。您最多可以为每个数据库创建 100 个数据库角色。
确定数据库中的角色和角色层次结构,并在 DDL 中对其进行编码。与 Spanner 中的其他架构变更一样,我们强烈建议批量发出架构变更,而不是单独发出。如需了解详情,请参阅限制架构更新频率。
控制台
如需创建数据库角色并向其授予精细的访问权限,请按以下步骤操作:
前往 Google Cloud 控制台中的实例页面。
选择要为其添加角色的数据库所在的实例。
选择数据库。
在概览页面上,点击 Spanner Studio。
在 Spanner Studio 页面上,对于您要创建并向其授予特权的每个数据库角色,请按以下步骤操作:
如需创建该角色,请输入以下语句:
CREATE ROLE ROLE_NAME;
先不要点击提交。
如需向该角色授予权限,请在
CREATE ROLE
语句后面的下一行输入GRANT
语句。如需详细了解
GRANT
语句的语法,请参阅 GoogleSQL 数据定义语言。如需了解权限,请参阅精细访问权限控制权限。例如,如需向数据库角色
hr_manager
授予表employees
和contractors
的SELECT
、INSERT
和UPDATE
权限,请输入以下语句: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 模板。在探索器窗格中,前往您要授予特权的角色。点击 查看操作,然后选择您要为此角色授予访问权限的权限类型。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
是表的逗号分隔列表。
例如,如需向实例 hr
中数据库 hrdb1
中的 employees
和 contractors
表的 SELECT
、INSERT
和 UPDATE
授予数据库角色 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;
如需了解详情,请参阅数据库角色层次结构和继承。
向 IAM 主账号授予数据库角色的访问权限
主账号必须先获得对数据库角色的访问权限,然后才能使用数据库角色访问 Spanner 资源。
控制台
如需向 IAM 主账号授予对数据库角色的访问权限,请按以下步骤操作:
在数据库概览页面上,如果信息面板尚未打开,请点击显示信息面板。
点击添加主账号。
在授予对 database_name 的访问权限面板的添加主账号下,指定一个或多个 IAM 主账号。
在分配角色下,在选择角色菜单中,依次选择 Cloud Spanner > Cloud Spanner 精细访问权限用户。
您只需向每个正文授予一次此角色。它会将正文转换为精细访问权限控制用户。
点击添加其他角色
在选择角色菜单中,依次选择 Cloud Spanner > Cloud Spanner Database Role User。
请按照以下步骤创建用于指定要授予的角色的 IAM 条件。
在 Cloud Spanner Database Role User 角色旁边,点击添加 IAM 条件。
在添加条件面板中,输入条件的标题和选填性说明。
如果您要授予单个数据库角色,通常会在条件标题中添加角色名称。如果您要授予多个角色,可以指明这组角色的相关信息。
点击条件编辑器。
在 Expression 字段中,输入以下代码:
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 条件概览。
点击保存。
返回上一个面板,验证该条件是否显示在 IAM 条件列下 Role 字段旁边。
点击保存。
返回信息面板,在角色/主账号下方,您会发现为每个定义的条件都显示了 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
告知用户和开发者开始使用数据库角色
完成初始精细访问权限控制配置后,请告知用户和应用开发者,他们必须开始使用数据库角色。
精细访问权限控制用户在通过 Google Cloud 控制台或 Google Cloud CLI 访问 Spanner 数据库时,必须开始指定数据库角色。
使用精细访问权限控制的应用在访问数据库时必须指定数据库角色。
如需了解详情,请参阅使用精细访问权限控制访问数据库。
将正文转换为精细访问权限控制
如需将 IAM 正文从数据库级访问权限控制转换为精细访问权限控制,请按以下步骤操作:
为主账号启用精细访问权限控制,并授予对所有所需数据库角色的访问权限,如向 IAM 主账号授予对数据库角色的访问权限中所述。
更新以此主账号运行的所有应用。在调用客户端库方法时指定适当的数据库角色。
从主账号撤消所有 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
如需了解详情,请参阅在 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 政策绑定,以便日后使用相同名称创建的数据库角色不会继承这些绑定。
控制台
如需删除数据库角色,请按以下步骤操作:
在数据库概览页面上,点击 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 模板。在探索器窗格中,找到您要撤消特权的角色。点击 查看操作,然后选择您要撤消此角色对哪种权限的访问权限。REVOKE
模板语句会填充在新编辑器标签页中。删除与该角色关联的所有 IAM 条件。
在“信息”面板上的角色列表中,找到旁边带有所需条件标题的 Cloud Spanner Database Role User 角色,然后展开该角色以查看拥有该角色访问权限的主账号。
针对其中一个主账号,点击修改主账号(铅笔)图标。
在修改访问权限页面上,点击 Cloud Spanner Database Role User 角色旁边的删除角色(回收站)图标。
点击保存。
对条件下列出的其他正文重复上述三步。
如需删除该角色,请前往 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
是正文的标识符。必须采用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