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