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




