一个完善的数据库系统,除了需要管理用户外,也需要设置普通用户来进行数据库对象的操作,但普通用户必须拥有对应数据库对象的访问和操作权限,才能进行数据库对象的访问和操作,否则,用户无法进行任何操作。
Oracle 模式权限
权限分类
Oracle 模式的权限分为两类:
对象权限:对特定对象的操作权限,例如:某个表对象的 Alter、Select、Update 等权限。
系统权限:允许用户执行在一个 Schema 或者任何 Schema 上进行特定的数据库操作的权限。
系统权限提供的权限比对象权限大得多。
权限转授
权限转授解决了授权者集中的问题。通过在授权时指定 with admin/grant option,可以同时授予用户将对应权限转授给其他用户的权限。回收对象权限时,要同时回收该用户转授给其他用户的对应权限,即 A 授予 B 权限,B 授予 C 权限,如果 A 收回 B 的权限,C 的权限也会被回收。回收系统权限时,不会级联回收转授的权限。
角色
为了方便权限的管理,设定了角色。角色是一组系统权限、对象权限的组合,角色中也可以包含其他角色。可以把角色授予用户,用户就拥有了角色里面的所有权限。系统在创建新租户时内置了三个默认的角色:
DBA:拥有绝大多数的系统权限。
RESOURCE:拥有 Resource 角色的用户只可以在自己的 Schema 中创建数据库对象。
CONNECT:拥有 Connect 权限的用户只可以登录数据库。
间接权限
用户的权限,包含直接授予的系统权限或者对象权限,也包含授予角色后,通过角色包获得的权限。大部分操作需要的权限,不论是直接授予的还是通过角色间接拥有的权限,都可以满足条件。对于下列场景,需要有直接权限才可以:
创建视图时,访问视图中的对象所需的权限。
执行定义者权限的有名 PL 块中的语句所需的权限。
权限检查
在 Resolver 阶段,解析出一条 SQL 语句中所需的所有权限,逐个检查用户是否拥有对应的权限。对于系统操作的权限,如果权限不足则直接报错权限不足。对于访问对象的权限,如果用户在这个对象上没有任何权限,则报错对象不存在;如果用户在这个对象上有其他权限,只是没有需要的权限,则报错权限不足。
MySQL 模式权限
与 Oracle 模式异同
MySQL 模式没有角色,权限模型相对简单。权限检查逻辑和 Oracle 一致。
权限分类
MySQL 模式的权限分为了 3 个级别:
管理权限:可以影响整个租户的权限,例如:修改系统设置、访问所有的表等权限。
数据库权限:可以影响某个特定数据库下所有对象的权限,例如:在对应数据库下创建删除表,访问表等权限。
对象权限:可以影响某个特定对象的权限,例如:访问一个特定的表、视图或索引的权限。
网络安全访问控制
OceanBase 数据库提供白名单策略,实现网络安全访问控制。租户白名单通过系统变量ob_tcp_invited_nodes 控制,支持列表形式取值,列表值之前使用英文逗号(,)分隔,例如:A,B,C,D。
用户登录时,OBServer 会将用户的 IP 地址依次和 A、B、C、D 进行匹配校验。如果全部不匹配,则拒绝访问。只要有任意一个匹配成功,则表示通过白名单。
列表值支持以下赋值:
IP 地址,例如:192.168.1.1。匹配时采用等值匹配,即用户 Client IP 等于该 IP 值时,才算匹配。
包含百分号(%)或下划线()的 IP 地址,例如:192.168.1.% 或 192.168.1.。匹配时采用模糊匹配,即类似 LIKE 语法。
IP/NETMASK 地址,例如:192.168.1.0/24 或者 192.168.1.0/255.255.255.0。匹配时采用掩码匹配,只有满足 Client_IP & NetMask == IP 才算匹配成功,类似于 MySQL 的掩码匹配。
行级访问权限控制
OceanBase 数据库兼容了 Oracle 的 Label Security 功能,可以在行级别对访问进行控制,保证读写数据的安全。
Label Security 是强制访问控制的一种方式,通过在表中添加一个 Label 列来记录每行的 Label 值,在访问时通过比较用户的 Label 和数据的 Label,达到约束主体(用户)对客体(表中的数据)访问的目的。
OceanBase 数据库提供了内置的安全管理员 LBACSYS 来管理和使用该功能,安全管理员可以通过创建安全策略、定义策略中的 Label、设置用户的 Label,来定制自己的安全策略。一个安全策略可以应用到多张表上,一张表也可以应用多个安全策略。每当一个安全策略被应用,这张表上自动会添加一列,用于该安全策略的访问控制。
注意
目前仅 Oracle 模式支持 Label Security。




