实验十八 GaussDB安全管理实验
实验环境准备:
su - Ruby
source /home/Ruby/gauss_env_file
cm_ctl query -Cvgsql -d postgres -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
create database security_db;
一、登录认证与口令安全
1.配置访问gs_hba规则
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。
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。
gsql -p 30100 -d security_db -r -U security_test_role -W Gauss@123 -h 192.168.3.60
4.配置gs_hba.conf访问黑名单。
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失败,并返回如下报错信息。
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方式对密码加密。
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连接数据库失败。
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,即配置国密算法。
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
gsql -p 30100 -d security_db -r -U test_user -W Gauss@123 -h 192.168.3.60
10.使用gs_guc工具删除gs_hba.conf中的访问规则。
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参数配置情况。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rshow 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连接。
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。
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。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rshow failed_login_attempts;
CREATE USER security_user2 password 'Gauss@123';
3.使用security_user2登录数据库security_db,连续3次输入错误密码后账户锁定。
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解锁:
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rselect 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,输入正确密码登录成功。
gsql -p 30100 -d security_db -r -U security_user2 -W Gauss@123 -h 192.168.3.60 -r
四、密码复杂度校验。
1.使用管理员用户登录数据库security_db,使用不同复杂度的密码创建用户security_user3。
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 ,表示修改成功。
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,清理环境。
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。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rCREATE ROLE role1 WITH password 'Gauss@123';
CREATE ROLE role2 WITH password 'Gauss@123';
步骤2、修改角色role1具有CREATEDB和LOGIN属性,角色role2为默认权限。
ALTER ROLE role1 WITH CREATEDB;
ALTER ROLE role1 WITH LOGIN;
步骤3、查看系统表系统视图pg_roles获取角色的相关信息。
SELECT oid, rolname, rolcreatedb, rolcanlogin FROM pg_roles WHERE rolname='role1' or rolname='role2';
步骤4、使用gsql,以用户role1登录security_db数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U role1 -W Gauss@123
步骤5、通过以下命令创建数据库test_db,显示CREATE DATABASE表示创建成功。
create database test_db;
步骤6、将角色role1权限授予角色role2,则角色role2继承role1的相关对象权限。
GRANT role1 TO role2;
步骤7、查看系统表pg_auth_members获取角色成员关系。
SELECT * FROM pg_auth_members;
步骤8、使用gsql,以管理员用户root登录security_db数据库。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
步骤9、删除数据库test_db,删除角色role1和role2。
DROP DATABASE test_db;
DROP ROLE role1,role2;
2.对象权限的授予和回收
步骤1、创建用户user1和用户user2,密码设定为Gauss@123。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rCREATE USER user1 password 'Gauss@123';
CREATE USER user2 password 'Gauss@123';
步骤2、使用gsql,以用户user2登录security_db数据库。
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。
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数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user1 -W Gauss@123
步骤5、用户user1查询用户表tbl成功,插入用户表tbl权限不足失败。
SELECT * FROM user2.tbl;
INSERT INTO user2.tbl VALUES (1,'TOM');
步骤6、使用gsql,以用户user2登录security_db数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user2 -W Gauss@123
步骤7、撤销用户user1对表tbl进行select的权限,将对表tbl进行insert的权限授予用户user1。
REVOKE SELECT ON TABLE user2.tbl FROM user1;
GRANT INSERT ON TABLE user2.tbl TO user1;
步骤8、使用gsql,以用户user1登录security_db数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U user1 -W Gauss@123
步骤9、查询用户表tbl权限不足失败,插入用户表tbl成功。
SELECT * FROM user2.tbl;
INSERT INTO user2.tbl VALUES (1,'TOM');
步骤10、使用gsql,以管理员用户root登录security_db数据库。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
步骤11、清理环境。
DROP USER user1, user2 CASCADE;
3.行级访问控制策略的创建和使用
步骤1、创建用户Mary和用户Tom,创建信息表pat_info。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rCREATE 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中插入测试数据。
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。
SELECT * FROM pat_info;
GRANT SELECT ON TABLE pat_info TO "Mary","Tom";
步骤4、使用gsql,以用户Mary登录security_db数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Mary -W Gauss@123
步骤5、查询信息表pat_info。
SELECT * FROM pat_info;
步骤6、使用gsql,以用户Tom登录security_db数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Tom -W Gauss@123
步骤7、查询信息表pat_info。
SELECT * FROM pat_info;
步骤8、使用gsql,以管理员用户root登录security_db数据库。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
步骤9、创建行级访问控制策略,使得doctor只能查看属于自己的patient信息,并打开表上的行级访问控制开关。
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数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Mary -W Gauss@123
步骤11、查询信息表pat_info。
SELECT * FROM pat_info;
步骤12、使用gsql,以用户Tom登录security_db数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U Tom -W Gauss@123
步骤13、查询信息表pat_info。
SELECT * FROM pat_info;
步骤14、使用gsql,以管理员用户root登录security_db数据库。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
步骤15、清理环境。
DROP TABLE pat_info;
DROP USER "Mary","Tom";
六、数据库审计。
1.传统审计
(1)修改审计对象GUC参数audit_system_object的值为12,表示审计TABLE和USER对象的CREATE、DROP、ALTER操作。
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -c "audit_system_object=12"
(2)root用户通过hccde_client客户端gsql登录客户端。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
(3)查看audit_system_object值返回12即修改成功。
show audit_system_object;
(4)root用户创建审计管理员audit_user和普通用户uesr1,audit_user用于查询审计日志,创建普通用户user1用于执行SQL操作。
CREATE USER auditadmin with AUDITADMIN password 'Gauss@123';
CREATE USER audit_t1 password 'Gauss@123';
(5)使用audit_t1登录数据库,创建数据表t1并插入数据然后添加一列name,再删除t1。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U audit_t1 -W Gauss@123create table t1 (id int);
insert into t1 values(123);
alter table t1 add column name varchar(20);
drop table t1;
(6)登录root用户删除普通用户audit_t1。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
drop user audit_t1;
(7)使用auditadmin登录数据库查询审计日志。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U auditadmin -W Gauss@123
按起止时间查询审计日志,并查询用户audit_t1执行的ddl_table操作,root用户的ddl_user操作,例如:
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参数。
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -c "audit_system_object=67121159"
(9)恢复环境,使用root用户登录数据库,删除用户auditadmin。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -rdrop user auditadmin;
2.统一审计。
(1)修改安全策略GUC参数。
gs_guc -U root -K Huawei@1234 reload -Z datanode -N all -I all -c "enable_security_policy=on"
(2)修改/etc/rsyslog.conf。
vi /etc/rsyslog.conf末尾添加:
local0.* /var/log/localmessages
(3)修改/etc/rsyslog.conf中字段,设置为以下内容。
module(load="imuxsock"
SysSock.Use="on")
(4) 创建统一审计记录文件并设置文件权限范围。
touch /var/log/localmessages
chmod 600 /var/log/localmessages
(5)重启rsyslog服务使配置生效。
systemctl restart rsyslog
(6)root用户通过hccde_client客户端gsql登录客户端。
gsql -d security_db -h 192.168.3.60 -U root -W Huawei@1234 -p 30100 -r
(7)查询enable_security_policy已打开。
show enable_security_policy;
(8)创建安全策略管理员pol_user_adt用于配置资源标签和审计策略。
CREATE USER pol_user_adt with poladmin password 'Gauss@123';
(9)创建普通用户adt_user1、adt_user2用于执行SQL操作。
CREATE USER adt_user1 password 'Gauss@123';
CREATE USER adt_user2 password 'Gauss@123';
(10)在public模式下创建表tb_for_audit,并授予adt_user1对此表的所有操作权限。
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登录数据库。
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。
CREATE RESOURCE LABEL lab1 ADD TABLE(public.tb_for_audit);
(13)创建审计策略,审计用户adt_user1在资源标签lab1上的所有DDL、DML操作。
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登录数据库。
gsql -d security_db -p 30100 -r -h 192.168.3.60 -U adt_user1 -W Gauss@123
(15)执行DDL操作,触发审计策略记录审计日志。
GRANT INSERT ON TABLE public.tb_for_audit to adt_user2;
REVOKE INSERT ON TABLE public.tb_for_audit from adt_user2;
(16)执行DML操作,触发审计策略记录审计日志。
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用户查看审计日志。
执行如下命令查看审计日志记录。
cat /var/log/localmessages
也可以查看adt_user1相关的审计日志:
cat /var/log/localmessages | grep adt_user1
(18)登录hccde_client客户端使用pol_user_adt登录数据库,删除审计策略和资源标签。
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。
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;