GBase 8a
运维管理
文章
精选

GBase 8a 安全加固实战:权限管理、密码策略、SSL 加密与审计日志

发表于2026-03-28 14:10:4625次浏览1个评论

GBase 8a 安全加固实战:权限管理、密码策略、SSL 加密与审计日志

一、用户权限模型

1.1 用户管理基础

GBase 8a 的用户权限模型与 MySQL 相似,用户由用户名 + 来源 IP共同标识:

-- 创建用户(指定允许连接的 IP 段)
CREATE USER 'analyst'@'10.168.10.%' IDENTIFIED BY 'Str0ng#Pwd!2024';

-- 允许从任意 IP 连接(生产环境慎用)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'Str0ng#Pwd!2024';

-- 查看所有用户
SELECT user, host FROM gclusterdb.user;

1.2 权限分层授予

遵循最小权限原则:不同角色只授予必要的权限。

-- 只读账号(数据分析师)
GRANT SELECT ON sales_db.* TO 'analyst'@'10.168.10.%';

-- 读写账号(应用服务)
GRANT SELECT, INSERT, UPDATE, DELETE ON sales_db.* TO 'app_user'@'10.168.10.%';

-- 数据加载账号(只允许 LOAD DATA 和 SELECT)
GRANT SELECT, INSERT, FILE ON sales_db.* TO 'loader'@'10.168.10.%';

-- 库级管理员(可以创建和删除表,但不能管理用户)
GRANT ALL PRIVILEGES ON sales_db.* TO 'db_admin'@'10.168.10.%';

-- 刷新权限使其生效
FLUSH PRIVILEGES;

1.3 权限查看与回收

-- 查看某用户的权限
SHOW GRANTS FOR 'analyst'@'10.168.10.%';

-- 回收特定权限
REVOKE INSERT, UPDATE, DELETE ON sales_db.* FROM 'analyst'@'10.168.10.%';

-- 删除用户
DROP USER 'old_user'@'%';

1.4 常用系统权限速查

权限说明是否建议普通用户授予
SELECT查询数据
INSERT写入数据按需
UPDATE / DELETE修改/删除按需,严格控制
FILE使用 LOAD DATA / SELECT INTO OUTFILE仅加载账号
SUPER修改系统变量、KILL 连接等❌ 普通用户禁止
GRANT OPTION将自己的权限授予他人❌ 仅管理员
ALL PRIVILEGES全部权限❌ 仅 DBA 管理账号

二、密码安全策略

2.1 密码复杂度要求

gbase.cnf(gcluster 和 gnode 均需配置)中设置密码策略:

# 密码最小长度
password_min_length = 8

# 密码格式选项(按位叠加)
# 1 = 必须包含大写字母
# 2 = 必须包含小写字母
# 4 = 必须包含数字
# 8 = 必须包含特殊字符
# 15 = 以上全部要求
password_format_option = 15

# 密码不能包含连续相同字符的最大长度
password_max_contain_continuous_char = 3

# 密码不能与用户名相同(正向/反向)
password_not_same_reverse_username = 1

2.2 密码历史与有效期

# 密码有效期(天),0 = 永不过期
password_life_time = 90

# 密码修改时不能重复使用最近 N 次的密码
password_reuse_max = 5

# 密码修改时不能重复使用 N 天内用过的密码
password_reuse_time = 180

2.3 登录失败锁定

# 连续登录失败 N 次后锁定账号
login_attempt_max   = 5
login_attempt_times = 5     # 等同 login_attempt_max,部分版本参数名不同

# 锁定时间(秒),0 = 永久锁定(需管理员手动解锁)
login_locked_time   = 300   # 5 分钟后自动解锁

# 锁定因子:实际锁定时间 = login_locked_time × login_locked_factor ^ (失败次数-1)
# 即指数级增长,多次失败锁定时间越来越长
login_locked_factor = 2

手动解锁被锁定的用户:

-- 查看锁定状态
SELECT user, host, account_locked FROM gclusterdb.user;

-- 解锁用户
ALTER USER 'app_user'@'%' ACCOUNT UNLOCK;

-- 或重置密码同时解锁
ALTER USER 'app_user'@'%' IDENTIFIED BY 'New#Pwd!2024';

2.4 修改密码

