基于标签的访问控制
基于标签的访问控制(Label-based access control,LBAC)是一种控制数据访问的方法。它控制谁可以对数据库对象进行读写访问。这里的数据库对象一般指一行或一列。LBAC 具有行级别粒度、列级别粒度,或两者兼具。LBAC 控制访问的方法是将分配给数据库对象的安全标签与授予用户的安全标签进行匹配。IDSLBACRULES 访问规则是一组预定义的访问规则,管理对受保护表中受保护行或列的访问。只有数据库安全管理员(DBSECADM)可以对 LBAC 对象进行配置。
安全标签组件
安全标签组件是 LBAC 安全策略的组成部分。它们用于创建安全策略和安全标签。它们是一些可以进行创建、删除、修改或重命名的数据库实体。
安全标签组件有三种类型:ARRAY、SET 和 TREE。每种类型最多有 64 个安全标签组件元素。
- ARRAY 是一组分级的元素列表。其中第一个元素的级别最高,而最后一个元素的级别最低。下面的例子演示了使用 ARRAY 类型的
CREATE SECURITY LABEL COMPONENT:
CREATE SECURITY LABEL COMPONENT level
ARRAY [ 'Top Secret', 'Secret', 'Confidential', 'Unclassified' ]; |
- SET 是一个横向的元素列表,其中所有的元素都具有相同的级别。下面的例子演示了使用 SET 类型的
CREATE SECURITY LABEL COMPONENT:
CREATE SECURITY LABEL COMPONENT department
SET {'Marketing', 'HR', 'Finance'}; |
- TREE 是一个树形结构,其中第一个元素(根)具有最高级别,而下面的分支(子元素和孙子元素)的级别较低。下面的例子演示了使用 TREE 类型的
CREATE SECURITY LABEL COMPONENT:
清单 26. 使用 TREE 类型的 CREATE SECURITY LABEL COMPONENT:
CREATE SECURITY LABEL COMPONENT region
TREE ( 'Headquarters' ROOT,
'West' UNDER 'Headquarters',
'East' UNDER 'Headquarters',
'California' UNDER 'West',
'New York' UNDER 'East',
'Florida' UNDER 'East'); |
安全策略
安全策略与需要执行访问控制的表有关。要创建安全策略,需要定义名称和一个或多个组件标签(最多 16 个)。安全策略也是一种可以执行创建、删除和重命名操作的数据库实体。
清单 27. CREATE SECURITY POLICY 示例
CREATE SECURITY POLICY company
COMPONENTS region, department; |
安全标签
安全标签与表中的数据库对象(行或列)以及用户相关。只有用户持有的安全标签(凭证)与数据库对象相关的安全标签匹配,才能访问受保护表中的对象。要创建安全标签,需要为标签定义名称,指定该标签所属的安全策略,确定该策略的组件,并为每个组件确定一个或多个元素。
清单 28. CREATE SECURITY LABEL 示例
CREATE SECURITY LABEL company.label2
COMPONENT level 'Secret',
COMPONENT function 'Administrative',
COMPONENT region 'Southwest'; |
授予安全标签
如果用户想要访问受 LBAC 保护的数据,安全管理员(DBSECADM)必须授予他们适当的凭证。凭证分为以下几类:FOR READ ACCESS、FOR WRITE ACCESS 或 FOR ALL ACCESS。
清单 29. GRANT SECURITY LABEL 示例
GRANT SECURITY LABEL company.label1 TO sam FOR READ ACCESS; |
保护表
创建完 LBAC 安全对象后,需要将其应用到数据中,即将安全策略附加到表,将安全标签附加到表行和表列。这可以通过 CREATE TABLE 和 ALTER TABLE 语句完成。
行级别粒度
要对表应用行级别粒度,必须将安全策略附加到表并指定安全标签列的类型为 IDSSECURITYLABEL。如果某个用户尝试访问某行,而他又不具备对该行的 LBAC 凭证,则数据库将响应该行并不存在。
清单 30. CREATE TABLE,附加安全策略并指定一个安全标签列
CREATE TABLE T5
(C1 IDSSECURITYLABEL,
C2 int)
SECURITY POLICY company; |
对受保护表插入行
只有拥有正确 LBAC 凭证时,用户才能向受保护表执行插入操作。如果用户插入了一行而没有为 IDSSECURITYLABEL 列指定值,系统将把用户的默认安全标签(FOR WRITE ACCESS)分配给被插入的行。但是,用户可以通过以下内置函数指定安全标签名称或组件。
SECLABEL_BY_COMP():该函数使用户能够在插入或更新行时指定单独的组件。例如:
INSERT INTO T5 VALUES (SECLABEL_BY_COMP('company', 'Secret:HR:West'),
1); |
SECLABEL_BY_NAME():该函数能够使用户能够在插入或更新行时指定安全标签的名称。例如:
INSERT INTO T5 VALUES (SECLABEL_BY_NAME('company', 'label1'),
1); |
下面的内置函数用于 SELECT 语句:
SECLABEL_TO_CHAR():该函数使用户能够检索 IDSSECURITYLABEL 列并显示其中的各个组件。例如:
SELECT SECLABEL_TO_CHAR('company', c1), c2 FROM T5;
(expression) Secret:HR:West
c2 1 |
列级别粒度
要使用列级别粒度保护表,需要将安全策略附加到表并将安全标签附加到一个或多个列。如果受保护表中的某列受安全标签保护,若要执行插入,用户必须具有适当的凭证。如果某个用户尝试访问某列,而他又不具备对该列的 LBAC 凭证,数据库将响应为错误。
清单 31. CREATE TABLE,将安全策略和安全标签附加到列
CREATE TABLE T6 (
C1 int,
C2 char (10) COLUMN SECURED WITH label1)
SECURITY POLICY company; |