Vastbase G100 安全加固实战手册
数据库安装完成只是第一步,安全加固才是生产环境上线的必修课。Vastbase G100 遵循 EAL4+ 标准做了大幅安全增强,但这些能力需要正确配置才能发挥作用。本文基于官方安全加固指南,整理出一份可直接执行的加固手册。
本文所有操作假设数据库已安装完成,安装用户为
vastbase,数据目录为${GAUSSDATA},安装目录为${GAUSSHOME}。
加固总览
| 加固层面 | 加固项数 | 风险等级分布 |
|---|---|---|
| 操作系统层 | 9 项 | 中×8、低×1 |
| 数据库文件权限 | 6 项 | 中×6 |
| 连接设置 | 14 项 | 中×9、低×5 |
| 安全认证 | 8 项 | 中×8 |
| 权限控制 | 7 项 | 中×7 |
| 安全审计 | 17 项 | 中×17 |
| 错误日志 | 14 项 | 中×14 |
| 数据加密 | 2 项 | 高×2 |
操作系统层加固
1. SSH 协议加固
SSH 是数据库服务器最常用的管理通道,必须收紧。
强制使用 SSH 协议版本 2:
# /etc/ssh/sshd_config
Protocol 2
限制监听 IP(不监听所有接口):
# /etc/ssh/sshd_config
ListenAddress 10.10.4.17
限制允许登录的用户组:
# /etc/ssh/sshd_config
AllowGroups vastbase dbadmin
禁止 root 直接登录:
# /etc/ssh/sshd_config
PermitRootLogin no
禁用密码认证,强制密钥登录:
# /etc/ssh/sshd_config
PasswordAuthentication no
SSH 互信 IP 限制:
在 ~/.ssh/authorized_keys 中添加 from 字段,限制来源 IP:
from="10.10.4.19,10.10.4.20" ssh-rsa AAAAB3NzaC1yc2EAAAABIw...
配置完成后重启 SSH 服务:
service sshd restart
2. 时间同步
# /etc/ntp.conf
server 10.10.4.1 iburst
systemctl enable ntpd
systemctl start ntpd
时间不同步会导致集群脑裂、审计日志时间错乱、Kerberos 认证失败。
3. 共享内存参数
# /etc/sysctl.conf
# shmmax = 物理内存 × 0.75(字节)
kernel.shmmax = 51539607552
# shmall = shmmax / 页大小(通常 4096)
kernel.shmall = 12582912
sysctl -p
4. 防止服务器欺骗
确保 socket 文件和 SSL 证书存在,防止恶意程序伪造数据库服务:
# 检查 socket 文件
find /tmp/${USER}_vastbase/.s.Pvsql.${PGPORT}
# 检查 SSL 证书
find ${GAUSSDATA}/server.key
find ${GAUSSDATA}/server.crt
# 如果不存在,生成自签名证书
openssl req -new -x509 -days 3650 -nodes \
-text -out ${GAUSSDATA}/server.crt \
-keyout ${GAUSSDATA}/server.key \
-subj "/CN=vastbase"
chmod 0600 ${GAUSSDATA}/server.key
数据库文件权限
5. 核心目录权限收紧
# 安装目录
chmod 0700 ${GAUSSHOME}
# 共享组件目录
chmod og-w ${GAUSSHOME}/share
# 二进制文件目录
chmod og-w ${GAUSSHOME}/bin
# 数据目录
chmod 0700 ${GAUSSDATA}
# 确保文件属主正确
chown -R vastbase:vastbase ${GAUSSHOME}
chown -R vastbase:vastbase ${GAUSSDATA}
6. 配置文件权限
# postgresql.conf - 主配置文件
chmod 0600 ${GAUSSDATA}/postgresql.conf
# pg_hba.conf - 客户端认证配置
chmod 0600 ${GAUSSDATA}/pg_hba.conf
7. 检查脚本
#!/bin/bash
# 文件权限检查脚本
echo "=== 安装目录权限 ==="
find ${GAUSSHOME} -prune \( ! -user vastbase -o ! -group vastbase -o -perm /g=rwx,o=rwx \)
echo "=== 数据目录权限 ==="
find ${GAUSSDATA} -prune \( ! -user vastbase -o ! -group vastbase -o -perm /g=rwx,o=rwx \)
echo "=== 配置文件权限 ==="
find ${GAUSSDATA}/postgresql.conf \( ! -user vastbase -o ! -group vastbase -o -perm /u=x,g=rwx,o=rwx \)
find ${GAUSSDATA}/pg_hba.conf \( ! -user vastbase -o ! -group vastbase -o -perm /u=x,g=rwx,o=rwx \)
echo "检查完成,无输出表示权限正常"
连接安全
8. 监听地址限制
# postgresql.conf
listen_addresses = '10.10.4.17'
不要设置为
*或0.0.0.0,这会让数据库监听所有网络接口。
9. 修改默认端口
# postgresql.conf
port = 15432
默认端口 8000 容易被扫描工具发现。改成非标准端口增加攻击成本。
10. 最大连接数控制
# postgresql.conf
max_connections = 200 # 生产环境建议值
sysadmin_reserved_connections = 3 # 管理员保留连接
在数据库层面也限制单个数据库的连接数:
UPDATE pg_database SET datconnlimit = 200 WHERE datname = 'prod_db';
-- 检查
SELECT datname, datconnlimit FROM pg_database WHERE datistemplate = false;
11. UNIX 域套接字权限
# postgresql.conf
unix_socket_permissions = 0770
默认 0777 允许所有人连接,改为 0770 仅允许同组用户。
12. pg_hba.conf 认证配置
这是数据库安全的核心配置文件。加固原则:
删除所有 trust 认证:
# ❌ 危险:允许无密码连接
# host all all 0.0.0.0/0 trust
# local all all trust
# ✅ 正确:使用 SHA256 认证
local all all peer
host all all 10.10.4.0/24 sha256
hostssl all all 10.10.4.0/24 sha256
加固规则:
- 删除所有
hostnossl条目(强制 SSL) - 不使用
all作为数据库名、用户名或源地址 - 不使用
md5认证(改用sha256) - 限制源 IP 范围
- 可选:配置时间段访问限制
# pg_hba.conf 加固示例
# TYPE DATABASE USER ADDRESS METHOD OPTIONS
# 本地连接
local all all peer
# 内网连接(强制 SSL + SHA256)
hostssl prod_db app_user 10.10.4.19/32 sha256
hostssl prod_db app_user 10.10.4.20/32 sha256
# 管理连接(限制时间段)
hostssl postgres dbadmin 10.10.4.0/24 sha256 [2026-01-01,2026-12-31]
13. 数据库模板保护
-- 禁止连接到模板数据库
UPDATE pg_database SET datallowconn = false
WHERE datistemplate = true;
-- 检查
SELECT datname, datistemplate, datallowconn FROM pg_database
WHERE datistemplate = true;
-- 验证无非标准模板存在
SELECT datname FROM pg_database
WHERE datistemplate = true AND datname NOT IN ('template0', 'template1');
安全认证设置
14. 客户端认证超时
# postgresql.conf
authentication_timeout = '1min'
避免恶意客户端长时间占用连接通道。
15. 认证加密迭代次数
# postgresql.conf
auth_iteration_count = 10000
增大迭代次数可以抵抗暴力破解,但会影响认证性能。10000 是安全与性能的平衡点。
16. 开启 SSL
# postgresql.conf
ssl = on
ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256'
ssl_prefer_server_ciphers = on
17. 密码策略
-- 设置密码复杂度要求
ALTER SYSTEM SET password_min_length = 12;
ALTER SYSTEM SET password_min_uppercase = 1;
ALTER SYSTEM SET password_min_lowercase = 1;
ALTER SYSTEM SET password_min_digital = 1;
ALTER SYSTEM SET password_min_special = 1;
ALTER SYSTEM SET password_max_length = 31;
-- 密码有效期(天)
ALTER SYSTEM SET password_effective_time = 90;
-- 密码重用限制
ALTER SYSTEM SET password_reuse_max = 5;
ALTER SYSTEM SET password_reuse_time = 365;
权限控制
18. PUBLIC 角色权限收紧
-- 撤销 PUBLIC 对系统表的权限
REVOKE ALL ON pg_catalog.pg_authid FROM PUBLIC;
-- 禁止 PUBLIC 角色 CREATE 权限
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
-- 检查
SELECT has_schema_privilege('public', 'public', 'CREATE');
-- 撤销所有对象权限
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;
19. 控制 WITH GRANT OPTION
-- 检查哪些用户有 WITH GRANT OPTION
SELECT grantor, grantee, table_schema, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE is_grantable = 'YES';
-- 收回 WITH GRANT OPTION(保留基础权限)
-- 需要逐个处理
GRANT SELECT ON schema.table TO user_role; -- 不带 WITH GRANT OPTION
20. SECURITY DEFINER 函数控制
-- 检查 SECURITY DEFINER 函数
SELECT n.nspname, p.proname, l.lanname, p.prosecdef
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
JOIN pg_language l ON p.prolanguage = l.oid
WHERE p.prosecdef = true;
-- 生产环境建议改用 SECURITY INVOKER
ALTER FUNCTION schema.func_name() SECURITY INVOKER;
21. 开启三权分立
Vastbase G100 支持三权分立(安全员、管理员、审计员分离):
# postgresql.conf
enable_separation_of_duty = on
三权分立后:
- 安全管理员:负责创建用户、角色和权限分配
- 系统管理员:负责数据库日常运维(建表、索引等)
- 审计管理员:负责审计策略配置和审计日志查看
三权分立是等保三级和 EAL4+ 的硬性要求。
安全审计
22. 开启数据库审计
# postgresql.conf
audit_enabled = on
# 审计日志目录
audit_directory = '${GAUSSDATA}/audit'
# 审计日志保留天数
audit_file_remain_time = 90
# 单个审计文件最大大小(MB)
audit_file_max_size = 10
# 审计文件最大数量
audit_file_remain_count = 1048576
# 审计日志总磁盘空间上限(MB)
audit_space_limit = 10240
23. 审计策略配置
-- 登录注销审计
ALTER SYSTEM SET audit_login_logout = 7;
-- 数据库启停审计
ALTER SYSTEM SET audit_database_process = 1;
-- 权限操作审计
ALTER SYSTEM SET audit_grant_revoke = 1;
-- 对象操作审计(DDL)
AUDIT CREATE TABLE, DROP TABLE, ALTER TABLE BY vastbase;
-- 数据操作审计(DML)
AUDIT INSERT, UPDATE, DELETE ON schema.business_table BY vastbase;
-- 查询审计(敏感表)
AUDIT SELECT ON schema.sensitive_table BY vastbase;
24. 统一审计
Vastbase G100 支持统一审计(Unified Audit),优先级高于普通审计:
-- 创建统一审计策略
CREATE AUDIT POLICY audit_sensitive_data
PRIVILEGES SELECT, INSERT, UPDATE, DELETE
ON schema.sensitive_table
FILTER BY vastbase;
-- 启用策略
ALTER AUDIT POLICY audit_sensitive_data ENABLE;
-- 指定审计响应动作
ALTER AUDIT POLICY audit_sensitive_data
ADD ACTION BLOCK; -- 审计同时阻止操作
25. 审计日志检查
-- 查看审计日志
SELECT * FROM pg_audit_detail
WHERE audit_time > current_date
ORDER BY audit_time DESC;
-- 统计今日登录情况
SELECT username, action, result, count(*)
FROM pg_audit_detail
WHERE audit_time > current_date
AND action IN ('login', 'logout')
GROUP BY username, action, result;
-- 检查失败的登录尝试
SELECT username, client_addr, audit_time
FROM pg_audit_detail
WHERE action = 'login' AND result = 'failure'
AND audit_time > current_date - interval '7 days'
ORDER BY audit_time DESC;
错误日志
26. 日志收集器
# postgresql.conf
logging_collector = on
log_directory = 'pg_log'
log_filename = 'vastbase-%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
# 日志轮转
log_truncate_on_rotation = off
log_rotation_age = '1d'
log_rotation_size = '100MB'
27. 日志内容配置
# postgresql.conf
# 记录内容
log_connections = on # 记录连接
log_disconnections = on # 记录断开
log_statement = 'ddl' # 记录 DDL 语句
log_duration = off # 不记录每条语句执行时间(性能影响大)
log_min_duration_statement = 1000 # 记录执行超过 1 秒的慢 SQL
# 日志格式
log_line_prefix = '%m [%p] %u@%d %h '
log_hostname = off # 不解析主机名(性能考虑)
# 日志级别
log_min_messages = 'warning'
log_min_error_statement = 'error'
可靠性和归档
28. WAL 日志
# postgresql.conf
wal_level = hot_standby
wal_log_hints = on
# 归档
archive_mode = on
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
archive_timeout = '300s'
29. 数据存储加密
Vastbase G100 支持通过 KMS(密钥管理服务)实现透明数据加密:
# postgresql.conf
# KMS 加密配置
enable_kms = on
kms_server_address = '10.10.4.100:5697'
kms_server_region = 'cn-north-1'
加密范围:
- 表空间加密:整个表空间的数据文件加密
- 列级加密:特定敏感列加密
- 备份加密:备份文件加密
KMS 加密是等保三级的要求,生产环境必须开启。
加固检查清单
以下是完整的加固检查清单,可用于上线前安全审查:
□ 01. SSH 协议版本设置为 2
□ 02. SSH 限制监听 IP
□ 03. SSH 限制允许登录组
□ 04. SSH 禁止 root 登录
□ 05. SSH 禁用密码认证
□ 06. SSH 互信 IP 限制
□ 07. NTP 时间同步已配置
□ 08. kernel.shmmax 已设置
□ 09. kernel.shmall 已设置
□ 10. SSL 证书文件存在
□ 11. socket 文件存在
□ 12. ${GAUSSHOME} 目录权限 0700
□ 13. ${GAUSSDATA} 目录权限 0700
□ 14. postgresql.conf 权限 0600
□ 15. pg_hba.conf 权限 0600
□ 16. 无非标准数据库模板
□ 17. 模板数据库禁止连接
□ 18. 无未文档化的扩展
□ 19. 监听地址非 * 或 0.0.0.0
□ 20. 端口非默认 8000
□ 21. max_connections 已限制
□ 22. sysadmin_reserved_connections >= 3
□ 23. unix_socket_permissions 为 0770
□ 24. pg_hba.conf 无 trust 认证
□ 25. pg_hba.conf 无 hostnossl
□ 26. pg_hba.conf 无 all 数据库
□ 27. pg_hba.conf 无 all 用户
□ 28. pg_hba.conf 源地址非 0.0.0.0/0
□ 29. pg_hba.conf 无 md5 认证
□ 30. allow_system_table_mods = off
□ 31. authentication_timeout <= 1min
□ 32. auth_iteration_count >= 10000
□ 33. ssl = on
□ 34. 密码复杂度策略已配置
□ 35. 密码有效期已配置
□ 36. PUBLIC 角色无系统表权限
□ 37. PUBLIC 角色无 CREATE 权限
□ 38. 无 WITH GRANT OPTION 泛滥
□ 39. SECURITY DEFINER 函数已审查
□ 40. 三权分立已开启
□ 41. 数据库审计已开启
□ 42. 登录注销审计已开启
□ 43. DDL 操作审计已开启
□ 44. DML 操作审计已开启
□ 45. 统一审计策略已配置
□ 46. 审计日志保留 >= 90 天
□ 47. 日志收集器已开启
□ 48. 慢 SQL 日志已配置
□ 49. 连接/断开日志已开启
□ 50. 归档模式已开启
□ 51. KMS 加密已开启(等保三级要求)
总结
Vastbase G100 的安全加固覆盖了从操作系统到数据库内核的完整链路。核心原则:
- 最小权限:文件权限 0600/0700,连接限制 IP,认证限制用户
- 深度防御:SSH 加固 + pg_hba.conf + SSL + 密码策略 + 审计,多层防护
- 可追溯:全面审计 + 日志收集 + 慢 SQL 追踪
- 三权分立:安全员、管理员、审计员职责分离
建议在数据库安装完成后立即执行全部加固,不要等到上线前才补。加固后使用上面的检查清单逐项验证,确保没有遗漏。对于等保三级及以上要求的场景,KMS 加密和三权分立是必须项,不可跳过。

