外观
Oracle 连接加密与最佳实践
连接加密是Oracle数据库安全的重要组成部分,通过加密客户端与数据库之间的网络通信,保护数据在传输过程中的安全性,防止数据被窃取、篡改或监听。合理配置连接加密可以有效降低数据泄露的风险,确保敏感数据的安全传输,同时满足PCI DSS、GDPR等合规要求。
连接加密基础
核心作用
- 加密网络通信中的数据,防止数据被窃取
- 确保数据完整性,防止数据被篡改
- 验证通信双方的身份,防止中间人攻击
- 满足合规要求,如PCI DSS、GDPR等
主要加密方式
| 加密方式 | 安全级别 | 性能开销 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|
| SSL/TLS加密 | 高 | 中高 | 中 | 敏感数据传输,对安全性要求高的场景 |
| Oracle高级安全加密 | 中 | 低 | 低 | 内部网络通信,对性能要求较高的场景 |
| 透明数据加密(TDE) | 高 | 低 | 中 | 保护静态数据,防止数据文件被盗取 |
加密算法类型
- 对称加密算法:如AES-256、AES-128等,用于加密实际数据
- 非对称加密算法:如RSA-2048、ECC-256等,用于交换对称密钥
- 哈希算法:如SHA-256、SHA-384等,用于数据完整性检查
Oracle 高级安全加密配置
Oracle Advanced Security是Oracle数据库企业版的一个组件,提供了数据加密、完整性检查和身份验证功能。
检查Oracle Advanced Security是否安装
sql
-- 查看Oracle Advanced Security是否安装
SELECT * FROM V$OPTION WHERE PARAMETER = 'Oracle Advanced Security';
-- 查看加密算法支持
SELECT * FROM V$CRYPT_HASH_ALGORITHMS;
SELECT * FROM V$CRYPT_SYM_ALGORITHMS;配置服务器端加密
sqlnet.ora配置示例
# 加密配置
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
# 完整性检查配置
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA384, SHA256)参数说明
SQLNET.ENCRYPTION_SERVER:服务器加密设置- REQUIRED:必须使用加密
- REQUESTED:优先使用加密
- ACCEPTED:接受加密或非加密连接
- REJECTED:拒绝加密连接
SQLNET.ENCRYPTION_TYPES_SERVER:服务器支持的加密算法,按优先级排序SQLNET.CRYPTO_CHECKSUM_SERVER:服务器完整性检查设置SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER:服务器支持的完整性检查算法
配置客户端加密
客户端sqlnet.ora配置示例
# 加密配置
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)
# 完整性检查配置
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA384, SHA256)验证连接加密
使用sqlplus验证
bash
# 连接数据库
sqlplus scott/tiger@orcl
# 验证加密是否启用
SQL> SELECT SYS_CONTEXT('USERENV', 'NETWORK_ENCRYPTION_ALGORITHM') AS ENCRYPTION_ALGORITHM,
SYS_CONTEXT('USERENV', 'NETWORK_CRYPTO_CHECKSUM_ALGORITHM') AS CHECKSUM_ALGORITHM
FROM DUAL;预期输出示例
ENCRYPTION_ALGORITHM CHECKSUM_ALGORITHM
------------------------ ------------------------
AES256 SHA384SSL/TLS连接加密配置
SSL/TLS加密提供了更高的安全性,支持身份验证和完整的数据保护。
配置服务器端SSL/TLS
步骤1:创建Oracle Wallet
bash
# 创建Wallet目录
mkdir -p /u01/app/oracle/wallet
chown oracle:oinstall /u01/app/oracle/wallet
chmod 700 /u01/app/oracle/wallet
# 创建Wallet
orapki wallet create -wallet /u01/app/oracle/wallet -pwd WalletPass123 -auto_login
# 添加自签名证书(测试环境)
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -dn "CN=oracle.example.com,OU=Database,O=Example,C=US" -keysize 2048 -self_signed -validity 365
# 或者添加CA签发的证书(生产环境)
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -trusted_cert -cert /path/to/ca.crt
orapki wallet add -wallet /u01/app/oracle/wallet -pwd WalletPass123 -user_cert -cert /path/to/server.crt -key /path/to/server.key步骤2:配置listener.ora文件
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle.example.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = oracle.example.com)(PORT = 2484))
)
)
# SSL配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
# 客户端认证配置(FALSE:仅验证服务器,TRUE:验证服务器和客户端)
SSL_CLIENT_AUTHENTICATION = FALSE步骤3:配置sqlnet.ora文件
# 认证服务配置
SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCPS)
# SSL配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
# SSL版本配置
# Oracle 19c:SSL_VERSION = 1.2 或 1.3(实验性)
# Oracle 21c:SSL_VERSION = 1.3(推荐)或 1.2
SSL_VERSION = 1.3
# 加密算法配置
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA384, SHA256)步骤4:重启监听器
bash
# 停止监听器
lsnrctl stop
# 启动监听器
lsnrctl start
# 查看监听器状态
lsnrctl status配置客户端SSL/TLS
步骤1:创建客户端Wallet
bash
# 创建客户端Wallet目录
mkdir -p /client/app/oracle/wallet
# 创建客户端Wallet
orapki wallet create -wallet /client/app/oracle/wallet -pwd ClientWalletPass123 -auto_login
# 添加CA证书到客户端Wallet
orapki wallet add -wallet /client/app/oracle/wallet -pwd ClientWalletPass123 -trusted_cert -cert /path/to/ca.crt步骤2:配置客户端tnsnames.ora文件
ORCL_SSL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = oracle.example.com)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
(SECURITY =
(SSL_SERVER_CERT_DN = "CN=oracle.example.com,OU=Database,O=Example,C=US")
)
)步骤3:配置客户端sqlnet.ora文件
# SSL配置
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /client/app/oracle/wallet)
)
)
# 认证服务配置
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
# SSL版本配置
SSL_VERSION = 1.3
# 加密算法配置
SQLNET.ENCRYPTION_CLIENT = REQUIRED
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128)
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA384, SHA256)步骤4:测试SSL/TLS连接
bash
# 使用sqlplus测试SSL/TLS连接
sqlplus scott/tiger@orcl_ssl
# 验证SSL/TLS连接
SQL> SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') AS PROTOCOL,
SYS_CONTEXT('USERENV', 'SSL_VERSION') AS SSL_VERSION,
SYS_CONTEXT('USERENV', 'NETWORK_ENCRYPTION_ALGORITHM') AS ENCRYPTION_ALGORITHM
FROM DUAL;透明数据加密(TDE)配置
透明数据加密(TDE)用于加密数据文件,保护静态数据,与连接加密配合使用可以提供端到端的数据保护。
配置TDE的基本步骤
创建TDE Wallet
sql-- 设置TDE Wallet位置 ALTER SYSTEM SET ENCRYPTION_WALLET_LOCATION = '(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/wallet)))' SCOPE=SPFILE; -- 重启数据库 SHUTDOWN IMMEDIATE; STARTUP;打开TDE Wallet
sql-- 打开TDE Wallet ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/wallet' IDENTIFIED BY WalletPass123; ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY WalletPass123; ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY IDENTIFIED BY WalletPass123 WITH BACKUP; -- 设置auto_login ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/wallet' IDENTIFIED BY WalletPass123;启用表空间加密
sql-- 创建加密表空间 CREATE TABLESPACE encrypted_ts DATAFILE '/u01/app/oracle/oradata/orcl/encrypted_ts01.dbf' SIZE 100M ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT); -- 加密现有表空间(需要先备份) ALTER TABLESPACE users ENCRYPTION ONLINE USING 'AES256' ENCRYPT;
Oracle 19c与21c连接加密差异
核心差异
| 特性 | Oracle 19c | Oracle 21c |
|---|---|---|
| TLS版本支持 | 支持TLS 1.0/1.1/1.2,实验性支持TLS 1.3 | 仅支持TLS 1.2/1.3,默认启用TLS 1.3 |
| 加密算法支持 | 支持AES、3DES等,有限支持AES-GCM | 增强支持AES-GCM、SHA-3等现代加密算法 |
| 安全默认值 | 较宽松的默认配置 | 更严格的安全默认值,默认启用更强的加密 |
| 性能优化 | 基础优化 | 增强加密性能,减少加密开销 |
| 配置简化 | 基础支持 | 提供更简化的连接加密配置选项 |
| 多租户支持 | 基础多租户支持 | 增强多租户环境的连接加密支持 |
| 云环境支持 | 基础云支持 | 更完善的云原生集成 |
Oracle 21c特有配置
简化的TLS 1.3配置
- 不需要复杂的密码套件配置
- 默认启用更安全的加密算法
- 自动禁用不安全的算法
增强的安全默认值
- 默认禁用TLS 1.0/1.1
- 默认启用更强的加密算法
- 更严格的证书验证
改进的性能
- 优化的加密/解密算法
- 改进的握手过程
- 减少加密开销
生产环境最佳实践
加密策略选择
- 外部网络连接:使用SSL/TLS加密,提供完整的身份验证和数据保护
- 内部网络连接:使用Oracle高级安全加密或SSL/TLS加密
- 静态数据保护:结合使用TDE和连接加密,实现端到端的数据保护
加密算法选择
- 推荐TLS版本:TLS 1.3(Oracle 21c)或 TLS 1.2(Oracle 19c)
- 推荐对称加密算法:AES-256-GCM、AES-128-GCM
- 推荐非对称加密算法:RSA-2048或更高,ECC-256或更高
- 推荐哈希算法:SHA-256、SHA-384、SHA-512
- 禁用算法:TLS 1.0/1.1、DES、3DES、MD5、SHA-1
配置优化
强制使用加密
SQLNET.ENCRYPTION_SERVER = REQUIRED SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED使用auto_login Wallet
- 减少密码输入,提高安全性
- 避免手动打开Wallet的操作
定期备份Wallet
- 备份Wallet文件到安全位置
- 测试Wallet恢复流程
监控证书有效期
- 设置告警,在证书过期前30-90天提醒更新
- 定期检查证书状态
监控与审计
监控连接加密状态
- 定期检查连接是否使用了加密
- 监控加密算法的使用情况
审计连接加密配置
- 定期审查加密配置
- 记录配置变更
监控性能影响
- 监控加密对性能的影响
- 根据性能调整加密策略
常见问题(FAQ)
Q:如何检查连接是否已加密?
A:使用以下SQL查询验证:
sql
SELECT SYS_CONTEXT('USERENV', 'NETWORK_ENCRYPTION_ALGORITHM') AS ENCRYPTION_ALGORITHM,
SYS_CONTEXT('USERENV', 'NETWORK_CRYPTO_CHECKSUM_ALGORITHM') AS CHECKSUM_ALGORITHM
FROM DUAL;Q:连接加密会影响性能吗?
A:连接加密会带来一定的性能开销,具体影响取决于:
- 加密算法的选择(AES-GCM比传统AES更快)
- 硬件性能(现代CPU通常有硬件加速)
- 数据量大小
- 网络带宽
一般来说,AES-256等现代加密算法的性能开销较小,对大多数应用来说可以接受。
Q:如何选择合适的加密方式?
A:
- 安全需求:对安全性要求高的场景使用SSL/TLS加密
- 性能要求:对性能要求高的场景可以使用Oracle高级安全加密
- 合规要求:根据合规要求选择合适的加密方式
- 部署环境:外部网络使用SSL/TLS,内部网络可以使用Oracle高级安全加密
Q:如何排查连接加密问题?
A:
- 检查监听器状态:
lsnrctl status - 检查Wallet内容:
orapki wallet display -wallet /u01/app/oracle/wallet -complete - 查看监听器日志:
tail -f /u01/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml - 查看数据库日志:
tail -f /u01/app/oracle/diag/rdbms/dbname/dbname/trace/alert_dbname.log - 启用sqlnet日志:在sqlnet.ora中设置
SQLNET.LOG_FILE_SERVER = sqlnet.log
Q:如何迁移到TLS 1.3?
A:
- 检查版本支持:确保Oracle版本支持TLS 1.3(Oracle 19c实验性支持,Oracle 21c全面支持)
- 更新配置:
- 在sqlnet.ora中设置
SSL_VERSION = 1.3 - 配置合适的密码套件
- 在sqlnet.ora中设置
- 测试连接:测试客户端是否能正常连接
- 监控性能:监控TLS 1.3连接的性能
- 逐步迁移:可以先同时支持TLS 1.2和TLS 1.3,然后逐步过渡到仅TLS 1.3
Q:如何配置双向认证?
A:
- 服务器配置:在listener.ora中设置
SSL_CLIENT_AUTHENTICATION = TRUE - 客户端配置:
- 为客户端创建证书
- 将客户端证书导入客户端Wallet
- 将客户端证书添加到服务器的信任列表
- 测试连接:使用客户端证书测试连接
Q:TDE与连接加密有什么区别?
A:
- TDE:用于加密数据文件,保护静态数据,防止数据文件被盗取
- 连接加密:用于加密网络传输中的数据,防止数据在传输过程中被窃取
- 最佳实践:结合使用TDE和连接加密,实现端到端的数据保护
Q:如何处理Wallet密码丢失?
A:
- 如果使用了auto_login Wallet,可以通过auto_login文件访问Wallet
- 如果没有auto_login Wallet,需要重新创建Wallet和证书
- 预防措施:定期备份Wallet,将密码存储在安全的密码管理系统中
Q:在多租户环境中如何配置连接加密?
A:
- 为CDB配置连接加密,所有PDB将继承CDB的配置
- 可以为特定PDB配置不同的连接加密参数
- 为每个PDB创建独立的服务名,使用相同的SSL端口
- 客户端连接时指定PDB的服务名
Q:如何监控连接加密的使用情况?
A:
- 使用Oracle Enterprise Manager监控连接加密状态
- 查询V$SESSION视图查看连接加密信息sql
SELECT s.sid, s.serial#, s.username, SYS_CONTEXT('USERENV', 'NETWORK_ENCRYPTION_ALGORITHM') AS ENCRYPTION_ALGORITHM, SYS_CONTEXT('USERENV', 'NETWORK_CRYPTO_CHECKSUM_ALGORITHM') AS CHECKSUM_ALGORITHM FROM V$SESSION s WHERE s.username IS NOT NULL; - 配置审计策略,记录连接加密事件
总结
连接加密是Oracle数据库安全的重要组成部分,通过加密客户端与数据库之间的网络通信,保护数据在传输过程中的安全性。DBA应该根据业务需求和安全要求,选择合适的连接加密方式,如SSL/TLS加密或Oracle高级安全加密。
合理配置连接加密,使用强加密算法,保护密钥安全,监控连接加密状态,可以有效提高数据库通信的安全性,防止数据泄露和篡改。Oracle 21c增强了连接加密功能,提供了更好的性能和安全性,DBA可以考虑升级到新版本以获得更好的连接加密支持。
在生产环境中,建议结合使用TDE和连接加密,实现端到端的数据保护,同时满足合规要求。定期审查和更新连接加密配置,确保其符合最新的安全标准和最佳实践。
