ScyllaDB 基于角色的访问控制(RBAC)实战指南
什么是基于角色的访问控制(RBAC)
基于角色的访问控制(RBAC)是一种通过将权限分配给角色而非直接分配给用户来简化权限管理的方法。在ScyllaDB中,RBAC系统提供了一种灵活且强大的方式来管理数据库访问权限。
角色与用户的区别
在ScyllaDB的RBAC系统中,角色(Role)是一个核心概念:
-
角色继承性:角色可以继承其他角色的权限。例如,如果"开发者"角色被授予"经理"角色,那么经理将自动获得开发者的所有权限。
-
用户是特殊角色:任何可以登录的角色就是用户(User)。因此,所有用户都是角色,但并非所有角色都是用户。
-
权限管理优势:通过角色管理权限比直接管理用户权限更加高效,特别是在人员变动频繁的组织中。
RBAC的实际应用场景
让我们通过一个健身俱乐部的案例来理解RBAC的实际应用:
场景描述
一家健身俱乐部使用ScyllaDB作为后端数据库,需要为以下人员分配不同的数据库访问权限:
- 办公室职员:可以添加新客户、取消订阅、查看所有客户数据、更改教练课程安排以及查看教练数据
- 教练:只能查看自己的课程安排和客户数据
- 客户:只能查看课程安排
- 数据库管理员:拥有完全的管理权限
权限规划表
为了清晰规划权限,我们可以创建如下表格:
| 角色/权限对象 | customer.info | schedule.cust | schedule.train | customer keyspace | schedule keyspace | |--------------|---------------|---------------|----------------|-------------------|-------------------| | DBA | superuser | superuser | superuser | superuser | superuser | | staff | MODIFY | MODIFY | MODIFY | SELECT | SELECT | | trainer | SELECT | SELECT | SELECT | | | | customer | | SELECT | | | |
实施步骤详解
1. 准备工作
在开始前,请确保:
- 已启用ScyllaDB的身份验证和授权功能
- 使用具有足够权限的用户登录cqlsh
2. 创建数据库结构
CREATE KEYSPACE IF NOT EXISTS customer WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'replication_factor' : 3 };
CREATE TABLE IF NOT EXISTS customer.info (ssid UUID, name text, DOB text, telephone text, email text, memberid text, PRIMARY KEY (ssid, name, memberid));
CREATE KEYSPACE IF NOT EXISTS schedule WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'replication_factor' : 3 };
CREATE TABLE IF NOT EXISTS schedule.cust (memberid UUID, ssid text, class text, meeting_day text, meeting_time text, PRIMARY KEY (memberid, ssid));
CREATE TABLE IF NOT EXISTS schedule.train (trainerid UUID, class text, meeting_day text, meeting_time text, PRIMARY KEY (trainerid));
3. 创建角色并分配权限
最佳实践:建议从最低权限的角色开始创建,逐步向上构建。
创建客户角色
CREATE ROLE customer;
GRANT SELECT ON schedule.cust TO customer;
创建教练角色并继承客户权限
CREATE ROLE trainer;
GRANT customer TO trainer; -- 继承客户权限
GRANT SELECT ON customer.info TO trainer;
GRANT SELECT ON schedule.train TO trainer;
创建职员角色
CREATE ROLE staff;
GRANT SELECT ON KEYSPACE schedule TO staff;
GRANT SELECT ON KEYSPACE customer TO staff;
GRANT MODIFY ON schedule.cust TO staff;
GRANT MODIFY ON customer.info TO staff;
GRANT MODIFY ON schedule.train TO staff;
创建管理员角色
CREATE ROLE administrator WITH SUPERUSER = true;
4. 创建用户并分配角色
-- 创建用户
CREATE ROLE lisa WITH PASSWORD = 'password' AND LOGIN = true;
CREATE ROLE mary WITH PASSWORD = 'password' AND LOGIN = true;
CREATE ROLE dennis WITH PASSWORD = 'password' AND LOGIN = true;
CREATE ROLE tim WITH PASSWORD = 'password' AND LOGIN = true;
-- 分配角色
GRANT administrator TO tim;
GRANT staff TO dennis;
GRANT trainer TO mary;
GRANT customer TO lisa;
5. 验证权限分配
检查用户权限是否正确分配:
LIST ALL PERMISSIONS OF mary;
预期结果应显示mary拥有:
- 通过customer角色获得的schedule.cust表的SELECT权限
- 通过trainer角色获得的customer.info和schedule.train表的SELECT权限
高级RBAC特性
-
服务级别关联:ScyllaDB允许将角色与服务级别关联,从而为不同角色分配不同的资源优先级。
-
权限继承的灵活性:可以创建复杂的角色继承层次结构,满足各种组织需求。
-
细粒度权限控制:可以精确控制到表级别甚至行级别的权限。
常见问题解决
-
权限错误:如果遇到"Unauthorized"错误,请检查是否已启用身份验证并使用正确用户登录。
-
授权错误:如果看到"GRANT operation is not supported"错误,请确保已启用授权功能。
-
权限继承问题:使用
LIST ROLES OF username
命令检查角色继承关系是否正确。
最佳实践建议
-
最小权限原则:只授予角色完成工作所需的最小权限。
-
角色命名规范:建立一致的命名规范,便于管理。
-
定期审计:定期检查角色和权限分配情况。
-
文档记录:维护权限分配的详细文档。
通过合理使用ScyllaDB的RBAC系统,可以大大简化数据库权限管理,提高安全性,同时降低管理成本。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考