Spanner用户权限管理 #

一、权限概述 #

1.1 权限模型 #

text
Spanner权限模型
├── IAM权限
│   ├── 预定义角色
│   ├── 自定义角色
│   └── 服务账号
│
└── 细粒度权限
    ├── 数据库级权限
    ├── 表级权限
    └── 列级权限

1.2 权限层级 #

text
权限层级结构:
├── 组织(Organization)
│   └── 所有项目权限
│
├── 项目(Project)
│   └── 所有实例权限
│
├── 实例(Instance)
│   └── 所有数据库权限
│
└── 数据库(Database)
    └── 表和列权限

二、IAM角色 #

2.1 预定义角色 #

角色 说明 权限
roles/spanner.admin 完全管理权限 所有权限
roles/spanner.databaseAdmin 数据库管理 创建/删除数据库
roles/spanner.databaseUser 数据库读写 读写数据
roles/spanner.databaseReader 数据库只读 只读数据
roles/spanner.viewer 查看权限 查看资源

2.2 授予角色 #

bash
# 授予实例管理员权限
gcloud spanner instances add-iam-policy-binding my-instance \
    --member="user:admin@example.com" \
    --role="roles/spanner.admin"

# 授予数据库用户权限
gcloud spanner databases add-iam-policy-binding my-database \
    --instance=my-instance \
    --member="user:developer@example.com" \
    --role="roles/spanner.databaseUser"

# 授予只读权限
gcloud spanner databases add-iam-policy-binding my-database \
    --instance=my-instance \
    --member="user:reader@example.com" \
    --role="roles/spanner.databaseReader"

2.3 移除角色 #

bash
# 移除权限
gcloud spanner databases remove-iam-policy-binding my-database \
    --instance=my-instance \
    --member="user:developer@example.com" \
    --role="roles/spanner.databaseUser"

2.4 查看权限 #

bash
# 查看实例权限
gcloud spanner instances get-iam-policy my-instance

# 查看数据库权限
gcloud spanner databases get-iam-policy my-database \
    --instance=my-instance

三、服务账号 #

3.1 创建服务账号 #

bash
# 创建服务账号
gcloud iam service-accounts create spanner-app \
    --display-name="Spanner Application"

# 授予权限
gcloud projects add-iam-policy-binding my-project \
    --member="serviceAccount:spanner-app@my-project.iam.gserviceaccount.com" \
    --role="roles/spanner.databaseUser"

3.2 创建密钥 #

bash
# 创建JSON密钥
gcloud iam service-accounts keys create spanner-key.json \
    --iam-account=spanner-app@my-project.iam.gserviceaccount.com

3.3 使用服务账号 #

java
// Java使用服务账号
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.spanner.SpannerOptions;

GoogleCredentials credentials = GoogleCredentials
    .fromStream(new FileInputStream("spanner-key.json"));

SpannerOptions options = SpannerOptions.newBuilder()
    .setCredentials(credentials)
    .build();
python
# Python使用服务账号
import os
from google.cloud import spanner

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'spanner-key.json'
client = spanner.Client()

四、细粒度权限 #

4.1 创建角色 #

sql
-- 创建自定义角色
CREATE ROLE read_only;

-- 创建读写角色
CREATE ROLE read_write;

4.2 授予表权限 #

sql
-- 授予SELECT权限
GRANT SELECT ON TABLE users TO ROLE read_only;

-- 授予多表权限
GRANT SELECT ON TABLE users, orders TO ROLE read_only;

-- 授予所有表权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ROLE read_only;

-- 授予INSERT/UPDATE权限
GRANT INSERT, UPDATE ON TABLE users TO ROLE read_write;

4.3 授予角色给用户 #

sql
-- 授予角色给用户
GRANT ROLE read_only TO USER 'reader@example.com';

-- 授予角色给服务账号
GRANT ROLE read_write TO USER 'spanner-app@my-project.iam.gserviceaccount.com';

4.4 撤销权限 #

sql
-- 撤销表权限
REVOKE SELECT ON TABLE users FROM ROLE read_only;

-- 撤销角色
REVOKE ROLE read_only FROM USER 'reader@example.com';

-- 删除角色
DROP ROLE read_only;

五、权限最佳实践 #

5.1 最小权限原则 #

text
最小权限原则:
├── 只授予必要的权限
├── 使用只读角色替代读写角色
├── 定期审查权限
├── 及时撤销不需要的权限
└── 避免使用admin角色

5.2 服务账号管理 #

text
服务账号管理建议:
├── 为不同应用创建不同服务账号
├── 定期轮换密钥
├── 监控服务账号使用
├── 设置密钥过期时间
└── 安全存储密钥文件

5.3 权限审计 #

sql
-- 查看角色权限
SELECT * FROM INFORMATION_SCHEMA.ROLE_GRANTEES;

-- 查看表权限
SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES;

-- 查看列权限
SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES;

六、权限示例 #

6.1 只读用户配置 #

sql
-- 创建只读角色
CREATE ROLE reporting_role;

-- 授予SELECT权限
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ROLE reporting_role;

-- 授予角色
GRANT ROLE reporting_role TO USER 'reporter@example.com';

6.2 应用服务账号配置 #

sql
-- 创建应用角色
CREATE ROLE app_role;

-- 授予必要权限
GRANT SELECT, INSERT, UPDATE ON TABLE users TO ROLE app_role;
GRANT SELECT, INSERT ON TABLE orders TO ROLE app_role;
GRANT SELECT ON TABLE products TO ROLE app_role;

-- 授予服务账号
GRANT ROLE app_role TO USER 'app-service@my-project.iam.gserviceaccount.com';

6.3 管理员配置 #

bash
# 使用IAM角色授予管理员权限
gcloud spanner instances add-iam-policy-binding my-instance \
    --member="user:dba@example.com" \
    --role="roles/spanner.databaseAdmin"

七、总结 #

权限管理要点:

权限类型 说明
IAM角色 实例和数据库级权限
细粒度权限 表和列级权限
服务账号 应用程序访问

最佳实践:

text
1. 使用最小权限原则
   └── 只授予必要权限

2. 使用服务账号
   └── 应用程序访问

3. 定期审查权限
   └── 及时清理

4. 监控权限使用
   └── 发现异常

5. 安全存储密钥
   └── 避免泄露

下一步,让我们学习备份与恢复!

最后更新:2026-03-27