Skip to content

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签发证书,需要:

  1. 生成私钥和CSR
  2. 将CSR提交给CA
  3. 获得CA签发的证书和中间证书
  4. 配置证书链
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.crt

KingBaseES 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/data

2. 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:54321

3. 验证证书有效性

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 -noout

SSL/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.crt

2. 如何强制所有连接使用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/data

6. 如何查看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配置的安全性和有效性。同时,结合防火墙、访问控制等其他安全措施,可以构建更全面的数据库安全体系。