外观
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, 3DES168 | AES256 |
| 非对称加密 | RSA512, RSA1024, RSA2048, RSA4096 | RSA2048+ |
| 哈希算法 | SHA1, SHA256, SHA384, SHA512 | SHA256+ |
算法性能对比
- 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
最佳实践
- 分层加密策略: 结合 TDE、网络加密和应用层加密
- 最小权限原则: 限制密钥库访问权限
- 定期密钥轮换: 建立密钥轮换策略和流程
- 全面审计: 审计所有加密和密钥操作
- 备份密钥库: 将密钥库备份与数据备份分开存储
- 测试恢复流程: 定期测试加密数据的恢复流程
- 使用硬件安全模块(HSM): 考虑使用 HSM 存储主密钥,提高安全性
- 遵循合规要求: 根据 GDPR、PCI DSS 等合规要求配置加密策略
- 监控加密性能: 定期监控加密对系统性能的影响
- 培训与文档: 确保 DBA 团队了解加密配置和管理流程
总结
数据加密是 Oracle 数据库安全的重要组成部分,通过 TDE 和网络加密可以有效保护敏感数据。Oracle 21c 提供了更强大的加密功能和更简化的管理界面,建议在升级时充分利用这些新特性。实施加密时,需要平衡安全性和性能,并建立完善的密钥管理和审计机制。
