Spanner 精细访问权限控制功能结合了 Identity and Access Management (IAM) 和基于角色的 SQL 访问权限控制的优势。借助精细的访问权限控制,您可以定义数据库角色、向角色授予特权,以及创建 IAM 政策,以向 IAM 正文授予数据库角色的权限。
作为管理员,您必须为个别 IAM 正文启用精细访问权限控制。启用了精细访问权限控制的主账号(“精细访问权限控制用户”)必须承担数据库角色才能访问 Spanner 资源。
非精细访问权限控制用户的资源访问权限受 IAM 数据库级角色的约束。精细访问权限控制功能与现有的 IAM 数据库级访问权限控制功能完全兼容,并且可以共存。您可以使用它访问各个数据库对象。如需控制对整个数据库的访问权限,请使用 IAM 角色。
借助精细的访问权限控制,您可以控制对表、列、视图和变更数据流的访问权限。
如需管理精细访问权限控制,您可以使用以下 DDL 语句:
- 用于创建和删除数据库角色的
CREATE
和DROP
语句。 数据库角色是一组特权。您最多可以为一个数据库创建 100 个角色。 GRANT
和REVOKE
语句,用于向数据库角色授予和撤消权限。权限包括SELECT
、INSERT
、UPDATE
、DELETE
和EXECUTE
。权限名称与同名 SQL 语句相对应。例如,具有INSERT
权限的角色可以对GRANT
语句中指定的表执行INSERT
SQL 语句。以下 DDL 语句会将表
employees
上的SELECT
授予hr_rep
数据库角色。GoogleSQL
CREATE ROLE hr_rep; GRANT SELECT ON TABLE employees TO ROLE hr_rep;
PostgreSQL
CREATE ROLE hr_rep; GRANT SELECT ON TABLE employees TO hr_rep;
如需详细了解权限,请参阅精细访问权限控制权限参考文档。
用于向其他角色授予角色的
GRANT
语句,以创建具有权限继承的角色层次结构。
使用场景
以下是精细访问权限控制的示例用例:
- 一个人力资源信息系统,其中包含销售薪酬分析师、销售管理和人力资源分析师角色,每个角色对数据的访问权限级别各不相同。例如,薪酬分析师和销售管理人员不应看到社会保障号。
- 一款为乘客和司机提供不同服务账号和权限的共享车辆应用。
- 允许
SELECT
和INSERT
操作,但不允许UPDATE
和DELETE
操作的分类账。
Spanner 资源及其权限
下面列出了 Spanner 资源以及您可以为其授予的精细访问权限控制特权。
- 架构
- 您可以向特定数据库角色授予架构的
USAGE
特权。对于非默认架构,数据库角色必须具有USAGE
特权才能访问数据库对象。权限检查如下所示 :
架构中是否有 USAGE
?
否:拒绝授予访问权限。
是:您对该表格还有适当的权限吗?
否:拒绝授予访问权限。
是:您可以访问该表。
- Tables
- 您可以向数据库角色授予表的
SELECT
、INSERT
、UPDATE
和DELETE
权限。对于交错表,在父表上授予的权限不会传播到子表。 - Columns
- 您可以对表中的部分列授予
SELECT
、INSERT
和UPDATE
。此时,该权限仅适用于这些列。不允许在列级使用DELETE
。 - 视图
- 您可以向视图授予
SELECT
权限。视图仅支持SELECT
。Spanner 同时支持调用方的权限视图和定义方的权限视图。如果您使用调用方的权限创建视图,则数据库角色或用户需要对视图拥有SELECT
权限,还需要对视图中引用的底层对象拥有SELECT
权限,才能查询该视图。如果您使用定义者权限创建视图,则数据库角色或用户只需对该视图拥有SELECT
权限,即可查询该视图。如需了解详情,请参阅视图概览。 - 变更流
- 您可以对变更数据流授予
SELECT
。您还必须向与变更数据流关联的读取函数授予EXECUTE
。如需了解详情,请参阅变更数据流的精细访问权限控制。 - 序列
- 您可以对序列授予
SELECT
和UPDATE
。如需了解详情,请参阅序列的精细访问权限控制。 - 模型
- 您可以为模型授予
EXECUTE
。如需了解详情,请参阅对模型的精细访问权限控制。
精细访问权限控制系统角色
精细访问权限控制为每个数据库预定义了系统角色。与用户定义的数据库角色一样,系统角色也可以控制对 Spanner 资源的访问权限。
例如,精细访问权限控制用户需要被授予 spanner_sys_reader
系统角色才能访问密钥可视化工具,并且需要拥有 spanner_info_reader
系统角色才能在查询 INFORMATION_SCHEMA
表时查看未过滤的结果。
如需了解详情,请参阅精细访问权限控制系统角色。
数据库角色层次结构和继承
您可以创建数据库角色的层次结构,其中子角色会继承父级角色的特权。子角色称为父级角色的成员。
例如,请考虑以下 GRANT
语句:
GoogleSQL
GRANT SELECT ON TABLE employees TO ROLE pii_access;
GRANT ROLE pii_access TO ROLE hr_manager, hr_director;
PostgreSQL
GRANT SELECT ON TABLE employees TO pii_access;
GRANT pii_access TO hr_manager, hr_director;
hr_manager
和 hr_director
是角色 pii_access
的成员,并继承了表 employees
上的 SELECT
权限。
hr_manager
和 hr_director
也可以有成员,这些成员将继承 employees
上的 SELECT
权限。
角色层次结构的深度没有限制,但如果角色层次结构深度和广度较大,查询性能可能会降低。
备份和恢复
Spanner 备份包含数据库角色定义。从备份恢复数据库时,系统会重新创建数据库角色及其已授予的权限。不过,IAM 政策不属于数据库备份的一部分,因此您必须向已恢复数据库中的正文重新授予对数据库角色的访问权限。
精细访问权限控制设置概览
以下是开始使用精细访问权限控制来保护数据的大致步骤。如需了解详情,请参阅配置精细访问权限控制。
您必须获得 roles/spanner.admin
或 roles/spanner.databaseAdmin
IAM 角色才能执行这些任务。
- 创建数据库角色并向这些角色授予权限。
- 可选:通过向其他角色授予角色,创建具有继承关系的角色层次结构。
- 针对要成为精细访问权限控制用户的每个主账号执行以下步骤:
- 为正文启用精细的访问权限控制。然后,系统会自动向主账号授予
public
数据库角色,该角色默认没有任何权限。这对每个正文来说都是一次性操作。 - 向主账号授予一个或多个数据库角色的 IAM 权限。
- 向主账号授予所有所需的数据库角色后,如果主账号具有数据库级 IAM 角色,请考虑撤消数据库级角色,以便仅通过一种方法管理主账号的访问权限控制。
- 为正文启用精细的访问权限控制。然后,系统会自动向主账号授予
限制
- 导出操作不会导出数据库角色和权限,导入操作也无法导入这些内容。导入完成后,您必须手动设置角色和权限。
- Google Cloud 控制台中“表格”页面上的“数据”标签页不适用于精细访问权限控制用户。
后续步骤
如需了解详情,请参阅以下主题:
- 使用精细访问权限控制访问数据库
- 变更数据流的精细访问权限控制
- 配置精细访问权限控制
- 精细访问权限控制权限参考
- 精细访问权限控制系统角色
- GoogleSQL
GRANT
和REVOKE
语句 - PostgreSQL
GRANT
和REVOKE
语句 - 对序列的精细访问权限控制
- 对模型的精细访问权限控制