本页面介绍了如何为 Cloud Storage 存储分区配置精细的访问权限控制, Spanner 数据库。
如需了解精细的访问权限控制,请参阅精细访问权限控制简介。
配置精细的访问权限控制涉及以下步骤:
然后,精细访问权限控制用户必须指定数据库角色,才能对数据库执行查询、DML 或行操作。
准备工作
确保向每个将成为精细访问权限控制用户的主账号授予
Cloud Spanner Viewer
IAM 角色 (roles/spanner.viewer
)。
对于必须与以下人员互动的用户,建议在项目级使用此角色:
Google Cloud 控制台中的 Spanner 资源。
有关说明,请参阅 向主账号授予权限。
创建数据库角色并授予权限
数据库角色是一组精细的访问权限。您最多可以为每个数据库创建 100 个数据库角色。
确定数据库中的角色和角色层次结构,并在 DDL 中对其进行编码。如 Spanner 中的其他架构更改,我们强烈建议您 批量更改架构,而不是单独更改。如需了解详情,请参阅限制架构更新频率。
控制台
如需创建数据库角色并向其授予精细的访问权限,请执行以下操作: 请按以下步骤操作:
前往 Google Cloud 控制台中的实例页面。
选择要为其添加角色的数据库所在的实例。
选择数据库。
在概览页面上,点击 Spanner Studio。
在 Spanner Studio 页面上,针对所需的每个数据库角色 要创建和授予权限,请按照以下步骤操作:
如需创建该角色,请输入以下语句:
CREATE ROLE ROLE_NAME;
先不要点击提交。
要授予角色权限,请在下一个中输入
GRANT
语句, 在CREATE ROLE
语句后添加这行代码。如需详细了解
GRANT
语句的语法, 请参阅 GoogleSQL 数据定义语言。 如需了解权限,请参阅精细访问权限控制权限。例如,如需授予
SELECT
,请执行以下操作: 将表employees
和contractors
上的INSERT
和UPDATE
移至 数据库角色hr_manager
,请输入以下语句: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;
您可以将 DDL 模板用于
GRANT
语句。在 探索器窗格中,前往您要向其授予的角色 权限。点击 查看操作 并选择您要授予此角色的权限类型。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
是表的逗号分隔列表。
例如,如需授予 SELECT
,请执行以下操作:
将 employees
和 contractors
表中的 INSERT
和 UPDATE
添加到
实例 hr
中数据库 hrdb1
的数据库角色 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。
请按照以下步骤创建 指定要授予的角色。
在 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 条件概览。
如果成功,该命令将输出数据库的整个政策。
以下示例授予数据库角色
hr_rep
和hr_manager
到主账号jsmith@example.com
。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
使用精细访问权限控制的应用在以下情况下必须指定数据库角色: 访问数据库。
如需了解详情,请参阅 通过精细的访问权限控制机制访问数据库。
将主账号转换为精细的访问权限控制
将 IAM 主账号从数据库级转换 访问权限控制的精细访问权限控制,请按照以下步骤操作:
为主账号启用精细访问权限控制,并授予对所有所需数据库角色的访问权限,如向 IAM 主账号授予对数据库角色的访问权限中所述。
更新以此主账号运行的所有应用。指定适当的 在调用客户端库方法中的数据库角色。
从主账号撤消所有 IAM 数据库级角色。这样,主账号的访问权限将仅由一种方法控制。
例外:如需与 Google Cloud 控制台,所有用户都必须拥有
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 条件
查看指定的 IAM 条件列表 授予角色时 Cloud Spanner Database Role User 角色,请运行以下命令:
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 数据定义语言。 如需了解权限,请参阅精细访问权限控制权限。例如,如需撤消
SELECT
,请执行以下操作:INSERT
和UPDATE
对表employees
和contractors
的 数据库角色hr_manager
,请输入以下语句: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