暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

openGauss训练营学习心得---三权分立功能测试

原创 陈晓辉 2021-09-14
1626

利用一个周末(9/11-12)的下午,学习了一下华为推出的开源数据库openGauss。总的来说,openGauss数据库比PostgreSql数据库无论从性能还是安全性都有了大幅度的提升。这里面可圈可点的地方有很多,在朱金伟老师的《openGauss体系架构》里都做了较为全面的讲述,推荐大家去看一下。

因为笔者也是在数据库安全领域工作多年,所以对Opengauss数据库在安全领域的一些创新格外关注,这其中就有“三权分立”设计。

关于“三权分立”,华为官方的用户使用手册是这样介绍的。

[三权分立](管理用户及权限 - 三权分立 - 《华为 openGauss (GaussDB) v2.0 使用手册》)

默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。

在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立。
将系统管理员的部分权限分立给安全管理员和审计管理员,形成系统管理员、安全管理员和审计管理员三权分立。

三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。
即不再拥有创建角色和用户的权限,并不再拥有查看和维护数据库审计日志的权限。

三权分立后,系统管理员只会对自己作为所有者的对象有权限。
初始用户的权限不受三权分立设置影响。因此建议仅将此初始用户作为DBA管理用途,而非业务应用。

三权分立的设置办法为:将参数enableSeparationOfDuty设置为on。
三权分立前的权限详情及三权分立后的权限变化,请分别参见表1和表2。

表1:
1 2.png

表2:
2 2.png

通过上面的叙述,可以直观的理解为Opengauss数据库的“三权分立”就是将“系统管理员”的权限进行了约束,
只对自己创建的对象和public schema下的对象有操作权限,而不是之前的对所有的Schema(dbe_perf以外)对象都有操作权限。

为了验证上面的认识是否正确,笔者做了如下的测试。

--启动Opengauss数据库
[omm@node1 ~]$ gsql -d postgres -p 26000 -r

