实验十八 GaussDB安全管理实验

实验环境准备:

sql 复制代码
su - Ruby
source /home/Ruby/gauss_env_file
cm_ctl query -Cv

gsql -d postgres  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
create database security_db;

一、登录认证与口令安全

1.配置访问gs_hba规则

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
CREATE USER security_test_role password 'Gauss@123';

2.使用gs_guc工具在gs_hba.conf中新增访问规则。

增加规则1:目标数据库为security_db,用户为security_test_role,客户端IP为192.168.3.60(通过ifconfig查看客户端IP),认证方式为sha256。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -h "host  security_db  security_test_role  0.0.0.0/0  sha256"

3.通过gsql使用security_test_role访问数据库security_db,目标IP为192.168.3.60。

sql 复制代码
gsql -p 30100 -d security_db -r -U security_test_role -W Gauss@123 -h 192.168.3.60

4.配置gs_hba.conf访问黑名单。

sql 复制代码
gs_guc -U root -K Huawei@1234  reload -Z datanode -N all -I all -h "host  security_db  security_test_role  0.0.0.0/0  reject"

5.使用security_test_role登录数据库security_db失败,并返回如下报错信息。

sql 复制代码
gsql -p30100 -d security_db -r -U security_test_role -W Gauss@123 -h 192.168.3.60

返回两行报错原因是环境变量PGSSLMODE默认为prefer,会先尝试SSL连接,失败后再尝试非SSL连接。

6.配置GUC参数password_encryption_type为3,即采用SM3方式对密码加密。

sql 复制代码
gs_guc -U root -K Huawei@1234  reload -Z datanode -N all -I all -c "password_encryption_type=3"

7.使用gsql,以管理员用户登录security_db数据库,创建普通用户test_user,此时使用sm3方式对密码加密。使用test_user连接数据库失败。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
CREATE USER test_user password 'Gauss@123';
gsql -p 30100 -d security_db -r -U test_user -W Gauss@123 -h 192.168.3.60

8.配置gs_hba.conf支持国密SM3算法。

目标数据库为security_db,用户为test_user,客户端IP为192.168.3.60(通过ifconfig查看客户端IP),认证方式为SM3,即配置国密算法。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -h "host  security_db  test_user  192.168.3.60/32  sm3"

9.通过gsql使用test_user访问数据库security_db,目标IP为192.168.3.60

sql 复制代码
gsql -p 30100 -d security_db -r -U test_user -W Gauss@123 -h 192.168.3.60

10.使用gs_guc工具删除gs_hba.conf中的访问规则。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -h "host  security_db  security_test_role  192.168.3.60/32"
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -h "host  security_db  test_user  192.168.3.60/32"
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -h "host  all  all  192.168.3.60/32"
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -c "password_encryption_type=2"

二、配置SSL连接。

1.确保数据库服务端ssl已开启,并且正确配置ssl证书。

集群安装时,默认会生成自签名SSL证书,并存放在$GAUSSHOME/share/sslcert/gsql目录下,包括服务端证书和客户端证书,其中服务端证书会拷贝到CN和DN的数据目录下并在数据库初始化时加载。此步骤默认证书已生成,并确保以下GUC参数配置正确。

查看相关ssl参数配置情况。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

show ssl;
show ssl_ciphers;
show  ssl_cert_file;
show ssl_key_file;
show ssl_ca_file;

2.配置gsql客户端SSL环境变量,开启SSL连接。

环境变量PGSSLMODE用于设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级。如果不配置默认为prefer,表示首先尝试SSL连接,如果连接失败,将尝试非SSL连接。

执行如下命令,配置环境变量PGSSLMODE为require,表示只尝试SSL连接。使用gsql进行SSL连接。

sql 复制代码
export PGSSLMODE="require"
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

注意:

(1)连接信息中显示"SSL connection"表示通过SSL连接成功,cipher为本次连接使用的SSL加密套件。

(2)使用gsql连接时需要使用-h参数通过远程TCP连接才可以支持SSL连接。

(3)可以自己尝试配置环境变量PGSSLMODE为disable、allow、verify-ca、verify-full。

(4)恢复参数PGSSLMODE的值为prefer,export PGSSLMODE="prefer"。

三、账户锁定与解锁

1.设置GUC参数failed_login_attempts。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -c "failed_login_attempts=3"

设置GUC参数failed_login_attempts为3,如果用户输入密码次数超过此设置次数则系统将自动锁定该账户。

2.使用管理员用户登录数据库security_db,查看参数failed_login_attempts,并创建用户security_user2。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

