实验十八 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;
相关推荐
蒋士峰DBA修行之路11 小时前
实验二十一 GaussDB物理备份恢复
gaussdb
蒋士峰DBA修行之路1 天前
实验二十 GaussDB逻辑备份恢复实验
数据库·gaussdb
蒋士峰DBA修行之路2 天前
实验十九 GaussDB三权分立实验
gaussdb
博睿谷IT99_10 天前
GaussDB 和 openGauss 怎么区分?
数据库·华为认证·opengauss·it·gaussdb
九河云25 天前
华为云 GaussDB:金融级高可用数据库,为核心业务保驾护航
网络·数据库·科技·金融·华为云·gaussdb
小云数据库服务专线1 个月前
GaussDB 数据库架构师修炼(十九)-性能调优-长事务分析
数据库·数据库架构·gaussdb
RestCloud1 个月前
10迁移TiDB数据库数据到GaussDB
数据库·tidb·etl·gaussdb·数据处理·数据同步·集成平台
小云数据库服务专线1 个月前
GaussDB 数据库架构师修炼(十八) SQL执行引擎-概述
sql·数据库架构·gaussdb
小云数据库服务专线1 个月前
GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SPM
数据库·数据库架构·gaussdb