外观
KingBaseES SSL/TLS配置
SSL/TLS概述
SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是用于在网络通信中提供加密和身份验证的安全协议。在KingBaseES数据库中启用SSL/TLS可以确保客户端与服务器之间的通信数据被加密,防止数据窃听、篡改和中间人攻击,提高数据库连接的安全性。
证书准备
1. 生成自签名证书
bash
# 创建证书存储目录
mkdir -p /opt/kingbase/ssl
cd /opt/kingbase/ssl
# 生成私钥
openssl genrsa -out server.key 2048
# 生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=KingBase/OU=Database/CN=kingbase.example.com"
# 生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# 生成根证书(可选)
openssl genrsa -out root.key 2048
openssl req -new -x509 -days 3650 -key root.key -out root.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=KingBase/OU=CA/CN=KingBase Root CA"
# 使用根证书签名服务器证书
openssl x509 -req -days 365 -in server.csr -CA root.crt -CAkey root.key -CAcreateserial -out server.crt
# 设置证书权限
chmod 600 server.key
chown kingbase:kingbase server.* root.*2. 使用CA签发证书
如果使用第三方CA或企业内部CA签发证书,需要:
- 生成私钥和CSR
- 将CSR提交给CA
- 获得CA签发的证书和中间证书
- 配置证书链
bash
# 生成私钥和CSR
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=KingBase/OU=Database/CN=kingbase.example.com"
# 获得CA证书后,配置证书链
cat server.crt intermediate.crt root.crt > server.chain.crtKingBaseES SSL/TLS配置
1. 配置文件修改
sql
-- 查看当前SSL配置
SHOW ssl;
SHOW ssl_cert_file;
SHOW ssl_key_file;
SHOW ssl_ca_file;
SHOW ssl_crl_file;
-- 修改SSL配置
ALTER SYSTEM SET ssl = on;
ALTER SYSTEM SET ssl_cert_file = '/opt/kingbase/ssl/server.crt';
ALTER SYSTEM SET ssl_key_file = '/opt/kingbase/ssl/server.key';
ALTER SYSTEM SET ssl_ca_file = '/opt/kingbase/ssl/root.crt';
ALTER SYSTEM SET ssl_crl_file = '/opt/kingbase/ssl/root.crl';
ALTER SYSTEM SET ssl_prefer_server_ciphers = on;
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2';
-- 重启数据库使SSL配置生效
-- sys_ctl restart -D /path/to/data2. pg_hba.conf配置
sql
-- 修改pg_hba.conf,强制使用SSL连接
# TYPE DATABASE USER ADDRESS METHOD
# 允许所有用户使用SSL连接
hostssl all all 0.0.0.0/0 scram-sha-256
-- 重新加载pg_hba.conf配置
SELECT sys_reload_hba_conf();客户端SSL配置
1. psql客户端配置
bash
# 使用SSL连接数据库
psql "host=kingbase.example.com port=54321 dbname=test_db user=test_user sslmode=verify-ca sslrootcert=/opt/kingbase/ssl/root.crt"
# SSL模式说明:
# disable - 不使用SSL
# allow - 优先使用SSL,如果不可用则使用非SSL
# prefer - 优先使用SSL,如果不可用则使用非SSL(默认)
# require - 必须使用SSL,但不验证证书
# verify-ca - 必须使用SSL,并验证CA证书
# verify-full - 必须使用SSL,并验证CA证书和服务器主机名2. JDBC客户端配置
java
// JDBC连接URL配置SSL
String url = "jdbc:kingbase8://kingbase.example.com:54321/test_db?ssl=true&sslmode=verify-full&sslrootcert=/opt/kingbase/ssl/root.crt";
Connection conn = DriverManager.getConnection(url, "test_user", "password");3. ODBC客户端配置
在ODBC数据源配置中,设置以下参数:
- SSL Mode: require
- SSL Root Certificate: /opt/kingbase/ssl/root.crt
- SSL Certificate: /opt/kingbase/ssl/client.crt
- SSL Key: /opt/kingbase/ssl/client.key
SSL/TLS验证和测试
1. 验证SSL配置
sql
-- 查看SSL配置状态
SELECT name, setting FROM sys_settings WHERE name LIKE 'ssl%';
-- 查看当前连接是否使用SSL
SELECT ssl, version FROM sys_stat_ssl WHERE pid = pg_backend_pid();
-- 查看所有SSL连接
SELECT pid, usename, datname, ssl, version, cipher FROM sys_stat_ssl;2. 测试SSL连接
bash
# 使用openssl测试SSL连接
openssl s_client -connect kingbase.example.com:54321 -CAfile /opt/kingbase/ssl/root.crt
# 使用nmap测试SSL支持
nmap --script ssl-cert,ssl-enum-ciphers -p 54321 kingbase.example.com
# 使用testssl.sh测试SSL配置
./testssl.sh kingbase.example.com:543213. 验证证书有效性
bash
# 检查证书有效期
openssl x509 -in /opt/kingbase/ssl/server.crt -text -noout | grep -A 3 "Validity"
# 检查证书链
openssl verify -CAfile /opt/kingbase/ssl/root.crt /opt/kingbase/ssl/server.crt
# 检查证书主题和颁发者
openssl x509 -in /opt/kingbase/ssl/server.crt -subject -issuer -nooutSSL/TLS性能优化
1. 选择合适的加密算法
sql
-- 查看支持的加密算法
SHOW ssl_ciphers;
-- 配置高效的加密算法
ALTER SYSTEM SET ssl_ciphers = 'HIGH:!aNULL:!MD5:!3DES';
-- 配置SSL协议版本
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2';
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3';2. 启用SSL会话缓存
sql
-- 启用SSL会话缓存
ALTER SYSTEM SET ssl_session_cache = 'shared:SSL:10m';
ALTER SYSTEM SET ssl_session_timeout = 300;3. 使用硬件加速
如果服务器支持硬件加速,可以启用OpenSSL的硬件加速功能:
bash
# 检查OpenSSL是否支持硬件加速
openssl engine -t
# 启用硬件加速(在openssl.cnf中配置)
[openssl_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
Options = UnsafeLegacyRenegotiation
CipherString = HIGH:!aNULL:!MD5:!3DES
MinProtocol = TLSv1.2
MaxProtocol = TLSv1.3
Engine = rdrand版本差异
KingBaseES V8 R6
- 支持SSL/TLSv1.0、TLSv1.1、TLSv1.2
- 支持基本的SSL配置
- 支持自签名证书和CA证书
- 支持SSL会话缓存
KingBaseES V8 R7
- 增强了SSL/TLS支持,支持TLSv1.3
- 提供了更丰富的SSL配置参数
- 支持更细粒度的SSL控制
- 增强了SSL性能
- 支持客户端证书验证
- 提供了更详细的SSL监控视图
sql
-- V8 R7新增:SSL版本配置
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2';
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3';
-- V8 R7新增:客户端证书验证
ALTER SYSTEM SET ssl_verify_client = 'verify-ca';
-- V8 R7新增:SSL性能监控
SELECT * FROM sys_stat_ssl;
SELECT * FROM sys_ssl_status;常见问题(FAQ)
1. 如何排查SSL连接失败问题?
bash
# 查看数据库日志
tail -f /path/to/logs/kingbase.log | grep -i ssl
# 检查证书权限
ls -l /opt/kingbase/ssl/
# 检查证书有效性
openssl x509 -in /opt/kingbase/ssl/server.crt -checkend 86400
# 测试SSL连接
openssl s_client -connect kingbase.example.com:54321 -CAfile /opt/kingbase/ssl/root.crt2. 如何强制所有连接使用SSL?
sql
-- 修改pg_hba.conf,只允许ssl连接
hostssl all all 0.0.0.0/0 scram-sha-256
-- 重启数据库使配置生效3. 如何配置双向SSL认证?
sql
-- 服务器端配置
ALTER SYSTEM SET ssl = on;
ALTER SYSTEM SET ssl_cert_file = '/opt/kingbase/ssl/server.crt';
ALTER SYSTEM SET ssl_key_file = '/opt/kingbase/ssl/server.key';
ALTER SYSTEM SET ssl_ca_file = '/opt/kingbase/ssl/root.crt';
ALTER SYSTEM SET ssl_verify_client = 'verify-ca';
-- 客户端需要提供客户端证书
psql "host=kingbase.example.com port=54321 dbname=test_db user=test_user sslmode=verify-ca sslrootcert=/opt/kingbase/ssl/root.crt sslcert=/opt/kingbase/ssl/client.crt sslkey=/opt/kingbase/ssl/client.key"4. SSL连接性能如何优化?
sql
-- 选择高效的加密算法
ALTER SYSTEM SET ssl_ciphers = 'HIGH:!aNULL:!MD5:!3DES';
-- 启用SSL会话缓存
ALTER SYSTEM SET ssl_session_cache = 'shared:SSL:10m';
ALTER SYSTEM SET ssl_session_timeout = 300;
-- 使用TLSv1.3
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2';
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3';5. 如何更新过期的SSL证书?
bash
# 生成新的证书
openssl genrsa -out new_server.key 2048
openssl req -new -key new_server.key -out new_server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=KingBase/OU=Database/CN=kingbase.example.com"
openssl x509 -req -days 365 -in new_server.csr -CA root.crt -CAkey root.key -CAcreateserial -out new_server.crt
# 替换旧证书
cp new_server.key /opt/kingbase/ssl/server.key
cp new_server.crt /opt/kingbase/ssl/server.crt
chmod 600 /opt/kingbase/ssl/server.key
chown kingbase:kingbase /opt/kingbase/ssl/server.*
# 重启数据库
# sys_ctl restart -D /path/to/data6. 如何查看SSL连接的加密算法?
sql
-- 查看当前连接的加密算法
SELECT ssl, version, cipher FROM sys_stat_ssl WHERE pid = pg_backend_pid();
-- 查看所有SSL连接的加密算法
SELECT pid, usename, datname, ssl, version, cipher FROM sys_stat_ssl;SSL/TLS最佳实践
1. 证书管理
- 使用2048位或以上的RSA密钥
- 定期更新证书,有效期不超过1年
- 安全存储私钥,权限设置为600
- 使用证书链验证
- 建立证书吊销机制
2. 配置最佳实践
- 使用TLSv1.2或TLSv1.3
- 禁用不安全的加密算法(如SSLv3、TLSv1.0)
- 配置合适的加密套件
- 启用SSL会话缓存
- 强制所有连接使用SSL
- 考虑使用双向SSL认证
3. 监控和审计
- 监控SSL连接状态
- 定期检查证书有效期
- 审计SSL连接日志
- 定期进行SSL安全扫描
- 保持SSL配置符合安全标准
4. 性能优化
- 选择高效的加密算法
- 启用SSL硬件加速
- 优化SSL会话缓存
- 合理配置SSL协议版本
SSL/TLS安全审计脚本
1. SSL配置审计
sql
-- SSL配置审计报告
SELECT
now() AS audit_time,
(SELECT setting FROM sys_settings WHERE name = 'ssl') AS ssl_enabled,
(SELECT setting FROM sys_settings WHERE name = 'ssl_cert_file') AS ssl_cert_file,
(SELECT setting FROM sys_settings WHERE name = 'ssl_key_file') AS ssl_key_file,
(SELECT setting FROM sys_settings WHERE name = 'ssl_ca_file') AS ssl_ca_file,
(SELECT setting FROM sys_settings WHERE name = 'ssl_min_protocol_version') AS ssl_min_protocol,
(SELECT setting FROM sys_settings WHERE name = 'ssl_max_protocol_version') AS ssl_max_protocol,
(SELECT setting FROM sys_settings WHERE name = 'ssl_ciphers') AS ssl_ciphers,
(SELECT setting FROM sys_settings WHERE name = 'ssl_session_cache') AS ssl_session_cache
FROM
sys_stat_activity
LIMIT 1;2. SSL连接审计
sql
-- SSL连接审计
SELECT
pid,
usename,
datname,
client_addr,
ssl,
version,
cipher,
backend_start,
now() - backend_start AS connection_duration
FROM
sys_stat_ssl
JOIN
sys_stat_activity ON sys_stat_ssl.pid = sys_stat_activity.pid
WHERE
ssl = true
ORDER BY
connection_duration DESC;3. 证书有效期审计
bash
#!/bin/bash
# KingBaseES SSL证书有效期审计脚本
echo "=== KingBaseES SSL Certificate Audit Report ==="
echo "Audit Time: $(date)"
echo "Hostname: $(hostname)"
echo ""
# 检查证书文件
CERT_FILE="/opt/kingbase/ssl/server.crt"
KEY_FILE="/opt/kingbase/ssl/server.key"
CA_FILE="/opt/kingbase/ssl/root.crt"
echo "1. Certificate Files:"
echo " Server Certificate: $CERT_FILE"
echo " Server Key: $KEY_FILE"
echo " CA Certificate: $CA_FILE"
echo ""
# 检查证书有效期
echo "2. Certificate Validity:"
if [ -f "$CERT_FILE" ]; then
EXPIRY_DATE=$(openssl x509 -in "$CERT_FILE" -enddate -noout | cut -d= -f2)
EXPIRY_SECS=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_SECS=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_SECS - $CURRENT_SECS) / 86400 ))
echo " Server Certificate Expiry: $EXPIRY_DATE ($DAYS_LEFT days left)"
if [ $DAYS_LEFT -lt 30 ]; then
echo " WARNING: Server certificate will expire in less than 30 days!"
fi
fi
echo ""
# 检查证书权限
echo "3. Certificate Permissions:"
if [ -f "$CERT_FILE" ]; then
echo " Server Certificate: $(ls -l "$CERT_FILE")"
fi
if [ -f "$KEY_FILE" ]; then
KEY_PERMS=$(stat -c "%a" "$KEY_FILE")
echo " Server Key: $(ls -l "$KEY_FILE")"
if [ "$KEY_PERMS" -ne 600 ]; then
echo " WARNING: Server key permissions are not 600!"
fi
fi
echo ""
echo "=== Audit Complete ==="总结
SSL/TLS配置是KingBaseES数据库安全的重要组成部分,通过合理配置SSL/TLS,可以确保客户端与服务器之间的通信安全,防止数据泄露和篡改。在实际生产环境中,DBA应根据业务需求和安全策略,选择合适的SSL/TLS配置方案,并定期进行监控和审计,确保SSL/TLS配置的安全性和有效性。同时,结合防火墙、访问控制等其他安全措施,可以构建更全面的数据库安全体系。
