配置精细的访问权限控制

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面介绍如何为 Cloud Spanner 数据库配置精细的访问权限控制。

如需了解精细的访问权限控制,请参阅精细的访问权限控制简介

如需配置精细的访问权限控制,请按以下步骤操作:

  1. 创建数据库角色并授予权限

  2. 可选:创建继承角色层次结构

  3. 向 IAM 主帐号授予数据库角色的访问权限

配置数据库角色后,精细的访问权限控制用户必须选择一个角色才能对数据库执行查询、DML 或行操作。

创建数据库角色并授予权限

数据库角色是一组精细的访问权限。您最多可为每个数据库创建 100 个数据库角色。

确定数据库中的角色和角色层次结构,并使用 DDL 对其进行编码。与 Spanner 中的其他架构更改一样,我们强烈建议您批量发出架构更改,而不是单独进行。如需了解详情,请参阅限制架构更新的频率

控制台

如需创建数据库角色并向其授予精细的访问权限,请按以下步骤操作:

  1. 转到 Google Cloud Console 中的实例页面。

    实例

  2. 选择包含要为其添加角色的数据库的实例。

  3. 选择数据库。

  4. 概览页面上,点击编写 DDL

  5. 编写 DDL 语句页面上,针对您要创建和授予其权限的每个数据库角色,请按以下步骤操作:

    1. 如需创建角色,请输入以下语句:

      CREATE ROLE ROLE_NAME;
      

    2. 如需向角色授予权限,请输入以下语句:

      GRANT PRIVILEGE_LIST ON TABLE TABLE_LIST TO ROLE ROLE_NAME;
      

      • PRIVILEGE_LIST 是以英文逗号分隔的权限列表。允许的权限为 SELECTINSERTUPDATEDELETEDELETE 只能在表级别使用。

      • TABLE_LIST 是以英文逗号分隔的表列表。

      例如,如需将表 employeescontractors 上的 SELECTINSERTUPDATE 授予数据库角色 hr_manager,请输入以下语句:

      GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
      

      您可以授予一系列角色的权限,而不是只授予一个角色。

      您可以授予对表子集子集的每项权限。如需查看示例,请参阅精细的访问权限控制权限。如需详细了解 GRANT 语句的语法,请参阅 Google 标准 SQL 数据定义语言

      您可以对 GRANT 语句使用 DDL 模板。在 DDL 模板下拉菜单中,选择数据库角色,然后在授予角色权限下选择一个模板。

  6. 点击提交

    如果 DDL 中出现错误,Google Cloud Console 会返回错误。

gcloud

如需创建数据库角色并向其授予精细的访问权限,请按如下所示使用 gcloud spanner databases ddl update 命令:

gcloud spanner databases ddl update DATABASE_NAME \
--ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'
  • PRIVILEGES 是以英文逗号分隔的精细访问权限控制权限的列表。允许的权限为 SELECTINSERTUPDATEDELETE

  • TABLES 是以英文逗号分隔的表列表。

例如,如需将表 employeescontractors 上的 SELECTINSERTUPDATE 授予数据库角色 hr_manager,请输入以下语句:

GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;

您可以授予一系列角色的权限,而不是只授予一个角色。

您可以授予对表子集子集的每项权限。如需查看示例,请参阅精细的访问权限控制权限。如需详细了解 GRANT 语句的语法,请参阅 Google 标准 SQL 数据定义语言

创建继承角色层次结构

您可以通过向一个数据库角色授予另一个数据库角色来创建数据库角色的层次结构。子角色(称为“成员角色”)继承父角色的权限。

如需向另一个数据库角色授予某个数据库角色,请使用以下语句:

GRANT ROLE role1 TO ROLE role2;

如需了解详情,请参阅数据库角色层次结构和继承

向 IAM 主帐号授予对数据库角色的访问权限

您可以使用 IAM 授予对数据库角色的访问权限。

控制台

如需向主帐号授予数据库角色的访问权限,请按以下步骤操作:

  1. 在数据库概览页面上,如果信息面板尚未打开,请点击显示信息面板

  2. 点击添加主帐号

  3. 添加主帐号和角色面板的新的主帐号中,指定一个或多个 IAM 主帐号。

  4. 角色菜单中,选择 Cloud Spanner > Cloud Spanner 精细控制的用户

    您只需向每个主帐号授予此角色一次。这使得主帐号成为精细的访问权限控制用户。

  5. 点击添加其他角色

  6. 选择角色菜单中,选择 Cloud Spanner > Cloud Spanner Database 角色用户

  7. 请按照以下步骤创建 IAM 条件,以指定要授予的角色。

    1. 点击添加条件

    2. 修改条件面板中,输入条件的标题和说明。

      如果要授予单个数据库角色,您通常需要在条件标题中添加角色名称。如果您要授予多个角色,则可以指明一组角色的相关信息。

    3. 点击条件编辑器

    4. 表达式字段中,输入以下代码:

      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"))
      

      此代码会授予两个角色。将 ROLE1ROLE2 替换为您的角色名称。要授予两个以上的角色,请添加更多条件。

      您可以使用 IAM 支持的任何条件表达式。如需了解详情,请参阅 IAM 条件概览

    5. 点击保存

    6. 返回添加主帐号面板,验证该条件是否显示在角色字段旁边的条件列下方。

    7. 点击保存

      返回信息面板角色/主帐号下,您会注意到,对于每个已定义的条件,系统会显示 Cloud Spanner Database 角色用户。条件旁边的括号中的数字表示该条件授予数据库角色的主帐号数量。

    8. 如需更正数据库角色名称或条件中的错误,或为主帐号添加其他数据库角色,请按以下步骤操作:

      1. 展开与所需条件对应的 Cloud Spanner Database 角色用户条目。

      2. 修改权限页面上,执行以下操作之一:

        • 点击添加其他角色

        • 如需修改条件,请点击条件名称旁边的铅笔图标。然后在修改条件页面上,点击条件编辑器,并进行更正。

