暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

南大通用Gbase8c数据库安全特性一瞥

原创 飞天 2024-04-19
917

初识GBase 8C数据库

GBase 8C是南大通用基于openGauss构建的一款多模多态的分布式数据库。支持行存、列存、内存等多种存储方式(多模:多种存储模式)和单机、主备式、分布式等多种部署形态(多态:多种部署形态)。 具备高性能、高可用、弹性伸缩、高安全性等特性,可部署在物理机、虚拟机、容器、云服务,为关键行业核心系统、互联网业务系统和政企业务系统提供安全、稳定、可靠的数据存储和管理服务。支持标准SQL语法,兼容PostgreSQL和Oracle语法。

Gbase 8c数据库安全

Gbase 8c数据库支持三权分立权限访问控制模型,数据库角色可分为系统管理员、安全管理员和审计管理员。其中安全管理员负责创建和管理用户,系统管理员负责授予和撤销用户权限,审计管理员负责审计所有用户的行为。
默认情况下,使用基于角色的访问控制模型。客户可通过设置参数(enableSeparationOfDuty)来选择是否开启三权分立控制模型。

账户安全策略

自动锁定和解锁帐户、手动锁定和解锁异常帐户和删除不再使用的帐户。

自动锁定

密码错误超过failed_login_attempts参数设定值账户被自动锁定,默认是10次。

postgres=# show failed_login_attempts;
 failed_login_attempts 
-----------------------
 10
(1 row)

参数修改

postgres=# alter system set failed_login_attempts=5;
ALTER SYSTEM SET
或者使用guc命令
gs_guc reload -Z coordinator -N all -I all -c "failed_login_attempts=3"

自动解锁

帐户被锁定时间超过password_lock_time参数设定值,账号将会自动解锁,默认是1天。

postgres=# show password_lock_time;
 password_lock_time 
--------------------
 1d
(1 row)

参数修改

使用guc命令
gs_guc reload -Z coordinator -N all -I all -c "password_lock_time='7d'"

账号手动锁定与解锁

手动锁定账号
ALTER USER test ACCOUNT LOCK;
手动解锁账号
ALTER USER test ACCOUNT UNLOCK;

删除账号

drop user test cascade;

账号的有效期

设置账号的有效期(有效开始时间和有效结束时间)

alter user test VALID BEGIN '2024-01-01 00:00:00' VALID UNTIL '2026-12-31 23:59:59';

密码的安全策略

包括密码的加密算法,密码复杂度,密码重用,密码有效期限,设置用户密码失效等
数据库参数password_encryption_type 的值:0,1,2,3,0代表MD5 1代表md5和sha256,2代表sha256,3代表sm3

密码加密算法

postgres=# show password_encryption_type;
 password_encryption_type 
--------------------------
 1
(1 row)

修改使用alter system set password_encryption_type=2;或者guc命令修改。
修改后创建用户加密策略生效。

postgres=# alter system set password_encryption_type=2;
ALTER SYSTEM SET

密码复杂度

数据库参数password_policy(1、 0),其中1为校验密码复杂度
• 包含大写字母(A-Z)的最少个数(password_min_uppercase)
• 包含小写字母(a-z)的最少个数(password_min_lowercase)
• 包含数字(0-9)的最少个数(password_min_digital)
• 包含特殊字符的最少个数(password_min_special)
• 密码的最小长度(password_min_length)
• 密码的最大长度(password_max_length)
• 至少包含上述四类字符中的三类。
• 不能和用户名、用户名倒写相同,本要求为非大小写敏感。
• 不能和当前密码、当前密码的倒写相同。
• 不能是弱口令

postgres=#  show password_policy;
 password_policy 
-----------------
 1
(1 row)

密码重用

用户修改密码时,只有超过不可重用天数(数据库参数:password_reuse_time)或不可重用次数
(数据库参数:password_reuse_max)的密码才可以使用,也可以进行参数的修改。

postgres=# show password_reuse_time;
 password_reuse_time 
---------------------
 60
(1 row)

postgres=# show password_reuse_max;
 password_reuse_max 
--------------------
 0
(1 row)

密码有效期限

数据库用户的密码都有密码有效期(password_effect_time),当达到密码到期提醒天数
(password_notify_time)时,系统会在用户登录数据库时提示用户修改密码。

postgres=# show password_effect_time;
 password_effect_time 
----------------------
 90
(1 row)

