精细访问权限控制概览

Spanner 精细的访问权限控制兼具 Identity and Access Management (IAM) 和基于角色的 SQL 访问权限控制的优势。借助精细的访问权限控制,您可以定义数据库角色、向这些角色授予权限,并创建 IAM 政策以向 IAM 主账号授予对数据库角色的权限。本页面介绍了如何将精细访问权限控制与 Spanner 搭配使用,以用于 GoogleSQL 方言数据库和 PostgreSQL 方言数据库。

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

对于非精细访问权限控制用户,资源访问权限由 IAM 数据库级角色控制。 精细访问权限控制完全兼容,可以与现有的 IAM 数据库级访问权限控制共存。您可以使用它来访问各个数据库对象。如需控制对整个数据库的访问权限,请使用 IAM 角色

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

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

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

    以下 DDL 语句向 hr_rep 数据库角色授予对表 employeesSELECT 权限。

    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 资源以及您可以为其授予的精细访问权限控制权限

架构
您可以向特定数据库角色授予对架构的 USAGE 权限。对于非默认架构,数据库角色必须具有 USAGE 权限才能访问数据库对象。权限检查如下所示

您是否拥有架构的 USAGE 权限?

否:拒绝访问。

是:您是否还拥有该表的相应权限?

否:拒绝访问。

是:您可以访问该表。

您可以向数据库角色授予针对表的 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 控制台的表格页面上的数据标签页不适用于精细的访问权限控制用户。

后续步骤