postgres=# select version();
                                                                                version
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.2.4 (openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr   on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit
(1 row)

postgres=# show enableSeparationOfDuty;
enableSeparationOfDuty
------------------------
off

--使用初始用户“omm”登录数据库
[omm@node1 ~]$ gsql -d postgres -p 26000 -r
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

--创建系统管理员“sysdba”(SYSADMIN权限)用户
postgres=# CREATE USER sysdba WITH SYSADMIN password "sysdba@123";
CREATE ROLE
postgres=# \q

--使用系统管理员“sysdba”用户登录数据库
[omm@node1 ~]$ gsql -d postgres -p 26000 -U sysdba
Password for user sysdba:sysdba@123
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

--查看参数“enableSeparationOfDuty”
test_db1=> show enableSeparationOfDuty;
enableSeparationOfDuty
------------------------
off
(1 row)

--创建普通用户“test_u1”
postgres=> CREATE USER test_u1 password "test@123";
CREATE ROLE

--为用户“test_u1”创建数据库“test_db1”
postgres=> CREATE DATABASE test_db1 with owner=test_u1;
CREATE DATABASE

--使用普通用户“test_u1”登录数据库
[omm@node1 ~]$ gsql -d test_db1 -p 26000 -U test_u1 -W test@123
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

--创建Schema“test_schema1”
test_db1=> create schema test_schema1;
CREATE SCHEMA
test_db1=> grant all on schema test_schema1 to test_u1;
GRANT

--执行表关联操作
test_db1=> set search_path to test_schema1;
SET
test_db1=> create table test_t1 (c1 int);
CREATE TABLE
test_db1=> insert into test_t1 values(222);
INSERT 0 1
test_db1=> select * from test_t1;
c1
-----
222
(1 row)

--使用管理员用户“sysdba”操作表“test_t1”
[omm@node1 ~]$ gsql -d test_db1 -p 26000 -U sysdba -W sysdba@123
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

test_db1=> set search_path=test_schema1;
SET
test_db1=> alter database test_db1 set search_path to test_schema1;
ALTER DATABASE
test_db1=> select * from test_t1;
c1
-----
222
(1 row)

test_db1=> delete from test_t1;
DELETE 1
test_db1=> insert into test_t1 values(333);
INSERT 0 1
test_db1=> select * from test_t1;
c1
-----
333
(1 row)

--修改参数enableSeparationOfDuty;

--修改配置文件
$DATADIR/postgresql.conf
enableSeparationOfDuty = on

--重启DB
[omm@node1 ~]$ ps -ef | grep gaussdb
omm       4783     1 56 09:15 pts/0    01:04:13 /gaussdb/app/bin/gaussdb -D /gaussdb/data/db1
omm      12551  1140  0 11:09 pts/0    00:00:00 grep --color=auto gaussdb

[omm@node1 ~]$ kill -9 4783

[omm@node1 ~]$ ps -ef | grep gaussdb
omm      12585  1140  0 11:10 pts/0    00:00:00 grep --color=auto gaussdb

[omm@node1 ~]$ /gaussdb/app/bin/gaussdb -D /gaussdb/data/db1 &

[root@node1 ~]# ps -ef | grep gaussdb
omm      12590  1140 55 11:10 pts/0    00:00:21 /gaussdb/app/bin/gaussdb -D /gaussdb/data/db1
root     12736 12689  0 11:10 pts/1    00:00:00 grep --color=auto gaussdb

[root@node1 ~]# su - omm
Last login: Tue Sep 14 09:14:06 CST 2021 on pts/0
[omm@node1 ~]$ gsql -d test_db1 -p 26000 -U sysdba -W sysdba@123
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

test_db1=> show enableSeparationOfDuty;
enableSeparationOfDuty
------------------------
on
(1 row)

--查看普通用户“test_u1”的表
[omm@node1 ~]$ gsql -d test_db1 -p 26000 -U test_u1 -W test@123
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

test_db1=> \dt
                              List of relations
    Schema    |  Name   | Type  |  Owner  |             Storage
--------------+---------+-------+---------+----------------------------------
test_schema1 | test_t1 | table | test_u1 | {orientation=row,compression=no}
(1 row)

--尝试使用管理员用户“sysdba”操作普通用户“test_u1”的表
[omm@node1 ~]$ gsql -d test_db1 -p 26000 -U sysdba -W sysdba@123
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

test_db1=> \dt
No relations found.

test_db1=> select * from test_t1;
ERROR:  relation "test_t1" does not exist on dn_6001
LINE 1: select * from test_t1;
                      ^
test_db1=> create table test_t2(c1 int);
ERROR:  permission denied for schema test_schema1

--初始用户“omm”还是拥有很大的权限
[omm@node1 ~]$ gsql -d test_db1 -p 26000 -r
gsql ((openGauss 2.0.1 build d97c0e8a) compiled at 2021-06-02 19:37:17 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

test_db1=# \dt
                              List of relations
    Schema    |  Name   | Type  |  Owner  |             Storage
--------------+---------+-------+---------+----------------------------------
test_schema1 | test_t1 | table | test_u1 | {orientation=row,compression=no}
(1 row)

test_db1=# select * from test_t1;
c1
-----
333
(1 row)

test_db1=# delete from test_t1;
DELETE 1
test_db1=# insert into test_t1 values(444);
INSERT 0 1
test_db1=# select * from test_t1;
c1
-----
444
(1 row)

通过上面的实机检测,可以确认到上面的理解是没有问题的。

但是,笔者认为,上面的“三权分立”只是将“管理员用户”纳入权限赋予/回收的管理体系,并不是真正意义的“三权分立”,因为“初始用户”还是没有任何约束的“上帝”。

还有,培训的讲师说的其他数据库里没有“三权分立”的说法还是有待商榷的,其实ORACLE数据在很早以前(10g Release2)就实现了完整意义的“三权分立”。这个功能就是“oracle database vault”,下面是“oracle database vault”如何实现“三权分立”的架构图:

非“三权分立”架构:
3 2.png

“三权分立”架构:
4 2.png

另外,上面的通过“Realm”实现的“三权分立”以外,还实现了以下几种复杂场景下的访问控制,有兴趣的同学可以参照一下ORACLE的官方文档。

* Rule Sets
* Command Rules
* Factors

[Oracle 19c Document](Oracle Database Vault Administrator’s Guide, 19c)

2021/09/14 @ Dalian

最后修改时间:2021-09-14 14:13:50
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论