行级访问权限控制相关问题

【 使用环境 】生产环境 or 测试环境
测试环境
【 OB or 其他组件 】
4.1
【 使用版本 】
【问题描述】清晰明确描述问题
相关链接:OceanBase分布式数据库-海量数据 笔笔算数

SA_SESSION.SET_ROW_LABEL

ROW_LABEL 描述

SA_SESSION.SET_ROW_LABEL 用于设置当前数据库会话的默认行标签值。

设置 LABEL_DEFAULT 选项时,如果用户未明确指定标签,则在插入时使用此行标签值。

如果未使用 SA_SESSION.SET_ROW_LABEL 设置默认行标签值,则该值将自动从会话标签派生。它包含会话标签的级别。

如果会话标签更改,则行标签将自动重置。 例如,如果将会话级别从 HIGHLY_SENSITIVE 更改为 SENSITIVE,则行标签的级别组件将自动更改为 SENSITIVE

用户可以独立设置行标签,但只能小于或等于会话标签的级别,并且大于或等于用户的最小级别。

如果用户尝试将行标签设置为无效值,则不允许该操作,并且行标签值不变。

测试

这里在进行为用户指定标签时,符合(用户可以独立设置行标签,但只能小于或等于会话标签的级别,并且大于或等于用户的最小级别)

obclient [LBACSYS]>  CALL SA_USER_ADMIN.SET_LEVELS('MY_POLICY', 'user10', 'HIGH','PUBLIC', 'PUBLIC', 'HIGH');
ORA-12470: NULL or invalid user label
at oceanbase.SA_USER_ADMIN.SET_LEVELS , line : 123, col : 1
obclient [LBACSYS]>  CALL SA_USER_ADMIN.SET_LEVELS('MY_POLICY', 'user10', 'HIGH','PUBLIC', 'HIGH', 'HIGH');
Query OK, 0 rows affected (0.024 sec)

但是直接使用SA_SESSION.SET_ROW_LABEL的语法处理时并不满足上述描述

obclient [TEST3]> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'INTERNAL');
Query OK, 0 rows affected (0.001 sec)

obclient [TEST3]> CALL SA_SESSION.SET_ROW_LABEL('MY_POLICY', 'HIGH');
Query OK, 0 rows affected (0.001 sec)

obclient [TEST3]> SELECT SA_SESSION.LABEL('MY_POLICY') FROM DUAL;
+-------------------------------+
| SA_SESSION.LABEL('MY_POLICY') |
+-------------------------------+
| INTERNAL                      |
+-------------------------------+
1 row in set (0.001 sec)

obclient [TEST3]> SELECT SA_SESSION.ROW_LABEL('MY_POLICY') FROM DUAL;
+-----------------------------------+
| SA_SESSION.ROW_LABEL('MY_POLICY') |
+-----------------------------------+
| HIGH                              |
+-----------------------------------+
1 row in set (0.001 sec)

这个现象符合预期吗

另外测试行级锁功能问题

obclient [TEST3]> CALL SA_SESSION.SET_LABEL('MY_POLICY', 'PUBLIC');
Query OK, 0 rows affected (0.001 sec)

obclient [TEST3]> SELECT * FROM tbl1;
+------+------+----------+
| COL1 | COL2 | MY_LABEL |
+------+------+----------+
|    1 |    1 |    10000 |
|    2 | NULL |    10000 |
|    1 |    1 |    10000 |
|    3 |    1 |    10000 |
+------+------+----------+
4 rows in set (0.001 sec)

obclient [TEST3]>  CALL SA_SESSION.SET_LABEL('MY_POLICY', 'HIGH');
Query OK, 0 rows affected (0.001 sec)

obclient [TEST3]> SELECT * FROM tbl1;
+------+------+----------+
| COL1 | COL2 | MY_LABEL |
+------+------+----------+
|    1 |    1 |    10000 |
| NULL | NULL |    20000 |
|    2 | NULL |    10000 |
|    3 |    1 |    30000 |
|    1 |    1 |    10000 |
| NULL | NULL |    20000 |
|    3 |    1 |    10000 |
|    3 |    2 |    30000 |
+------+------+----------+
8 rows in set (0.001 sec)

目前看起来结果只跟SESSION.label的级别相关,SESSION.row_label的作用是什么,

SESSION.row_label与pl安全标签相关;
标签:
数据和用户的标签以及用户和程序单元的授权控制,对所指定受保护对象的访问进行管理。当前版本中标签只包含级别。级别表示要分配给行的敏感度类型,例如 SENSITIVE 或 HIGHLY SENSITIVE。
SA_SESSION.ROW_LABEL 返回与当前会话的策略相关联的行标签的名称。