-- 用户修改自己的密码
SET PASSWORD = PASSWORD('New#Pwd!2024');

-- 管理员修改他人密码
ALTER USER 'analyst'@'10.168.10.%' IDENTIFIED BY 'New#Pwd!2024';

-- 或使用 SET PASSWORD FOR(效果相同)
SET PASSWORD FOR 'analyst'@'10.168.10.%' = PASSWORD('New#Pwd!2024');

三、SSL 传输加密

3.1 为什么需要 SSL

GBase 8a 客户端(应用服务、gccli、JDBC)与 gcluster 之间的通信默认是明文传输。如果部署在生产网络中,密码和查询内容都可能被嗅探。

3.2 生成自签名证书

在 gcluster 主节点执行(生产环境建议使用企业 CA 签发的证书):

# 以 gbase 用户执行
cd /opt/gbase/gcluster/config/ssl

# 生成 CA 私钥和证书
openssl genrsa -out ca-key.pem 4096
openssl req -new -x509 -days 3650 -key ca-key.pem -out ca.pem \
    -subj "/CN=GBase-CA/O=MyCompany"

# 生成服务端私钥和证书请求
openssl genrsa -out server-key.pem 4096
openssl req -new -key server-key.pem -out server-req.pem \
    -subj "/CN=gcluster-server/O=MyCompany"

# 用 CA 签发服务端证书
openssl x509 -req -days 3650 \
    -in server-req.pem -CA ca.pem -CAkey ca-key.pem \
    -CAcreateserial -out server-cert.pem

3.3 配置 gcluster 开启 SSL

# gcluster 的 gbase.cnf
ssl-ca   = /opt/gbase/gcluster/config/ssl/ca.pem
ssl-cert = /opt/gbase/gcluster/config/ssl/server-cert.pem
ssl-key  = /opt/gbase/gcluster/config/ssl/server-key.pem

重启 gcluster 后验证 SSL 是否生效:

-- 登录后执行
SHOW VARIABLES LIKE 'have_ssl';
-- 返回 YES 表示 SSL 已启用

SHOW STATUS LIKE 'Ssl_cipher';
-- 返回非空值表示当前连接使用了 SSL

3.4 强制特定用户使用 SSL

-- 创建用户时要求必须使用 SSL
CREATE USER 'secure_user'@'%'
    IDENTIFIED BY 'Str0ng#Pwd!2024'
    REQUIRE SSL;

-- 或要求使用特定加密套件
CREATE USER 'strict_user'@'%'
    IDENTIFIED BY 'Str0ng#Pwd!2024'
    REQUIRE CIPHER 'AES256-SHA';

-- 对已有用户追加 SSL 要求
ALTER USER 'analyst'@'10.168.10.%' REQUIRE SSL;

非 SSL 连接尝试访问被标记 REQUIRE SSL 的账号时,会报:

ERROR 1045 (28000): Access denied for user 'analyst'@'...' (using password: YES)

3.5 JDBC 客户端配置 SSL

// JDBC URL 中追加 SSL 参数
String url = "jdbc:gbase://10.168.10.26:5258/sales_db"
           + "?useSSL=true"
           + "&requireSSL=true"
           + "&verifyServerCertificate=true"
           + "&trustCertificateKeyStoreUrl=file:/path/to/truststore.jks"
           + "&trustCertificateKeyStorePassword=changeit";

将服务端证书导入 Java truststore:

keytool -importcert -alias gbase-server \
    -file /path/to/server-cert.pem \
    -keystore truststore.jks \
    -storepass changeit -noprompt

四、审计日志配置

4.1 配置审计参数

# gcluster 和 gnode 的 gbase.cnf(均需配置)

# 开启审计日志
audit_log = ON

# 输出方式:FILE(写文件)或 TABLE(写系统表,可直接 SQL 查询)
log_output = FILE

# 慢查询阈值(秒):超过此值的 SQL 才会记录到慢查询日志
# 设为 0 记录所有 SQL(适合等保审计,但文件增长快)
long_query_time = 0

生产建议long_query_time = 0 会记录所有 SQL,文件增长极快。建议根据等保要求设置适当阈值(如 1 秒),同时配合操作系统层面的日志归档策略(logrotate)。

4.2 审计文件位置与格式

审计日志默认写入 gcluster 数据目录下的 slow_query.log

