Skip to content

Oracle 数据加密

透明数据加密(TDE)

TDE 概述

透明数据加密(TDE)用于加密存储在数据库中的敏感数据,包括数据文件、备份集和 redo 日志。TDE 对应用程序透明,无需修改应用代码。

TDE 架构

  • 主密钥(MEK): 存储在数据库外部的密钥库中
  • 表空间加密密钥(TEK): 用于加密表空间,由 MEK 加密
  • 列加密密钥(CEK): 用于加密特定列,由 MEK 加密

TDE 配置步骤

1. 配置密钥库

sql
-- 创建密钥库
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/admin/ORCL/wallet' IDENTIFIED BY "MyKeystorePassword123";

-- 打开密钥库
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "MyKeystorePassword123" CONTAINER = ALL;

-- 创建主密钥
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "MyKeystorePassword123" CONTAINER = ALL;

-- 配置自动打开密钥库
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/admin/ORCL/wallet' IDENTIFIED BY "MyKeystorePassword123";

2. 表空间加密

sql
-- 创建加密表空间
CREATE TABLESPACE encrypted_ts
  DATAFILE '/u01/app/oracle/oradata/ORCL/encrypted_ts.dbf' 
  SIZE 100M 
  ENCRYPTION USING 'AES256' 
  DEFAULT STORAGE(ENCRYPT);

-- 加密现有表空间(需要重建)
-- 1. 导出表空间数据
-- 2. 删除表空间
-- 3. 重建加密表空间
-- 4. 导入数据

3. 列级加密

sql
-- 创建带加密列的表
CREATE TABLE employees (
  emp_id NUMBER,
  emp_name VARCHAR2(100),
  salary NUMBER(10,2) ENCRYPT USING 'AES192',
  ssn VARCHAR2(11) ENCRYPT USING '3DES168'
);

-- 插入数据(加密透明)
INSERT INTO employees VALUES (1, 'John Doe', 50000, '123-45-6789');

-- 查询数据(解密透明)
SELECT * FROM employees;

Oracle 高级安全加密

网络加密

网络加密用于保护客户端与数据库之间的数据传输:

sql
-- 启用网络加密
ALTER SYSTEM SET encryption_wallet_location = '(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/admin/ORCL/wallet)))' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.encryption_client = 'required' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.encryption_types_client = '(AES256)' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.encryption_server = 'required' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.encryption_types_server = '(AES256)' SCOPE=SPFILE;

数据完整性

数据完整性用于防止数据在传输过程中被篡改:

sql
ALTER SYSTEM SET sqlnet.crypto_checksum_client = 'required' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.crypto_checksum_types_client = '(SHA256)' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.crypto_checksum_server = 'required' SCOPE=SPFILE;
ALTER SYSTEM SET sqlnet.crypto_checksum_types_server = '(SHA256)' SCOPE=SPFILE;

加密算法选择

常用加密算法

算法类型支持的算法推荐使用
对称加密AES128, AES192, AES256, 3DES168AES256
非对称加密RSA512, RSA1024, RSA2048, RSA4096RSA2048+
哈希算法SHA1, SHA256, SHA384, SHA512SHA256+

算法性能对比

  • AES128: 最高性能,适合对性能要求高的场景
  • AES256: 最高安全性,适合敏感数据
  • 3DES168: 兼容性好,性能较低,逐渐被AES替代

Oracle 19c vs 21c 加密特性差异

Oracle 19c 加密特性

  • 支持 TDE 表空间加密和列加密
  • 支持网络加密和数据完整性
  • 密钥库管理需要手动配置
  • 支持 AES 和 3DES 算法

Oracle 21c 加密增强

  • 自动密钥轮换: 支持定期自动轮换加密密钥
  • 增强的密钥库管理: 支持 Oracle Cloud Key Management Service 集成
  • 新增加密算法: 支持 ChaCha20-Poly1305 等现代加密算法
  • 加密性能优化: 针对多核处理器优化,性能提升 30%+
  • 细粒度加密策略: 支持基于策略的加密配置

版本迁移注意事项

  • 从 19c 升级到 21c 时,TDE 配置自动迁移
  • 建议升级后启用自动密钥轮换功能
  • 考虑迁移到更安全的加密算法

密钥管理最佳实践

密钥库备份与恢复

bash
# 备份密钥库
cp -r /u01/app/oracle/admin/ORCL/wallet /backup/oracle/keystore/$(date +%Y%m%d)