show failed_login_attempts;
CREATE USER security_user2 password 'Gauss@123';

3.使用security_user2登录数据库security_db,连续3次输入错误密码后账户锁定。

sql 复制代码
gsql -p 30100 -d security_db -r -U security_user2 -W Test@234 -h 192.168.3.60 -r

4.使用管理员用户登录数据库security_db,对security_user2解锁。

查询security_user2的用户状态,rolestatus为1时表示锁定,0表示解锁;并对security_user2解锁:

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

select rolname,failcount,rolstatus from pg_user_status a, pg_roles b where a.roloid=b.oid and b.rolname='security_user2';

alter user security_user2 account unlock;

select rolname,failcount,rolstatus from pg_user_status a, pg_roles b where a.roloid=b.oid and b.rolname='security_user2';

5.再次使用security_user2登录数据库security_db,输入正确密码登录成功。

sql 复制代码
gsql -p 30100 -d security_db -r -U security_user2 -W Gauss@123  -h 192.168.3.60 -r

四、密码复杂度校验。

1.使用管理员用户登录数据库security_db,使用不同复杂度的密码创建用户security_user3。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
CREATE USER security_user3 password 'test123';
CREATE USER security_user3 password 'test12345';
CREATE USER security_user3 password 'Gauss@123';

前两次不满足密码复杂度校验创建用户失败,第3次创建成功。

2.使用security_user3登录数据库security_db后,修改security_user3密码,回显 ALTER ROLE ,表示修改成功。

sql 复制代码
alter user security_user3 password 'test@5678';
alter user security_user3 identified by 'Gauss@123' replace 'Gauss@123';
alter user security_user3 identified by 'Gauss@1234' replace 'Gauss@123';
\q

3.使用管理员用户登录数据库security_db后删除用户security_user2、security_user3、security_test_role、test_user,清理环境。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
drop user security_user2;
drop user security_user3;
drop user security_test_role;
drop user test_user;

五、GaussDB数据库权限管理。

1.用户/角色管理

步骤1、创建角色role1和角色role2,密码设定为Gauss@123。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

CREATE ROLE role1 WITH password 'Gauss@123';
CREATE ROLE role2 WITH password 'Gauss@123';

步骤2、修改角色role1具有CREATEDB和LOGIN属性,角色role2为默认权限。

sql 复制代码
ALTER ROLE role1 WITH CREATEDB;
ALTER ROLE role1 WITH LOGIN;

步骤3、查看系统表系统视图pg_roles获取角色的相关信息。

sql 复制代码
SELECT oid, rolname, rolcreatedb, rolcanlogin FROM pg_roles WHERE rolname='role1' or rolname='role2';

步骤4、使用gsql,以用户role1登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U role1 -W Gauss@123

步骤5、通过以下命令创建数据库test_db,显示CREATE DATABASE表示创建成功。

sql 复制代码
create database test_db;

步骤6、将角色role1权限授予角色role2,则角色role2继承role1的相关对象权限。

sql 复制代码
GRANT role1 TO role2;

步骤7、查看系统表pg_auth_members获取角色成员关系。

sql 复制代码
SELECT * FROM pg_auth_members;

步骤8、使用gsql,以管理员用户root登录security_db数据库。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

步骤9、删除数据库test_db,删除角色role1和role2。

sql 复制代码
DROP DATABASE test_db;
DROP ROLE role1,role2;

2.对象权限的授予和回收

步骤1、创建用户user1和用户user2,密码设定为Gauss@123。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

CREATE USER user1 password 'Gauss@123';
CREATE USER user2 password 'Gauss@123';

步骤2、使用gsql,以用户user2登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user2 -W Gauss@123

步骤3、创建用户表tbl,将用户user2的USAGE权限授予用户user1,将对表tbl进行SELECT的权限授予用户user1。

sql 复制代码
CREATE TABLE user2.tbl(id int, name varchar(5));
GRANT USAGE ON SCHEMA user2 TO user1;
GRANT SELECT ON TABLE user2.tbl TO user1;

步骤4、使用gsql,以用户user1登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user1 -W Gauss@123

步骤5、用户user1查询用户表tbl成功,插入用户表tbl权限不足失败。

sql 复制代码
SELECT * FROM user2.tbl;
INSERT INTO user2.tbl VALUES (1,'TOM');

步骤6、使用gsql,以用户user2登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user2 -W Gauss@123

步骤7、撤销用户user1对表tbl进行select的权限,将对表tbl进行insert的权限授予用户user1。

sql 复制代码
REVOKE SELECT ON TABLE user2.tbl FROM user1;
GRANT INSERT ON TABLE user2.tbl TO user1;

