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 后执行 |
热门帖子
- 12025-12-01浏览数:182324
- 22023-05-09浏览数:24580
- 42023-09-25浏览数:17874
- 52020-05-11浏览数:16890