数据库运维16 min read

Vastbase G100 安全加固实战手册

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 的安全加固覆盖了从操作系统到数据库内核的完整链路。核心原则:

  1. 最小权限:文件权限 0600/0700,连接限制 IP,认证限制用户
  2. 深度防御:SSH 加固 + pg_hba.conf + SSL + 密码策略 + 审计,多层防护
  3. 可追溯:全面审计 + 日志收集 + 慢 SQL 追踪
  4. 三权分立:安全员、管理员、审计员职责分离

建议在数据库安装完成后立即执行全部加固,不要等到上线前才补。加固后使用上面的检查清单逐项验证,确保没有遗漏。对于等保三级及以上要求的场景,KMS 加密和三权分立是必须项,不可跳过。

分享:

相关文章

评论区