步骤8、使用gsql,以用户user1登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user1 -W Gauss@123

步骤9、查询用户表tbl权限不足失败,插入用户表tbl成功。

sql 复制代码
SELECT * FROM user2.tbl;
INSERT INTO user2.tbl VALUES (1,'TOM');

步骤10、使用gsql,以管理员用户root登录security_db数据库。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

步骤11、清理环境。

sql 复制代码
DROP USER user1, user2 CASCADE;

3.行级访问控制策略的创建和使用

步骤1、创建用户Mary和用户Tom,创建信息表pat_info。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

CREATE USER "Mary" PASSWORD 'Gauss@123';
CREATE USER "Tom" PASSWORD 'Gauss@123';
CREATE TABLE pat_info (patient varchar(10), doctor varchar(10), age int);

步骤2、向信息表pat_info中插入测试数据。

sql 复制代码
INSERT INTO pat_info VALUES('Peter','Mary',25);
INSERT INTO pat_info VALUES('Bob','Mary',56);
INSERT INTO pat_info VALUES('Julie','Tom',38);

步骤3、查看信息表pat_info,将信息表pat_info的SELECT权限授予用户Mary和Tom。

sql 复制代码
SELECT * FROM pat_info;
GRANT SELECT ON TABLE pat_info TO "Mary","Tom";

步骤4、使用gsql,以用户Mary登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Mary -W Gauss@123

步骤5、查询信息表pat_info。

sql 复制代码
SELECT * FROM pat_info;

步骤6、使用gsql,以用户Tom登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Tom -W Gauss@123

步骤7、查询信息表pat_info。

sql 复制代码
SELECT * FROM pat_info;

步骤8、使用gsql,以管理员用户root登录security_db数据库。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

步骤9、创建行级访问控制策略,使得doctor只能查看属于自己的patient信息,并打开表上的行级访问控制开关。

sql 复制代码
CREATE ROW LEVEL SECURITY POLICY rl_select ON pat_info FOR select USING(doctor=current_user);
ALTER TABLE pat_info ENABLE ROW LEVEL SECURITY;

步骤10、使用gsql,以用户Mary登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Mary -W Gauss@123

步骤11、查询信息表pat_info。

sql 复制代码
SELECT * FROM pat_info;

步骤12、使用gsql,以用户Tom登录security_db数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Tom -W Gauss@123

步骤13、查询信息表pat_info。

sql 复制代码
SELECT * FROM pat_info;

步骤14、使用gsql,以管理员用户root登录security_db数据库。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

步骤15、清理环境。

sql 复制代码
DROP TABLE pat_info;
DROP USER "Mary","Tom";

六、数据库审计。

1.传统审计

(1)修改审计对象GUC参数audit_system_object的值为12,表示审计TABLE和USER对象的CREATE、DROP、ALTER操作。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode  -N all -I all -c "audit_system_object=12"

(2)root用户通过hccde_client客户端gsql登录客户端。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

(3)查看audit_system_object值返回12即修改成功。

sql 复制代码
show audit_system_object;

(4)root用户创建审计管理员audit_user和普通用户uesr1,audit_user用于查询审计日志,创建普通用户user1用于执行SQL操作。

sql 复制代码
CREATE USER auditadmin with AUDITADMIN password 'Gauss@123';
CREATE USER audit_t1 password 'Gauss@123';

(5)使用audit_t1登录数据库,创建数据表t1并插入数据然后添加一列name,再删除t1。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U audit_t1 -W Gauss@123

create table t1 (id int);
insert into t1 values(123);
alter table t1 add column name varchar(20);
drop table t1;

(6)登录root用户删除普通用户audit_t1。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
drop user audit_t1;

(7)使用auditadmin登录数据库查询审计日志。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U auditadmin -W Gauss@123

按起止时间查询审计日志,并查询用户audit_t1执行的ddl_table操作,root用户的ddl_user操作,例如:

sql 复制代码
SELECT * from pg_query_audit(sysdate-0.1, sysdate) where username='audit_t1' and type='ddl_table';

SELECT * from pg_query_audit(sysdate-0.1, sysdate) where username='root' and type='ddl_user' and  object_name='audit_t1';

(8)恢复环境,恢复审计GUC参数。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode  -N all -I all -c "audit_system_object=67121159"

(9)恢复环境,使用root用户登录数据库,删除用户auditadmin。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

drop user auditadmin;

2.统一审计。

(1)修改安全策略GUC参数。

sql 复制代码
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -c "enable_security_policy=on"

(2)修改/etc/rsyslog.conf。

