SECURITY LABEL 子句
GRANT SECURITY LABEL 语句将安全标签授予用户或用户列表。
SECURITY LABEL 子句
元素 | 描述 | 限制 | 语法 |
label | 现有安全标签的名称 | 必须存在作为指定的安全 policy 的标签 | 标识符 |
policy | 此 label 的安全策略 | 必须在该数据库中已存在 | 标识符 |
user | 要将该标签授予的用户 | 必须为用户的授权标识符 | 所有者名称 |
仅持有 DBSECADM 角色的用户可发出 GRANT SECURITY LABEL 语句。
安全标签是始终与安全策略关联的数据库对象。那个策略定义构成安全标签的有效的安全组件的集合。该标签存储安全策略的每一组件的一个或多个值的集合。
DBSECADM 可将安全标签与下列实体关联:
- 数据库表的一列,列安全标签可保护该列
- 数据库表的一行,行安全标签可保护该行
- 用户,其用户安全标签(以及已经授予该用户的安全策略的规则的任何豁免)称为该用户的安全凭证。
当持有特定安全策略的安全标签的用户尝试访问同一安全策略的行安全标签所保护的行,数据库服务器将该用户安全标签中值的集合与该行安全标签中值的集合进行对比,来决定该用户是否该被允许访问该数据。类似地,在决定用户的凭证是否该允许其访问受保护的列时,LBAC 考虑用户安全标签与列安全标签。
GRANT SECURITY LABEL 语句是 DBSECADM 将用户与安全标签相关联的机制。通过仅 DBSECADM 可执行的 CREATE TABLE 或 ALTER TABLE 语句的选项,受保护的表中的数据值与行安全标签或列安全标签相关联,而不是通过 GRANT SECURITY LABEL 语句)。
可跟在 TO 关键字之后的 USER 关键字是可选的,而且没有作用,但在 GRANT SECURITY LABEL 语句中指定的任何授权标识符都必须是单个用户的标识符,而不是角色的标识符。
访问规范
授予其安全标签的用户列表可可选地后跟关键字,这些关键字指定对该标签的安全策略保护的数据的访问类型
- FOR WRITE ACCESS
这些关键字将标签限定为 IDSLBACRULES,即 IDLSBACWRITEARRAY、IDLSBACWRITESET 和 IDLSBACWRITETREE 的写访问规则。这些规则影响对受保护数据的 INSERT、DELETE 和 UPDATE 操作。
- FOR READ ACCESS
这些关键字将标签限定为 IDSLBACRULES,即 IDLSBACWREADARRAY、IDLSBACREADSET 和 IDLSBACREADTREE 的读访问规则。这些规则影响对受保护数据的 SELECT、DELETE 和 UPDATE 操作。
- FOR ALL ACCESS
这些关键字将标签应用到上列所有读和写访问规则。如果 GRANT SECURITY LABEL 语句不包括 FOR ... ACCESS 规范,则此选项作为缺省项生效。
要获取更多关于这些基于标签的读和写访问的 IDSLBACRULES 规则的信息,请参阅 与安全策略相关的规则。要获取关于可以为特定安全策略授予对这些规则的豁免的信息,请参阅 授予豁免的规则。
如果授予用户的读访问安全标签与写访问安全标签不同,那么为这些安全标签组件赋予的值必须服从下列这些规则:
- 对于类型 ARRAY 的安全标签组件,在两个安全标签中的值必须相同。
- 对于类型 SET 的安全标签组件,在用于 WRITE 访问的安全标签中给定的值,必须是在用于 READ 访问的安全标签中给定值的子集。如果所有的值相同,则视为子集,且是允许的。
- 对于类型 TREE 的安全标签组件,用于写访问的安全标签的树组件中的每个元素,必须是用于读访问的安全标签的树组件中的一个元素或一个元素的后代。
总之,当 DBSECADM 尝试将读访问的安全标签授予已持有写访问的安全标签的用户时,或者反之,则读标签不可比写标签更具限制性。否则,GRANT SECURITY LABEL 语句失败并报错。
对于同一安全策略,可将不多于两个标签授予用户。如果授予同一策略的两个标签,则一个标签必须为读访问,且另一个为写访问。如果 DBSECADM 尝试将读访问的安全标签授予用户,而该用户已持有基于同一安全策略的读访问的安全标签,则 GRANT SECURITY LABEL 语句失败并报错。如果两个标签都是写访问的且基于同一安全策略,则导致类似的失败。
在这两种情况下,在可将相同的访问模式和相同的安全策略授予第二个标签之前,必须通过 REVOKE SECURITY LABEL 语句显式地取消第一个安全标签。此规则的唯一例外情况是,如果两个标签都指定组件元素的同一个值。因为在此情况下,两个标签在功能上相同,且不发生错误。
用户安全标签的规则
下列规则影响那些通过 GRANT SECURITY LABEL 语句授予用户的安全标签:
- user 不可为发出此 GRANT SECURITY LABEL 语句的 DBSECADM。
- 没有安全标签的用户有 NULL 或零标签。没有安全标签的用户不可访问受保护表中的数据,除非该用户持有对该策略的必要的豁免。
- 在缺省情况下,受保护表的 IDSSECURITYLABEL 列不可有 NULL 值。没有安全标签的用户不可将数据插入到带有行保护的表内,即使该用户已被授予了对该安全策略的必要的豁免,除非在 INSERT 语句中显式地指定该行标签。要了解如何在 INSERT 语句中显式地指定安全标签,请参阅 安全标签支持函数。
- 对下列数据库表类型,用户安全标签不起作用,因为这些表不可由安全策略来保护:
- “虚拟表接口”表,
- 带有“虚拟表接口”索引的表,
- 在类型表层级中的表,
- 临时表。
授予用户安全标签的示例
下列三个语句分别地创建三个名为 level、compartments 和 groups 的安全标签组件:
CREATE SECURITY LABEL COMPONENT
level ARRAY ['TS','S','C','U'];
CREATE SECURITY LABEL COMPONENT
compartments SET {'A','B','C','D'};
CREATE SECURITY LABEL COMPONENT
groups TREE ('G1' ROOT,
'G2' UNDER ROOT,
'G3' UNDER ROOT);
下列语句基于上面三个组件创建名为 secPolicy 的安全策略:
CREATE SECURITY POLICY secPolicy COMPONENTS
level, compartments, groups;
下列语句创建名为 secLabel1 的安全标签:
CREATE SECURITY LABEL secPolicy.secLabel1
COMPONENT level 'S',
COMPONENT compartments 'A', 'B',
COMPONENT groups 'G2';
下列语句创建名为 secLabel2 的安全标签:
CREATE SECURITY LABEL secPolicy.secLabel2
COMPONENT level 'S',
COMPONENT compartments 'B',
COMPONENT groups 'G2';
下列语句创建名为 secLabel3 的安全标签:
CREATE SECURITY LABEL secPolicy.secLabel3
COMPONENT level 'S',
COMPONENT compartments 'A',
COMPONENT groups 'G3';
下列语句创建名为 secLabel4 的安全标签:
CREATE SECURITY LABEL secPolicy.secLabel4
COMPONENT level 'TS',
COMPONENT compartments 'A',
COMPONENT groups 'G1';
下列语句授予用户 sam 读访问的安全标签:
GRANT SECURITY LABEL secPolicy.secLabel1
TO sam FOR READ ACCESS;
下列语句授予用户 sam 写访问的安全标签。由于满足以上给出的规则,此语句成功。
GRANT SECURITY LABEL secPolicy.secLabel2
TO sam FOR WRITE ACCESS;
下列语句授予用户 lynette 读访问的安全标签:
GRANT SECURITY LABEL secPolicy.secLabel1
TO lynette FOR READ ACCESS;
下列语句尝试授予用户 sam 写访问的安全标签。由于违反有关树组件的规则,此语句失败。
GRANT SECURITY LABEL secPolicy.secLabel3
TO sam FOR WRITE ACCESS;
下列语句尝试授予用户 sam 写访问的安全标签。由于违反有关数组组件的规则,此语句失败。
GRANT SECURITY LABEL secPolicy.secLabel4
TO sam FOR WRITE ACCESS;
当 GRANT SECURITY LABEL 语句成功地将安全标签授予用户时,数据库服务器更新系统目录的 sysseclabelauth 表来注册该安全标签的新的持有者。
要了解 LBAC 安全对象的讨论,请参阅您的 GBase 8s 安全指南。