Skip to content

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                   SHA384

SSL/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的基本步骤

  1. 创建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;
  2. 打开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;
  3. 启用表空间加密

    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 19cOracle 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特有配置

  1. 简化的TLS 1.3配置

    • 不需要复杂的密码套件配置
    • 默认启用更安全的加密算法
    • 自动禁用不安全的算法
  2. 增强的安全默认值

    • 默认禁用TLS 1.0/1.1
    • 默认启用更强的加密算法
    • 更严格的证书验证
  3. 改进的性能

    • 优化的加密/解密算法
    • 改进的握手过程
    • 减少加密开销

生产环境最佳实践

加密策略选择

  1. 外部网络连接:使用SSL/TLS加密,提供完整的身份验证和数据保护
  2. 内部网络连接:使用Oracle高级安全加密或SSL/TLS加密
  3. 静态数据保护:结合使用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

配置优化

  1. 强制使用加密

    SQLNET.ENCRYPTION_SERVER = REQUIRED
    SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
  2. 使用auto_login Wallet

    • 减少密码输入,提高安全性
    • 避免手动打开Wallet的操作
  3. 定期备份Wallet

    • 备份Wallet文件到安全位置
    • 测试Wallet恢复流程
  4. 监控证书有效期

    • 设置告警,在证书过期前30-90天提醒更新
    • 定期检查证书状态

监控与审计

  1. 监控连接加密状态

    • 定期检查连接是否使用了加密
    • 监控加密算法的使用情况
  2. 审计连接加密配置

    • 定期审查加密配置
    • 记录配置变更
  3. 监控性能影响

    • 监控加密对性能的影响
    • 根据性能调整加密策略

常见问题(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:

  1. 安全需求:对安全性要求高的场景使用SSL/TLS加密
  2. 性能要求:对性能要求高的场景可以使用Oracle高级安全加密
  3. 合规要求:根据合规要求选择合适的加密方式
  4. 部署环境:外部网络使用SSL/TLS,内部网络可以使用Oracle高级安全加密

Q:如何排查连接加密问题?

A:

  1. 检查监听器状态:lsnrctl status
  2. 检查Wallet内容:orapki wallet display -wallet /u01/app/oracle/wallet -complete
  3. 查看监听器日志:tail -f /u01/app/oracle/diag/tnslsnr/hostname/listener/alert/log.xml
  4. 查看数据库日志:tail -f /u01/app/oracle/diag/rdbms/dbname/dbname/trace/alert_dbname.log
  5. 启用sqlnet日志:在sqlnet.ora中设置SQLNET.LOG_FILE_SERVER = sqlnet.log

Q:如何迁移到TLS 1.3?

A:

  1. 检查版本支持:确保Oracle版本支持TLS 1.3(Oracle 19c实验性支持,Oracle 21c全面支持)
  2. 更新配置
    • 在sqlnet.ora中设置SSL_VERSION = 1.3
    • 配置合适的密码套件
  3. 测试连接:测试客户端是否能正常连接
  4. 监控性能:监控TLS 1.3连接的性能
  5. 逐步迁移:可以先同时支持TLS 1.2和TLS 1.3,然后逐步过渡到仅TLS 1.3

Q:如何配置双向认证?

A:

  1. 服务器配置:在listener.ora中设置SSL_CLIENT_AUTHENTICATION = TRUE
  2. 客户端配置
    • 为客户端创建证书
    • 将客户端证书导入客户端Wallet
    • 将客户端证书添加到服务器的信任列表
  3. 测试连接:使用客户端证书测试连接

Q:TDE与连接加密有什么区别?

A:

  • TDE:用于加密数据文件,保护静态数据,防止数据文件被盗取
  • 连接加密:用于加密网络传输中的数据,防止数据在传输过程中被窃取
  • 最佳实践:结合使用TDE和连接加密,实现端到端的数据保护

Q:如何处理Wallet密码丢失?

A:

  • 如果使用了auto_login Wallet,可以通过auto_login文件访问Wallet
  • 如果没有auto_login Wallet,需要重新创建Wallet和证书
  • 预防措施:定期备份Wallet,将密码存储在安全的密码管理系统中

Q:在多租户环境中如何配置连接加密?

A:

  1. 为CDB配置连接加密,所有PDB将继承CDB的配置
  2. 可以为特定PDB配置不同的连接加密参数
  3. 为每个PDB创建独立的服务名,使用相同的SSL端口
  4. 客户端连接时指定PDB的服务名

Q:如何监控连接加密的使用情况?

A:

  1. 使用Oracle Enterprise Manager监控连接加密状态
  2. 查询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;
  3. 配置审计策略,记录连接加密事件

总结

连接加密是Oracle数据库安全的重要组成部分,通过加密客户端与数据库之间的网络通信,保护数据在传输过程中的安全性。DBA应该根据业务需求和安全要求,选择合适的连接加密方式,如SSL/TLS加密或Oracle高级安全加密。

合理配置连接加密,使用强加密算法,保护密钥安全,监控连接加密状态,可以有效提高数据库通信的安全性,防止数据泄露和篡改。Oracle 21c增强了连接加密功能,提供了更好的性能和安全性,DBA可以考虑升级到新版本以获得更好的连接加密支持。

在生产环境中,建议结合使用TDE和连接加密,实现端到端的数据保护,同时满足合规要求。定期审查和更新连接加密配置,确保其符合最新的安全标准和最佳实践。