目录
++一、前言++
++二、GaussDB中的行访问控制++
++[1、CREATE ROW LEVEL SECURITY POLICY语法](#1、CREATE ROW LEVEL SECURITY POLICY语法)++
++[2、ALTER ROW LEVEL SECURITY POLICY语法](#2、ALTER ROW LEVEL SECURITY POLICY语法)++
++[3、ROW LEVEL SECURITY策略与适配SQL语法关系](#3、ROW LEVEL SECURITY策略与适配SQL语法关系)++
++1)创建行访问控制策略,实现"学生自己只能查看自己的课程成绩"++
++2)修改行访问策略,实现"学生只能在8:00-18:00查看自己的成绩"++
++四、注意事项++
++五、小结++
一、前言
数据的安全性和隐私性变得越来越重要。行访问控制策略是数据库管理中的一种重要技术,可以保护数据的机密性和完整性。GaussDB是一款高性能、高可用性的数据库管理系统,提供了丰富的安全功能,其中包括行访问控制策略。
本文将介绍GaussDB数据库表创建行访问控制策略的基本概念和操作方法,并通过实例演示其过程。通过介绍,读者可以了解GaussDB数据库表创建行访问控制策略的重要性和具体实现方法,为保障数据安全提供参考。
二、GaussDB中的行访问控制
一般默认情况下,表是没有行级安全策略限制的,要想使表具有行级安全性,要么在初始时就通过"CREATE ROW LEVEL SECURITY POLICY"创建、要么就在后期通过"ALTER ROW LEVEL SECURITY POLICY"修改。
在GaussDB中,行访问控制影响数据表的读取操作(例如:SELECT、UPDATE、DELETE等),暂不影响数据表的写入操作(例如:INSERT、MERGE INTO等)。
1、CREATE ROW LEVEL SECURITY POLICY语法
对表创建行访问控制策略。
1 )语法:
sql
CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
[ AS { PERMISSIVE | RESTRICTIVE } ]
[ FOR { ALL | SELECT | UPDATE | DELETE } ]
[ TO { role_name | PUBLIC | CURRENT_USER | SESSION_USER } [, ...] ]
USING ( using_expression )
2 )参数:
- policy_name : 行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。
- table_name : 行访问控制策略的表名。
- PERMISSIVE : 指定行访问控制策略为宽容性策略,条件用OR表达式拼接。
- RESTRICTIVE : 指定行访问控制策略为限制性策略,条件用AND表达式拼接。
- role_name : 行访问控制影响的数据库用户。(主要包含:CURRENT_USER、SESSION_USER等。当未指定时,默认为PUBLIC,表示影响所有数据库用户。可以指定多个受影响的数据库用户。系统管理员不受行访问控制特性影响)
- using_expression : 行访问控制的表达式(返回boolean值)。
2、ALTER ROW LEVEL SECURITY POLICY语法
对已存在的行访问控制策略(包括行访问控制策略的名称,行访问控制指定的用户,行访问控制的策略表达式)进行修改。
1 )语法:
sql
--修改已存在行访问控制策略的名称
ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name RENAME TO new_policy_name;
--修改已存在行访问控制策略的指定用户、策略表达式
ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
[ TO { role_name | PUBLIC } [, ...] ]
[ USING ( using_expression ) ];
2 )参数:
- policy_name : 行访问控制策略名称**。**
- table_name : 行访问控制策略的表名。
- new_policy_name : 新的行访问控制策略名称。
- role_name : 行访问控制策略应用的数据库用户,可以指定多个用户,PUBLIC表示应用到所有用户。
- using_expression : 行访问控制策略,形式类似于where子句中的布尔型表达式。
3、ROW LEVEL SECURITY策略与适配SQL语法关系
|-----------------------------|-----------------------|-----------------------|-----------------------|
| Command | SELECT/ALL policy | UPDATE/ALL policy | DELETE/ALL policy |
| SELECT | Existing row | No | No |
| SELECT FOR UPDATE/SHARE | Existing row | Existing row | No |
| UPDATE | No | Existing row | No |
| UPDATE RETURNING | Existing row | Existing row | No |
| DELETE | No | No | Existing row |
| DELETE RETURNING | Existing row | No | Existing row |
三、GaussDB中的行访问控制策略示例
1、实现GaussDB行访问控制的一般步骤
在GaussDB中,行访问控制是数据库安全的重要组成部分。通过启用行级访问控制,可以限制数据库中的用户对特定数据的访问权限。以下是实现GaussDB行访问控制的一般步骤。
请注意,具体实现方法可能因GaussDB版本和配置环境而有所不同。因此,在实际操作中,建议参考GaussDB官方文档。
2、行访问控制策略的创建与修改(示例)
1)创建行访问控制策略,实现"学生自己只能查看自己的课程成绩"。
sql
--创建用户zhangsan、lisi (Password must contain at least three kinds of characters)
CREATE USER zhangsan PASSWORD 'zhangsan@123';
CREATE USER lisi PASSWORD 'lisi@123';
--创建数据表test_3。
CREATE TABLE test_3(
id int
,name varchar(20)
,course varchar(20)
,score int
);
--向数据表插入数据
INSERT INTO test_3 VALUES(1, 'zhangsan', '语文',90);
INSERT INTO test_3 VALUES(2, 'zhangsan', '数学',95);
INSERT INTO test_3 VALUES(3, 'zhangsan', '英语',85);
INSERT INTO test_3 VALUES(4, 'lisi', '语文',85);
INSERT INTO test_3 VALUES(5, 'lisi', '数学',90);
INSERT INTO test_3 VALUES(6, 'lisi', '英语',95);
--将表test_3的读取权限赋予zhangsan、lisi。
GRANT SELECT ON test_3 TO zhangsan,lisi;
--打开行访问控制策略开关。
ALTER TABLE test_3 ENABLE ROW LEVEL SECURITY;
--创建行访问控制策略,当前用户只能查看用户自己的数据。
CREATE ROW LEVEL SECURITY POLICY test_3_r
ON test_3
USING(name = CURRENT_USER);
sql
--查看表test_3相关信息。通过元命令 "\d+ test_3" 或者通过系统表"PG_RLSPOLICY"
GaussDB=# \d+ test_3
Table "public.test_3"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------+-----------+----------+--------------+-------------
id | integer | | plain | |
name | character varying(20) | | extended | |
course | character varying(20) | | extended | |
score | integer | | plain | |
Row Level Security Policies:
POLICY "test_3_r" FOR ALL
TO public
USING (((name)::name = "current_user"()))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true
sql
--切换用户zhangsan进行SELECT操作
[omm@node1 root]$ gsql -d postgres -U zhangsan -p 26000 -ar
GaussDB=> SELECT * FROM test_3;
id | name | course | score
----+----------+--------+-------
1 | zhangsan | 语文 | 90
2 | zhangsan | 数学 | 95
3 | zhangsan | 英语 | 85
(3 rows)
sql
--切换用户lisi进行SELECT操作
[omm@node1 root]$ gsql -d postgres -U lisi -p 26000 -ar
GaussDB=> SELECT * FROM test_3;
id | name | course | score
----+------+--------+-------
4 | lisi | 语文 | 85
5 | lisi | 数学 | 90
6 | lisi | 英语 | 95
(3 rows)
2)修改行访问策略,实现"学生只能在8:00-18:00查看自己的成绩"
sql
ALTER ROW LEVEL SECURITY POLICY test_3_r
ON test_3
USING (name = CURRENT_USER AND current_time >= TIME '08:00:00' AND current_time <= TIME '18:00:00');
--查看表test_3相关信息。通过元命令 "\d+ test_3" 或者通过系统表"PG_RLSPOLICY"
sql
GaussDB=# \d+ test_3
Table "public.test_3"
Column | Type | Modifiers | Storage | Stats target | Description
--------+-----------------------+-----------+----------+--------------+-------------
id | integer | | plain | |
name | character varying(20) | | extended | |
course | character varying(20) | | extended | |
score | integer | | plain | |
Row Level Security Policies:
POLICY "test_3_r" FOR ALL
TO public
USING (((((name)::name = "current_user"()) AND (('now'::text)::time with time zone >= ('08:00:00'::time without time zone)::time with time zone)) AND (('now'::text)::time with time zone <= ('18:00:00'::time without time zone)::time with time zone)))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true
四、注意事项
- 不支持外表、本地临时表、视图定义行访问控制策略。
- 同一张表可以创建多个行访问控制策略。
- 系统管理员不受行访问控制影响。
- 不支持对添加了行级访问控制策略的表字段进行修改数据类型操作。
- 行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL表示会影响SELECT、UPDATE、DELETE三种操作,默认为ALL。
- 需要打开该表的行访问控制开关(ALTER TABLE ... ENABLE ROW LEVEL SECURITY),否则不生效。
- 行访问控制策略名称是针对表的,同一个数据表上不能有同名的行访问控制策略;对不同的数据表,可以有同名的行访问控制策略。
五、小结
通过本文的介绍,读者可以了解到GaussDB数据库表创建行访问控制策略的重要性和具体实现方法。行访问控制策略是一种有效的数据保护技术,可以防止未经授权的访问和恶意攻击,提高数据的安全性和可靠性。 在实际应用中,根据不同的业务需求和安全要求,可以灵活运用GaussDB提供的行访问控制策略功能,制定相应的安全策略,以保障数据的安全性和隐私性。
------结束