gcloud

如需向 IAM 主帐号授予对数据库角色的访问权限,请按以下步骤操作:

  1. 使用 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
    
    • MEMBER_NAME 是主帐号的标识符。它必须是 user|group|serviceAccount:emaildomain:domain 格式。

    • 此命令使主帐号成为精细的访问权限控制用户。请为每个主帐号仅提交一次此命令。

  2. 使用 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:emaildomain:domain 格式。

    • CONDITION 是一个 IAM 条件表达式,用于指定要授予主帐号的角色。

      CONDITION 采用以下格式:

      --condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
      

      此代码会授予两个角色。将 ROLE1ROLE2 替换为您的角色名称。如需仅授予一个数据库角色,请删除 || 运算符后面的表达式。如需授予两个以上的角色,请使用 || 运算符添加更多条件。

      您可以使用 IAM 支持的任何条件表达式。如需了解详情,请参阅 IAM 条件概览

    以下示例会向主帐号 jsmith@example.com 授予数据库角色 hr_rephr_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'
    

将主帐号转换为精细的访问权限控制

如需将 IAM 主帐号从数据库级访问权限控制转换为精细的访问权限控制,请按以下步骤操作:

  1. 为主帐号启用精细的访问权限控制,并授予对所有必需数据库角色的访问权限,如向 IAM 主帐号授予数据库角色的访问权限中所述。

  2. 更新以此主帐号身份运行的所有应用。在调用客户端库方法时指定适当的数据库角色。

  3. 撤消主帐号的所有 IAM 数据库级角色。这样,主帐号的访问权限仅受一种方法控制。

    控制台

    gcloud

    • 如需撤消 IAM 数据库级角色,请输入以下命令:

      gcloud spanner databases remove-iam-policy-binding DATABASE_NAME \
      --instance=INSTANCE_NAME \
      --role=roles/IAM_ROLE_NAME \
      --member=MEMBER_NAME
      
      • MEMBER_NAME 是主帐号的标识符。它必须是 user|group|serviceAccount:emaildomain:domain 格式。

列出数据库角色

如需使用 Google Cloud Console 列出数据库角色,请在数据库的查询页面上输入以下查询:

  SELECT * FROM INFORMATION_SCHEMA.ROLES;

查看授予数据库角色的权限

要查看向所有表授予的角色的权限,请使用以下查询:

  SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE grantee = ROLE_NAME;
  

要查看向所有列授予的角色的权限,请使用以下查询:

  SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE grantee = ROLE_NAME;
  

删除数据库角色

如果删除某个数据库角色,系统会自动撤消该角色其他角色的成员资格,并撤消该角色在其他角色中的成员资格。

您必须先撤消某个数据库角色的所有权限,然后才能删除该角色。无论主帐号是否具有该数据库权限,您都可以删除数据库角色。

在删除数据库角色之前,请移除任何引用该角色的 IAM 政策绑定,以便稍后使用同一名称创建的数据库角色不会继承这些绑定。

控制台

如需删除数据库角色,请按以下步骤操作:

  1. 在数据库概览页面上,点击编写 DDL

  2. 如需撤消角色的权限,请输入以下语句:

    REVOKE PRIVILEGE_LIST ON TABLE TABLE_LIST FROM ROLE ROLE_NAME;
    

    • PRIVILEGE_LIST 是以英文逗号分隔的权限列表。允许的权限为 SELECTINSERTUPDATEDELETE

    • TABLE_LIST 是以英文逗号分隔的表列表。

    例如,如需从数据库角色 hr_manager 中撤消表 employees 和表 contractors 上的 SELECTINSERTUPDATE,请输入以下语句:

    REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
    
  3. 如需移除角色,请输入以下语句:

    DROP ROLE ROLE_NAME;
    

  4. 要应用更新,请点击提交

  5. 删除与角色关联的所有 IAM 条件。

    1. 信息面板上的角色列表中,找到具有相关条件标题的 Cloud Spanner Database 角色用户角色,然后展开该角色以查看有权访问该角色的主帐号。

    2. 点击其中一个主帐号对应的修改主帐号(铅笔)图标。

    3. 修改权限页面上,点击条件旁边的修改 IAM 条件(铅笔)图标。

    4. 修改条件页面上,点击删除

    5. 确认删除,然后点击保存

gcloud

  1. 如需撤消某个角色的所有权限,然后删除该角色,请使用 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 的有效值包括 SELECTINSERTUPDATEDELETE

  2. 如需删除任何相关 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:emaildomain:domain 格式。

    • CONDITION 是一个 IAM 条件表达式,用于指定要授予主帐号的角色。

      CONDITION 采用以下格式:

      --condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
      

      整个条件规范必须与授予权限的命令(包括标题和说明)中使用的条件规范完全一致。

更多信息