LBAC,基于标签的访问控制(Label Based Access Control)。Teledbx是基于自定义的安全策略最终通过标签实现对用户和表的行级安全加密,其中,安全策略(Policy)是等级(Level)和隔离区(Compartment),组(Group)和标签(Label)的集合,最终通过绑定标签实现行级安全。表和用户绑定到标签上,标签可以关联到安全hang等级(必选),隔离区(可选)和安全组(可选),形成了一个多级的行级安全加密体系。
- 安全策略(Policy):创建等级(Level),隔离区(Compartment),组(Group)和标签(Label)必须指定所属的安全策略。
- 等级(Level):提供第一等级的安全控制,标签必须指定等级。高等级用户可以看到低等级的数据,低等级无法看到高等级的数据。
- 隔离区(Compartment):提供第二等级的安全控制,可选。只有处于隔离区才可以看到相应的数据。
- 组(Group):提供第三等级的安全控制,一种树状的结构,可选。父节点可以看到子节点数据,子节点看不到父节点数据
- 标签(Label):最终通过标签绑定体现行级安全。仅当用户被赋予的标签比此行标签有相同或更高等时,该行才可以被用户存取。
在Teledbx中,创建安全策略需要通过teledbx_mls插件,需要创建插件
CREATE EXTENSION teledbx_mls;
使用示例
初始化环境
\c - mls_admin
-- 创建安全策略
select MLS_CLS_CREATE_POLICY('rls_policy', 66);
-- 创建安全等级
select MLS_CLS_CREATE_LEVEL('rls_policy', 10, 'default_level', 'default Level');
select MLS_CLS_CREATE_LEVEL('rls_policy', 10, 'user_level', 'user Level');
select MLS_CLS_CREATE_LEVEL('rls_policy', 9, 'bad_level', 'bad Level');
select MLS_CLS_CREATE_LEVEL('rls_policy', 100, 'good_level', 'good Level');
-- 创建隔离区
select MLS_CLS_CREATE_COMPARTMENT('rls_policy', 30, 'rls_com0', 'RLS compartment 0');
select MLS_CLS_CREATE_COMPARTMENT('rls_policy', 31, 'rls_com1', 'RLS compartment 1');
select MLS_CLS_CREATE_COMPARTMENT('rls_policy', 32, 'rls_com2', 'RLS compartment 2');
-- 创建安全组
select MLS_CLS_CREATE_GROUP_ROOT('rls_policy', 50, 'root', 'group root');
select MLS_CLS_CREATE_GROUP_NODE('rls_policy', 51, 'child1', 'child of root node 1', 'root');
select MLS_CLS_CREATE_GROUP_NODE('rls_policy', 52, 'child2', 'child of root node 2', 'root');
select MLS_CLS_CREATE_GROUP_NODE('rls_policy', 511, 'child11', 'child of child1 node 1', 'child1');
select MLS_CLS_CREATE_GROUP_NODE('rls_policy', 512, 'child12', 'child of child1 node 2', 'child1');
-- 创建安全标签,此时和安全等级,隔离区以及安全组进行绑定
select MLS_CLS_CREATE_LABEL('rls_policy', 1024, 'default_level:rls_com0:child12');
-- 将标签绑定到表
alter table public.tbl1 add column _cls clsitem default '99:1024';
select MLS_CLS_CREATE_TABLE_LABEL('rls_policy', 1024, 'public', 'tbl1');
安全等级
创建标签,再将标签绑定到用户,建立标签和用户间关联关系
-- 创建标签
select MLS_CLS_CREATE_LABEL('rls_policy', 1025, 'user_level::');
select MLS_CLS_CREATE_LABEL('rls_policy', 1026, 'bad_level::');
select MLS_CLS_CREATE_LABEL('rls_policy', 1027, 'good_level::');
-- 将标签绑定到用户,建立标签和用户间关联关系
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'godlike1', 1024, 1024, 1024);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'godlike2', 1025, 1025, 1025);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'badgodlike1', 1026, 1026, 1026);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'goodgodlike1', 1027, 1027, 1027);
\c - godlike1
insert into public.tbl1 select generate_series(1,3), generate_series(1,3);
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:1024
2 | 2 | 66:1024
3 | 3 | 66:1024
(3 rows)
\c - godlike2
insert into public.tbl1 select generate_series(4,6), generate_series(4,6);
-- 当前用户等级低,无法看到godlike1用户创建的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
4 | 4 | 66:1025
5 | 5 | 66:1025
6 | 6 | 66:1025
(3 rows
\c - badgodlike1
-- 低优先级的用户无法看到高优先级的用户插入的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+------
(0 rows)
insert into public.tbl1 select generate_series(7,9), generate_series(7,9);
-- 低优先级用户可以看到自己创建的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
7 | 7 | 66:1026
8 | 8 | 66:1026
9 | 9 | 66:1026
(3 rows)
\c goodgodlike1
-- 高优先级用户可以看到低优先级用户创建的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
4 | 4 | 66:1025
5 | 5 | 66:1025
6 | 6 | 66:1025
7 | 7 | 66:1026
8 | 8 | 66:1026
9 | 9 | 66:1026
(6 rows)
安全隔离区
创建安全标签,将安全标签绑定隔隔离区,再将标签绑定到用户,建立标签和用户间关联关系。
\c - mls_admin
select MLS_CLS_DROP_USER_LABEL('godlike1');
select MLS_CLS_DROP_USER_LABEL('godlike2');
select MLS_CLS_DROP_USER_LABEL('badgodlike1');
select MLS_CLS_DROP_USER_LABEL('goodgodlike1');
-- 创建安全标签,并绑定隔隔离区
select MLS_CLS_CREATE_LABEL('rls_policy', 2048, 'default_level:rls_com0:');
select MLS_CLS_CREATE_LABEL('rls_policy', 2049, 'default_level:rls_com0,rls_com1,rls_com2:');
select MLS_CLS_CREATE_LABEL('rls_policy', 2050, 'default_level:rls_com1,rls_com2:');
select MLS_CLS_CREATE_LABEL('rls_policy', 2051, 'default_level:rls_com0,rls_com2:');
-- 将标签绑定到用户,建立标签和用户间关联关系
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'godlike1', 2048, 2048, 2048);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'godlike2', 2049, 2049, 2049);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'badgodlike1', 2050, 2050, 2050);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'goodgodlike1', 2051, 2051, 2051);
\c - godlike1
insert into public.tbl1 select generate_series(1,3), generate_series(1,3);
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:2048
2 | 2 | 66:2048
3 | 3 | 66:2048
(3 rows)
\c - godlike2
insert into public.tbl1 select generate_series(4,6), generate_series(4,6);
-- 当前用户所在隔离区含godlike1用户隔离区,可以看到godlike1的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:2048
2 | 2 | 66:2048
3 | 3 | 66:2048
4 | 4 | 66:2049
5 | 5 | 66:2049
6 | 6 | 66:2049
(6 rows)
\c - badgodlike1
insert into public.tbl1 select generate_series(7,9), generate_series(7,9);
-- 当前用户所在隔离区无法包含前面用户的隔离区,无法看到他们插入的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
7 | 7 | 66:2050
8 | 8 | 66:2050
9 | 9 | 66:2050
(3 rows)
\c - goodgodlike1
insert into public.tbl1 select generate_series(10,12), generate_series(10,12);
-- 相同等级,godlike1的隔离区是当前的子集,当前用户可以看到godlike1插入的数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:2048
2 | 2 | 66:2048
3 | 3 | 66:2048
10 | 10 | 66:2051
11 | 11 | 66:2051
12 | 12 | 66:2051
(6 rows)
安全组
创建安全标签,安全标签绑定安全组,再将将标签绑定到用户,建立标签和用户关联关系。
\c - mls_admin
select MLS_CLS_DROP_USER_LABEL('godlike1');
select MLS_CLS_DROP_USER_LABEL('godlike2');
select MLS_CLS_DROP_USER_LABEL('badgodlike1');
select MLS_CLS_DROP_USER_LABEL('goodgodlike1');
-- 创建安全标签,并绑定安全组
select MLS_CLS_CREATE_LABEL('rls_policy', 4096, 'default_level:rls_com0:root');
select MLS_CLS_CREATE_LABEL('rls_policy', 4097, 'default_level:rls_com0:child1');
select MLS_CLS_CREATE_LABEL('rls_policy', 4098, 'default_level:rls_com0:child11,child12');
-- 将标签绑定到用户,建立标签和用户关联关系
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'godlike1', 4096, 4096, 4096);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'godlike2', 4097, 4097, 4097);
select MLS_CLS_CREATE_USER_LABEL('rls_policy', 'badgodlike1', 4098, 4098, 4098);
\c - badgodlike1
insert into public.tbl1 select generate_series(1,3), generate_series(1,3);
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:4098
2 | 2 | 66:4098
3 | 3 | 66:4098
(3 rows)
\c - godlike2
insert into public.tbl1 select generate_series(4,6), generate_series(4,6);
-- 安全组根节点可以看到子节点数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:4098
2 | 2 | 66:4098
3 | 3 | 66:4098
4 | 4 | 66:4097
5 | 5 | 66:4097
6 | 6 | 66:4097
(6 rows)
\c - badgodlike1
-- 子节点 无法看到根节点数据
select * from public.tbl1 order by col1;
col1 | col2 | _cls
------+------+---------
1 | 1 | 66:4098
2 | 2 | 66:4098
3 | 3 | 66:4098
(3 rows)