sql 复制代码
vi /etc/rsyslog.conf

末尾添加:
local0.* /var/log/localmessages

(3)修改/etc/rsyslog.conf中字段,设置为以下内容。

sql 复制代码
module(load="imuxsock"
SysSock.Use="on")

(4) 创建统一审计记录文件并设置文件权限范围。

sql 复制代码
touch /var/log/localmessages
chmod 600 /var/log/localmessages

(5)重启rsyslog服务使配置生效。

sql 复制代码
systemctl restart rsyslog

(6)root用户通过hccde_client客户端gsql登录客户端。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r

(7)查询enable_security_policy已打开。

sql 复制代码
show enable_security_policy;

(8)创建安全策略管理员pol_user_adt用于配置资源标签和审计策略。

sql 复制代码
CREATE USER pol_user_adt with poladmin password 'Gauss@123';

(9)创建普通用户adt_user1、adt_user2用于执行SQL操作。

sql 复制代码
CREATE USER adt_user1 password 'Gauss@123';
CREATE USER adt_user2 password 'Gauss@123';

(10)在public模式下创建表tb_for_audit,并授予adt_user1对此表的所有操作权限。

sql 复制代码
CREATE TABLE public.tb_for_audit(col1 text, col2 text, col3 text);
GRANT ALL PRIVILEGES on public.tb_for_audit to adt_user1 WITH GRANT OPTION;

(11)使用pol_user_adt登录数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U pol_user_adt -W Gauss@123

(12)在表public.tb_for_audit上创建资源标签lab1。

sql 复制代码
CREATE RESOURCE LABEL lab1 ADD TABLE(public.tb_for_audit);

(13)创建审计策略,审计用户adt_user1在资源标签lab1上的所有DDL、DML操作。

sql 复制代码
CREATE AUDIT POLICY pol1 PRIVILEGES all on LABEL(lab1) FILTER ON ROLES(adt_user1);
CREATE AUDIT POLICY pol2 ACCESS all on LABEL(lab1) FILTER ON ROLES(adt_user1);

(14)使用adt_user1登录数据库。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U adt_user1 -W Gauss@123

(15)执行DDL操作,触发审计策略记录审计日志。

sql 复制代码
GRANT INSERT ON TABLE public.tb_for_audit to adt_user2;
REVOKE INSERT ON TABLE public.tb_for_audit from adt_user2;

(16)执行DML操作,触发审计策略记录审计日志。

sql 复制代码
insert into public.tb_for_audit values('11', '22', '33');
update public.tb_for_audit set col3='55' where col1='11';
select * from public.tb_for_audit;
delete from public.tb_for_audit where col1='11';

(17)重复步骤1,登录server端设备后台,用操作系统root用户查看审计日志。

执行如下命令查看审计日志记录。

sql 复制代码
cat /var/log/localmessages

也可以查看adt_user1相关的审计日志:

sql 复制代码
cat /var/log/localmessages | grep adt_user1

(18)登录hccde_client客户端使用pol_user_adt登录数据库,删除审计策略和资源标签。

sql 复制代码
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U pol_user_adt -W Gauss@123
DROP AUDIT POLICY pol1;
DROP AUDIT POLICY pol2;
DROP RESOURCE LABEL lab1;

(19)使用root登录数据库,删除用户pol_user_adt、adt_user1和adt_user2,删除表public.tb_for_audit。

sql 复制代码
gsql -d security_db  -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
drop user pol_user_adt;
drop user adt_user1 cascade;
drop user adt_user2 cascade;
drop table public.tb_for_audit;
相关推荐
banjin3 天前
在开发者空间云开发环境使用Vanna配合ollama/maas使用自然语言与GaussDB对话
gaussdb
DarkAthena3 天前
【GaussDB】在duckdb中查询GaussDB的数据
数据库·gaussdb·duckdb
DarkAthena4 天前
【Docker】定制化构建一个可以运行GaussDB的kylinv10sp3系统的docker镜像
数据库·docker·容器·gaussdb
xuekai200809019 天前
GaussDB一次小故障修复
gaussdb
Gauss松鼠会9 天前
GaussDB慢sql信息收集和执行计划查看
数据库·sql·gaussdb
小云数据库服务专线10 天前
GaussDB 应用侧报no pg_hba.conf entry for host处理方法
服务器·网络·gaussdb
小云数据库服务专线13 天前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb
小云数据库服务专线15 天前
GaussDB DN动态内存使用满导致DN主备切换
gaussdb
小云数据库服务专线16 天前
GaussDB 分布式下, 报错concurrent update under Stream mode is not yet support
gaussdb