# 查看审计日志文件位置
SHOW VARIABLES LIKE 'slow_query_log_file';

# 实时查看审计内容
tail -f /opt/gbase/gcluster/data/slow_query.log

典型日志格式:

# Time: 2024-06-01T14:23:05.123456+08:00
# User@Host: analyst[analyst] @ 10.168.10.100 [10.168.10.100]
# Query_time: 2.345678  Lock_time: 0.000012  Rows_sent: 100  Rows_examined: 5000000
use sales_db;
SELECT dept_id, SUM(amount) FROM orders WHERE order_date >= '2024-01-01' GROUP BY dept_id;

4.3 log_output = TABLE 时的查询

-- 查看最近的操作记录
SELECT
    start_time,
    user_host,
    ROUND(query_time, 3)    AS query_sec,
    ROUND(lock_time, 6)     AS lock_sec,
    rows_sent,
    rows_examined,
    db,
    LEFT(sql_text, 300)     AS sql_snippet
FROM gclusterdb.slow_log
ORDER BY start_time DESC
LIMIT 50;

-- 找出执行了 DDL 操作的记录(DROP/ALTER/CREATE 等)
SELECT start_time, user_host, db, sql_text
FROM gclusterdb.slow_log
WHERE sql_text REGEXP '^(DROP|ALTER|CREATE|TRUNCATE)'
ORDER BY start_time DESC;

-- 统计各用户的操作量
SELECT
    SUBSTRING_INDEX(user_host, '[', 1) AS user_name,
    COUNT(*)                            AS sql_count,
    ROUND(AVG(query_time), 3)           AS avg_sec
FROM gclusterdb.slow_log
WHERE start_time >= CURDATE()
GROUP BY user_name
ORDER BY sql_count DESC;

五、网络访问控制

5.1 限制连接来源 IP

GBase 8a 的用户 host 字段本身就是 IP 访问控制:

-- 只允许特定子网访问
CREATE USER 'app_user'@'10.168.10.%' IDENTIFIED BY '...';

-- 只允许单个 IP 访问
CREATE USER 'dba'@'10.168.10.50' IDENTIFIED BY '...';

-- 禁止从 '%' 登录(删除通配符用户)
DROP USER 'root'@'%';

5.2 最大连接数控制

# gcluster 的 gbase.cnf
max_connections = 500          # 集群最大总连接数

# 单用户最大连接数(通过 CREATE USER 指定)
-- 创建用户时限制最大并发连接数
CREATE USER 'app_user'@'%'
    IDENTIFIED BY '...'
    WITH MAX_USER_CONNECTIONS 20;

六、安全配置检查清单

完成配置后,逐项核对以下清单:

用户权限

-- 检查是否存在空密码用户
SELECT user, host FROM gclusterdb.user WHERE password = '';

-- 检查是否存在 host='%' 的高权限用户
SELECT user, host FROM gclusterdb.user WHERE host = '%';

-- 检查 root 用户是否限制了来源 IP
SELECT user, host FROM gclusterdb.user WHERE user = 'root';

密码策略

-- 检查密码策略参数
SHOW VARIABLES LIKE 'password%';
SHOW VARIABLES LIKE 'login%';

SSL 状态

SHOW VARIABLES LIKE 'have_ssl';
SHOW VARIABLES LIKE 'ssl_%';

审计日志

SHOW VARIABLES LIKE 'audit_log';
SHOW VARIABLES LIKE 'log_output';
SHOW VARIABLES LIKE 'long_query_time';

七、常见安全配置误区

误区风险正确做法
root 账号用于应用连接root 权限过大,泄露影响整个集群为每个应用创建最小权限账号
所有账号 host='%'任意 IP 可尝试连接限定应用服务器 IP 段
不设密码有效期密码长期不更换,泄露风险积累设置 90~180 天有效期
audit_log 只在 gcluster 配置gnode 上的操作不被记录gcluster 和 gnode 均需配置
SSL 证书使用默认路径,权限过大证书文件被非授权用户读取chmod 600,仅 gbase 用户可读
忘记 FLUSH PRIVILEGES权限修改不生效每次 GRANT/REVOKE 后执行

评论

登录后才可以发表评论
流泪猫猫头发表于 9小时前
很详细实用的文章