postgres=# show password_notify_time;
 password_notify_time 
----------------------
 7
(1 row)

设置用户密码失效

确保用户首次登录进行密码修改。

postgres=# create user test password 'Gbase_123' expired;
CREATE ROLE
postgres=# \c - test
Password for user test: 
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "postgres" as user "test".
postgres=> \d
ERROR:  Please use "ALTER ROLE user_name IDENTIFIED BY 'password' REPLACE 'old password';" to modify the expired password of user test before operation!
postgres=> 

审计

数据库参数

• audit_enabled:开启审计日志开关
• audit_system_object:判断是否开启审计项的值
• audit_dml_state:dml语句审计
• audit_dml_state_select:select 语句审计开关

打开审计日志开关

postgres=# alter system set audit_enabled=on;
ALTER SYSTEM SET

查看审计日志目录

postgres=# show  audit_directory;
         audit_directory         
---------------------------------
 /data/gbase_db/log/pg_audit/cn1
(1 row)

查看审计日志

postgres=# select time,type,result,userid,username,database,detail_info from pg_query_audit(sysdate- 1,sysdate) where database='test_2'; 
          time          |     type      | result | userid | username | database |                                                                            
      detail_info                                                                                  
------------------------+---------------+--------+--------+----------+----------+----------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
 2024-04-19 22:29:52+08 | login_success | ok     | 10     | gbase    | test_2   | login db(test_2) success,the current user is:gbase, SSL=off
 2024-04-19 22:29:52+08 | set_parameter | ok     | 10     | gbase    | test_2   | SET connection_info = '{"driver_name":"libpq","driver_version":"(multiple_n
odes GBase8cV5 3.0.0B78 build f35d85c7) compiled at 2023-03-06 17:14:54 commit 0 last mr 1247 "}';

根据不同操作类型查看审计日志

postgres=# select detail_info,type,result from pg_query_audit(sysdate-1,sysdate) where type ='ddl_database';
       detail_info       |     type     | result 
-------------------------+--------------+--------
 create database test_2; | ddl_database | ok
(1 row)
postgres=# select detail_info,type,result from pg_query_audit(sysdate-1,sysdate) where type ='lock_user';
          detail_info           |   type    | result 
--------------------------------+-----------+--------
 the user(test) has been locked | lock_user | ok

查看DML审计内容

postgres=# show audit_system_object;
 audit_system_object 
---------------------
 12295
(1 row)
postgres=# alter system set audit_system_object=127;
ALTER SYSTEM SET
说明:数据库参数audit_system_object=127,代表开启了创建表的审计。创建表、删除表和修改表日志均可以正常记录
--打开DML日志
postgres=# alter system set audit_dml_state=1;
ALTER SYSTEM SET
postgres=# create table test3(a int);
CREATE TABLE
postgres=# alter table test3 add (name varchar(50));
ALTER TABLE
postgres=# 
postgres=# select time,detail_info,type,result from pg_query_audit(sysdate-100/3600,sysdate) where object_name='test3';
          time          |                detail_info                |   type    | result 
------------------------+-------------------------------------------+-----------+--------
 2024-04-19 22:48:10+08 | create table test3(a int);                | ddl_table | ok
 2024-04-19 22:48:24+08 | alter table test3 add (name varchar(50)); | ddl_table | ok
(2 rows)
--insert/update/delete测试略

--打开DQL日志
```language
alter system set audit_dml_state_select=1;
--查看登录失败的审计记录
select detail_info,type,result from pg_query_audit(sysdate-1,sysdate)
where type='login_failed';
--查看登陆成功的审计记录
select detail_info,type,result from pg_query_audit(sysdate-1,sysdate) 
where type='login_success';

审计删除

自动删除

1、审计文件占用的磁盘空间或者审计文件的个数超过指定的最大值时,系统将删除最早的审计文件,并记录审计文件删除信息到审计日志中

postgres=# SHOW audit_space_limit; 
 audit_space_limit 
-------------------
 1GB
(1 row)

手动删除

postgres=# SELECT pg_delete_audit('2024-04-10 00:00:00','2014-04-19 23:00:00');
 pg_delete_audit 
-----------------
 
(1 row)

总结

数据库安全对于企业或机构来说是至关重要的。平常需要采取一系列措施,包括访问控制、数据加密、备份恢复、安全审计等,及时发现并消除潜在的安全隐患。

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

文章被以下合辑收录

评论