Skip to content

KingBaseES 连接加密

连接加密概述

连接加密是保护KingBaseES数据库通信安全的重要手段,它通过对客户端与服务器之间的网络通信进行加密,防止数据在传输过程中被窃听、篡改或伪造。连接加密主要基于SSL/TLS协议实现,可以确保数据库连接的机密性、完整性和身份验证。

连接加密机制

1. SSL/TLS加密层次

KingBaseES连接加密基于SSL/TLS协议栈,提供了多层加密保护:

  • 握手层:负责身份验证和密钥协商
  • 记录层:负责数据加密、完整性校验和压缩
  • 应用层:负责数据库协议通信

2. 加密算法

KingBaseES支持多种加密算法,包括:

  • 对称加密算法:AES-128, AES-256, 3DES等
  • 非对称加密算法:RSA, ECDSA等
  • 哈希算法:SHA-256, SHA-384, SHA-512等
  • 密钥交换算法:RSA, Diffie-Hellman, ECDHE等

3. 加密模式

sql
-- 查看支持的加密算法
SHOW ssl_ciphers;

-- 配置加密算法优先级
ALTER SYSTEM SET ssl_ciphers = 'HIGH:!aNULL:!MD5:!3DES';

连接加密配置

1. 服务器端配置

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';

-- 配置SSL协议版本
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2';
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3';

-- 配置加密套件
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;

-- 重启数据库使配置生效
-- sys_ctl restart -D /path/to/data

2. 客户端配置

psql客户端

bash
# 基本SSL连接
psql "host=kingbase.example.com port=54321 dbname=test_db user=test_user sslmode=require"

# 验证CA证书的SSL连接
psql "host=kingbase.example.com port=54321 dbname=test_db user=test_user sslmode=verify-ca sslrootcert=/opt/kingbase/ssl/root.crt"

# 完全验证的SSL连接
psql "host=kingbase.example.com port=54321 dbname=test_db user=test_user sslmode=verify-full sslrootcert=/opt/kingbase/ssl/root.crt"

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");

// 或使用SSL属性配置
Properties props = new Properties();
props.setProperty("user", "test_user");
props.setProperty("password", "password");
props.setProperty("ssl", "true");
props.setProperty("sslmode", "verify-full");
props.setProperty("sslrootcert", "/opt/kingbase/ssl/root.crt");
Connection conn = DriverManager.getConnection("jdbc:kingbase8://kingbase.example.com:54321/test_db", props);

ODBC客户端

在ODBC数据源配置中,设置以下SSL属性:

  • 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

3. 强制加密连接

sql
-- 修改pg_hba.conf,只允许SSL连接
hostssl    all             all             0.0.0.0/0                scram-sha-256

-- 重新加载pg_hba.conf
SELECT sys_reload_hba_conf();

连接加密验证和测试

1. 验证加密配置

sql
-- 查看服务器SSL配置
SELECT name, setting FROM sys_settings WHERE name LIKE 'ssl%';

-- 查看当前连接是否加密
SELECT ssl, version, cipher FROM sys_stat_ssl WHERE pid = pg_backend_pid();

-- 查看所有加密连接
SELECT pid, usename, datname, ssl, version, cipher FROM sys_stat_ssl;

2. 测试加密连接

bash
# 使用openssl测试SSL连接
openssl s_client -connect kingbase.example.com:54321 -CAfile /opt/kingbase/ssl/root.crt

# 使用psql测试加密连接
psql "host=kingbase.example.com port=54321 dbname=test_db user=test_user sslmode=verify-full sslrootcert=/opt/kingbase/ssl/root.crt" -c "SELECT ssl, version, cipher FROM sys_stat_ssl WHERE pid = pg_backend_pid();"

# 使用tcpdump捕获加密流量
tcpdump -i eth0 host kingbase.example.com and port 54321 -w ssl_traffic.pcap

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

连接加密性能优化

1. 选择高效的加密算法

sql
-- 配置高效的加密算法
ALTER SYSTEM SET ssl_ciphers = 'HIGH:!aNULL:!MD5:!3DES:!RC4';

-- 优先使用TLSv1.3
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]
CipherString = HIGH:!aNULL:!MD5:!3DES
MinProtocol = TLSv1.2
MaxProtocol = TLSv1.3
Engine = rdrand

4. 连接池优化

使用连接池可以减少SSL握手开销,提高加密连接性能:

  • 配置适当的连接池大小
  • 启用连接复用
  • 调整连接超时参数

版本差异

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_ssl_status;

常见问题(FAQ)

1. 如何排查加密连接失败问题?