# 恢复密钥库
cp -r /backup/oracle/keystore/20250101 /u01/app/oracle/admin/ORCL/wallet
chown -R oracle:oinstall /u01/app/oracle/admin/ORCL/wallet
chmod -R 700 /u01/app/oracle/admin/ORCL/wallet

密钥轮换策略

  • 主密钥: 每 6-12 个月轮换一次
  • 表空间/列加密密钥: 每 12-24 个月轮换一次
  • 轮换前确保备份所有密钥和数据

密钥库安全

  • 将密钥库存储在安全的位置,与数据文件分开
  • 限制密钥库访问权限,仅允许 DBA 和密钥管理员访问
  • 启用密钥库审计,记录所有密钥操作

性能影响与优化

TDE 性能影响

  • 表空间加密: 对 I/O 密集型应用影响约 5-10%
  • 列加密: 对 CPU 密集型应用影响约 3-5%
  • 网络加密: 对网络延迟敏感应用影响约 2-3%

性能优化建议

  • 使用高性能存储设备(SSD)减少 I/O 瓶颈
  • 确保足够的 CPU 资源处理加密/解密操作
  • 仅加密敏感数据,避免过度加密
  • 考虑使用 Oracle Exadata 或 ZFS Storage Appliance 等硬件加密加速设备

监控与审计

监控加密状态

sql
-- 检查 TDE 配置
SELECT * FROM v$encryption_wallet;

-- 检查表空间加密状态
SELECT tablespace_name, encrypted FROM dba_tablespaces;

-- 检查列加密状态
SELECT table_name, column_name, encryption_alg FROM dba_encrypted_columns;

审计加密操作

sql
-- 启用密钥库审计
ADMINISTER KEY MANAGEMENT SET AUDIT ON IDENTIFIED BY "MyKeystorePassword123" CONTAINER = ALL;

-- 查看审计日志
SELECT * FROM dba_keystore_operations ORDER BY timestamp DESC;

常见问题(FAQ)

Q: TDE 加密会影响备份恢复吗?

A: TDE 加密的数据库备份也会被加密,恢复时需要确保密钥库可用并包含正确的主密钥。建议将密钥库备份与数据备份一起存储。

Q: 如何迁移 TDE 加密的数据库?

A: 迁移 TDE 加密数据库时,需要同时迁移密钥库,并确保目标环境可以访问密钥库。使用 Data Pump 迁移时,导出的转储文件也会被加密。

Q: TDE 可以防止哪些攻击?

A: TDE 主要防止物理数据泄露,如磁盘失窃、备份泄露等。但不能防止通过数据库连接进行的攻击,如 SQL 注入。

Q: 密钥库密码丢失怎么办?

A: 密钥库密码丢失会导致无法访问加密数据。必须确保密钥库密码安全存储,并定期测试密钥库恢复流程。

Q: Oracle 21c 的自动密钥轮换如何配置?

A:

sql
-- 配置自动密钥轮换(每 90 天)
ADMINISTER KEY MANAGEMENT SET KEY ROTATION INTERVAL 90 DAYS IDENTIFIED BY "MyKeystorePassword123" CONTAINER = ALL;

Q: 如何选择合适的加密算法?

A: 根据安全要求和性能需求选择:

  • 高安全性场景: AES256 + SHA384
  • 平衡安全与性能: AES192 + SHA256
  • 兼容性要求高: 3DES168 + SHA1

最佳实践

  1. 分层加密策略: 结合 TDE、网络加密和应用层加密
  2. 最小权限原则: 限制密钥库访问权限
  3. 定期密钥轮换: 建立密钥轮换策略和流程
  4. 全面审计: 审计所有加密和密钥操作
  5. 备份密钥库: 将密钥库备份与数据备份分开存储
  6. 测试恢复流程: 定期测试加密数据的恢复流程
  7. 使用硬件安全模块(HSM): 考虑使用 HSM 存储主密钥,提高安全性
  8. 遵循合规要求: 根据 GDPR、PCI DSS 等合规要求配置加密策略
  9. 监控加密性能: 定期监控加密对系统性能的影响
  10. 培训与文档: 确保 DBA 团队了解加密配置和管理流程

总结

数据加密是 Oracle 数据库安全的重要组成部分,通过 TDE 和网络加密可以有效保护敏感数据。Oracle 21c 提供了更强大的加密功能和更简化的管理界面,建议在升级时充分利用这些新特性。实施加密时,需要平衡安全性和性能,并建立完善的密钥管理和审计机制。