GaussDB数据库表创建行访问控制策略

目录

一、前言

二、GaussDB中的行访问控制

1、CREATE ROW LEVEL SECURITY POLICY语法

2、ALTER ROW LEVEL SECURITY POLICY语法

3、ROW LEVEL SECURITY策略与适配SQL语法关系

三、GaussDB中的行访问控制策略示例

1、实现GaussDB行访问控制的一般步骤

2、行访问控制策略的创建与修改(示例)

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等)。

1CREATE ROW LEVEL SECURITY POLICY语法

对表创建行访问控制策略。

1)语法:

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)语法:

--修改已存在行访问控制策略的名称
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)创建行访问控制策略,实现“学生自己只能查看自己的课程成绩”。

--创建用户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);
--查看表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

--切换用户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)

--切换用户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查看自己的成绩”

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”

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提供的行访问控制策略功能,制定相应的安全策略,以保障数据的安全性和隐私性。

——结束

华为发布 HarmonyOS NEXT 鸿蒙星河版(开发者预览) 云风宣布开源基于 Lua 的自研游戏引擎 Ant Engine 谷歌华人工程师殴打妻子致死 德国程序员因报告漏洞被判罚 2.4 万元 周鸿祎回应坚定支持华为:因为 360 也被制裁了 MySQL 8.3.0 GA Docker 25.0.0 发布 网易云音乐第三方开源 API 因侵权被要求删除 ReiserFS 作者在狱中就被 Linux 内核弃用发表评论 FreeBSD 也要“锈化”?团队称考虑在基础系统采用 Rust
{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/gaussdb/blog/10928280