bash
# 查看数据库日志
tail -f /path/to/logs/kingbase.log | grep -i ssl

# 检查证书权限
ls -l /opt/kingbase/ssl/

# 测试SSL连接
openssl s_client -connect kingbase.example.com:54321 -CAfile /opt/kingbase/ssl/root.crt

# 检查防火墙设置
firewall-cmd --list-ports | grep 54321

2. 如何强制所有连接使用加密?

sql
-- 修改pg_hba.conf,只允许ssl连接
hostssl    all             all             0.0.0.0/0                scram-sha-256

-- 重启数据库使配置生效

3. 加密连接会影响性能吗?

加密连接会带来一定的性能开销,主要体现在:

  • SSL握手过程的CPU开销
  • 数据加密解密的CPU开销
  • 网络带宽增加(加密后数据体积增大)

可以通过以下方式优化性能:

  • 选择高效的加密算法
  • 启用SSL会话缓存
  • 使用硬件加速
  • 配置适当的连接池

4. 如何更新过期的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

5. 如何配置双向加密认证?

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"

6. 如何监控加密连接状态?

sql
-- 查看加密连接统计
SELECT 
    count(*) AS total_connections,
    sum(CASE WHEN ssl THEN 1 ELSE 0 END) AS ssl_connections,
    sum(CASE WHEN NOT ssl THEN 1 ELSE 0 END) AS non_ssl_connections
FROM sys_stat_ssl;

-- 查看加密算法分布
SELECT cipher, count(*) AS connection_count
FROM sys_stat_ssl
WHERE ssl = true
GROUP BY cipher
ORDER BY connection_count DESC;

连接加密最佳实践

1. 证书管理

  • 使用2048位或以上的RSA密钥
  • 定期更新证书,有效期不超过1年
  • 安全存储私钥,权限设置为600
  • 使用证书链验证
  • 建立证书吊销机制

2. 加密配置

  • 使用TLSv1.2或TLSv1.3
  • 禁用不安全的加密算法(如SSLv3、TLSv1.0)
  • 配置合适的加密套件
  • 启用SSL会话缓存
  • 强制所有连接使用SSL
  • 考虑使用双向SSL认证

3. 性能优化

  • 选择高效的加密算法
  • 启用SSL硬件加速
  • 优化SSL会话缓存
  • 合理配置连接池
  • 监控加密连接性能

4. 监控和审计

  • 监控SSL连接状态
  • 定期检查证书有效期
  • 审计SSL连接日志
  • 定期进行SSL安全扫描
  • 保持SSL配置符合安全标准

5. 客户端配置

  • 配置客户端验证服务器证书
  • 使用适当的SSL模式
  • 安全存储客户端证书和密钥
  • 定期更新客户端证书

连接加密安全审计脚本

1. 加密配置审计

sql
-- 连接加密配置审计报告
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. 加密连接审计

sql
-- 加密连接审计
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
ORDER BY
    ssl DESC, connection_duration DESC;

3. 证书审计脚本

bash
#!/bin/bash
# KingBaseES SSL证书审计脚本

echo "=== KingBaseES SSL Certificate Audit Report ==="
echo "Audit Time: $(date)"
echo "Hostname: $(hostname)"
echo ""

# 证书文件路径
CERT_DIR="/opt/kingbase/ssl"

# 检查证书文件
for cert_file in "$CERT_DIR/server.crt" "$CERT_DIR/client.crt" "$CERT_DIR/root.crt"; do
    if [ -f "$cert_file" ]; then
        echo "=== $cert_file ==="
        openssl x509 -in "$cert_file" -subject -issuer -dates -noout
        echo ""
    fi
done

# 检查私钥权限
echo "=== Private Key Permissions ==="
for key_file in "$CERT_DIR/server.key" "$CERT_DIR/client.key" "$CERT_DIR/root.key"; do
    if [ -f "$key_file" ]; then
        key_perms=$(stat -c "%a" "$key_file")
        echo "$key_file: $key_perms"
        if [ "$key_perms" -ne 600 ]; then
            echo "WARNING: $key_file permissions are not 600!"
        fi
    fi
done

echo ""
echo "=== Audit Complete ==="

总结

连接加密是KingBaseES数据库安全的重要组成部分,通过合理配置连接加密,可以确保客户端与服务器之间的通信安全,防止数据泄露和篡改。在实际生产环境中,DBA应根据业务需求和安全策略,选择合适的连接加密方案,并定期进行监控和审计,确保连接加密的安全性和有效性。同时,结合防火墙、访问控制等其他安全措施,可以构建更全面的数据库安全体系。