精细访问权限控制概览

Spanner 精细的访问权限控制兼具 Identity and Access Management (IAM) 和基于角色的传统 SQL 访问权限控制的优势。通过精细的访问权限控制,您可以定义数据库角色、为角色授予权限,并创建 IAM 政策以向 IAM 主帐号授予数据库角色的权限。

作为管理员,您必须为各个 IAM 主账号启用精细的访问权限控制。启用了精细访问权限控制的主账号(“精细访问权限控制用户”)必须承担访问 Spanner 资源的数据库角色。

非精细访问权限控制用户的资源访问权限受 IAM 数据库级角色控制。精细的访问权限控制与现有的 IAM 数据库级访问权限控制完全兼容,可以共存。

通过精细的访问权限控制,您可以控制对表、列、视图和变更数据流的访问权限。

如需管理精细的访问权限控制,请使用以下 DDL 语句:

  • 用于创建和删除数据库角色的 CREATEDROP 语句。数据库角色是权限的集合。您最多可以为一个数据库创建 100 个角色。
  • GRANTREVOKE 语句,用于授予和撤消数据库角色的权限。权限包括 SELECTINSERTUPDATEDELETEEXECUTE。权限名称与名称相似的 SQL 语句相对应。例如,具有 INSERT 权限的角色可以对 GRANT 语句中指定的表执行 INSERT SQL 语句。

    以下 DDL 语句会将表 employeesSELECT 授予 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 语句,用于向其他角色授予角色以创建角色层次结构(具有权限继承)。

使用场景

以下是精细访问权限控制的示例用例:

  • 一个人力资源信息系统,具有销售薪酬分析师、销售管理和 HR 分析师角色,每个角色对数据都有不同的访问权限级别。例如,薪酬分析师和销售管理不应看到社会保障号。
  • 一款为乘客和司机提供不同服务帐号和权限的拼车应用。
  • 一个分类记录器,允许 SELECTINSERT 操作,但不允许 UPDATEDELETE 操作。

Spanner 资源及其特权

下面列出了 Spanner 资源以及您可以为这些资源授予的精细访问权限控制权限

您可以向数据库角色授予表的 SELECTINSERTUPDATEDELETE 权限。对于交错表,对父表授予的权限不会传播到子表。
您可以对表中的部分列授予 SELECTINSERTUPDATE 权限。然后,该权限将仅对这些列有效。不允许在列级别使用 DELETE
视图
您可以授予针对某个视图的 SELECT 权限。视图仅支持 SELECT。Spanner 支持调用者的权限视图和定义者的权限视图。如果您创建了具有调用方权限的视图,那么数据库角色或用户需要拥有该视图的 SELECT 权限,以及该视图中引用的底层对象的 SELECT 权限,才能查询该视图。如果您创建了具有定义者权限的视图,那么数据库角色或用户只需拥有该视图的 SELECT 权限即可查询该视图。如需了解详情,请参阅视图概览
变更数据流
您可以授予对变更数据流的 SELECT 权限。您还必须对与变更流关联的读取函数授予 EXECUTE 权限。如需了解相关信息,请参阅变更数据流的精细访问权限控制
序列
您可以授予序列的 SELECTUPDATE 权限。有关信息,请参阅针对序列的精细访问权限控制
模型
您可以向模型授予 EXECUTE 权限。如需了解相关信息,请参阅模型的精细访问权限控制

精细的访问权限控制系统角色

精细的访问权限控制为每个数据库预定义了系统角色。与用户定义的数据库角色一样,系统角色可以控制对 Spanner 资源的访问权限。

例如,需要向精细的访问权限控制用户授予 spanner_sys_reader 系统角色才能访问 Key Visualizer,并且需要 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_managerhr_director 是角色 pii_access 的成员,并且继承表 employeesSELECT 权限。

特权继承

hr_managerhr_director 也可以具有成员,并且这些成员会继承 employeesSELECT 权限。

角色层次结构的深度没有限制,但如果角色层次结构深度较广,查询性能可能会下降。

备份和恢复

Spanner 备份包含数据库角色定义。从备份恢复数据库时,系统会重新创建数据库角色并授予其授予的权限。但是,IAM 政策不是数据库备份的一部分,因此您必须向已恢复的数据库中的主账号重新授予对数据库角色的访问权限。

关于设置精细访问权限控制的概览

以下是开始使用精细访问权限控制来保护数据安全时需执行的简要步骤。如需了解详情,请参阅配置精细的访问权限控制

您必须具有 roles/spanner.adminroles/spanner.databaseAdmin IAM 角色才能执行这些任务。

  1. 创建数据库角色并为这些角色授予权限。
  2. 可选:通过向其他角色授予角色来创建具有继承关系的角色层次结构。
  3. 为每个要成为精细访问权限控制用户的主帐号执行以下步骤:
    1. 为主账号启用精细的访问权限控制。 然后,系统会自动向主账号授予 public 数据库角色,该角色默认没有权限。对于每个主帐号,这项操作只需执行一次。
    2. 向主帐号授予一个或多个数据库角色的 IAM 权限。
    3. 在为主账号授予所有必需的数据库角色后,如果主账号具有数据库级 IAM 角色,请考虑撤消数据库级角色,以便主账号的访问权限控制只通过一种方法进行管理。

限制

  • 导出操作不会导出数据库角色和权限,导入操作也无法导入这些内容。导入完成后,您必须手动设置角色和权限。
  • Google Cloud 控制台页面上的数据标签页不适用于精细访问权限控制用户。
  • UPDATEDELETE 操作要求所有键列具有 SELECT 权限。

后续步骤

如需了解详情,请参阅以下主题: