一、KingbaseES默认安全设置的问题现状
作为国产数据库的佼佼者,KingbaseES在政务和企业级应用中越来越常见。但很多DBA在初次使用时都会发现一个尴尬的问题:默认安装后的数据库安全配置简直就像没上锁的保险箱。比如默认的sa账户密码居然是简单的"123456",这要是放在生产环境,黑客简直要笑醒。
我见过最夸张的一个案例是某单位刚部署完KingbaseES,第二天就发现数据库被勒索病毒加密了。调查后发现就是用了默认密码,而且远程访问权限完全开放。这种低级错误其实完全可以通过简单的配置避免。
二、必须立即修改的关键安全设置
1. 账户密码策略强化
首先咱们得把那些弱密码都换掉。KingbaseES提供了密码复杂度策略设置,但默认是不启用的。来看具体操作:
-- 启用密码复杂度策略
ALTER SYSTEM SET password_check.enable = on;
-- 设置密码最小长度
ALTER SYSTEM SET password_check.minimum_length = 12;
-- 必须包含数字、大小写字母和特殊字符
ALTER SYSTEM SET password_check.mixed_case = on;
ALTER SYSTEM SET password_check.special_chars = on;
-- 密码有效期90天
ALTER SYSTEM SET password_check.maximum_age = 90;
-- 执行重载使配置生效
SELECT sys_reload_conf();
2. 网络访问控制
默认情况下KingbaseES监听所有IP,这太危险了。我们应该限制只允许特定IP访问:
-- 修改pg_hba.conf文件配置示例
# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.1.0/24 md5
host all all 127.0.0.1/32 trust
-- 然后重启服务使配置生效
3. 审计日志配置
审计是事后追责的重要依据,但默认配置往往不够详细:
-- 启用详细审计
ALTER SYSTEM SET audit_enabled = on;
-- 记录所有DDL操作
ALTER SYSTEM SET audit_ddl = on;
-- 记录所有DML操作
ALTER SYSTEM SET audit_dml = on;
-- 记录登录尝试
ALTER SYSTEM SET audit_login = on;
-- 设置日志保留周期
ALTER SYSTEM SET audit_log_retention_days = 180;
-- 重载配置
SELECT sys_reload_conf();
三、高级安全加固方案
1. 数据加密保护
对于敏感数据,仅靠访问控制还不够,应该实施透明数据加密:
-- 创建加密表空间
CREATE TABLESPACE secure_space
LOCATION '/data/kingbase/secure_space'
WITH (encryption = on, encryption_key = 'MyStrongKey123!');
-- 在加密表空间创建表
CREATE TABLE sensitive_data (
id SERIAL PRIMARY KEY,
credit_card TEXT,
personal_id TEXT
) TABLESPACE secure_space;
2. 行级安全策略
对于多租户系统,行级安全策略(Row Level Security)非常有用:
-- 启用行级安全
ALTER TABLE customer_data ENABLE ROW LEVEL SECURITY;
-- 创建策略:用户只能看到自己的数据
CREATE POLICY user_data_policy ON customer_data
USING (owner = current_user);
-- 测试效果
SET ROLE alice;
SELECT * FROM customer_data; -- 只能看到alice的数据
3. 定期安全巡检脚本
这里给出一个实用的Shell脚本,用于定期检查安全配置:
#!/bin/bash
# KingbaseES安全巡检脚本
# 功能:检查关键安全配置项
DB_USER="system"
DB_PASS="YourSecurePassword"
DB_HOST="localhost"
DB_PORT="54321"
check_items=(
"SELECT name,setting FROM sys_settings WHERE name LIKE '%password%' AND context = 'sighup';"
"SELECT name,setting FROM sys_settings WHERE name LIKE '%audit%' AND setting != 'on';"
"SELECT datname,usename,client_addr FROM sys_stat_activity WHERE usename NOT IN ('system');"
)
for query in "${check_items[@]}"; do
echo "检查项:${query}"
ksql -U $DB_USER -W $DB_PASS -h $DB_HOST -p $DB_PORT -c "${query}"
echo "----------------------------------------"
done
四、常见问题解决方案
1. 忘记system密码怎么办
如果连system密码都丢了,可以这样重置:
- 停止KingbaseES服务
- 编辑kingbase.conf文件,添加
-S参数允许单用户模式 - 启动服务并连接:
kingbase -D /path/to/data -S - 执行密码修改:
ALTER USER system WITH PASSWORD 'NewComplexPassword123!';
2. 审计日志占用空间过大
审计日志可能会快速增长,建议这样管理:
-- 设置日志轮转
ALTER SYSTEM SET audit_log_rotation_size = '100MB';
ALTER SYSTEM SET audit_log_rotation_age = '1d';
-- 启用日志压缩
ALTER SYSTEM SET audit_log_compress = on;
-- 定期清理旧日志
ALTER SYSTEM SET audit_log_retention_size = '10GB';
3. 连接数被耗尽攻击
防止恶意连接耗尽资源:
-- 设置最大连接数
ALTER SYSTEM SET max_connections = 200;
-- 设置空闲连接超时
ALTER SYSTEM SET idle_in_transaction_session_timeout = '10min';
-- 限制单个IP连接数
ALTER SYSTEM SET sysconnlimit.max_connections_per_ip = 20;
五、最佳实践总结
经过多年的KingbaseES运维经验,我总结出以下黄金法则:
- 安装后第一件事就是修改所有默认密码
- 网络访问控制要遵循最小权限原则
- 审计配置要足够详细但也要考虑存储成本
- 敏感数据必须加密,不管是传输中还是存储中
- 定期进行安全评估和漏洞扫描
- 备份方案要和安全方案同等重视
- 保持版本更新,及时修补安全漏洞
记住,数据库安全不是一次性的工作,而是一个持续的过程。每次系统变更、每次架构调整,都需要重新评估安全配置是否仍然适用。希望本文能帮助大家构建更安全的KingbaseES环境。
评论