重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 48|回复: 0
打印 上一主题 下一主题

[Oracle] Oracle 19c TDE 透明数据加密

[复制链接]
跳转到指定楼层
楼主
发表于 7 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 前置准备
1.1 环境信息
项目        说明
数据库版本        Oracle 19c(19.3+)
操作系统        Linux(CentOS 7 / RHEL 7+)
架构模式        单实例 或 CDB-PDB
COMPATIBLE 参数        ≥ 12.0.0(TDE 基本要求)
1.2 前置检查
-- oracle-19c
-- 检查数据库版本与兼容性参数
SELECT version, name, value FROM v$parameter p JOIN v$instance i ON 1=1 WHERE p.name = 'compatible';

-- 检查当前密钥库状态
SELECT * FROM v$encryption_wallet;

-- 检查 DB_UNIQUE_NAME(影响默认密钥库路径)
SELECT name, value FROM v$parameter WHERE name = 'db_unique_name';
小贴士: 若 COMPATIBLE 参数低于 12.0.0,需先调整后再启用 TDE。19c 建议设置为 19.0.0 以获得完整 TDE 功能支持。

2 TDE 密钥库搜索顺序
TDE 密钥库的搜索顺序取决于实例初始化参数、sqlnet.ora 参数或环境变量的设置。Oracle Database 按以下顺序检索密钥库:

优先级        配置方式        说明
1        WALLET_ROOT + TDE_CONFIGURATION        当 TDE_CONFIGURATION 的 KEYSTORE_CONFIGURATION 属性设为 FILE 时,由 WALLET_ROOT 指定位置。Oracle 推荐方式
2        sqlnet.ora 的 WALLET_LOCATION        若未设置 WALLET_ROOT 或 KEYSTORE_CONFIGURATION 非 FILE,则读取此配置
3        sqlnet.ora 的 ENCRYPTION_WALLET_LOCATION        已弃用,由 WALLET_ROOT 参数替代
4        默认路径        $ORACLE_BASE/admin/$DB_UNIQUE_NAME/wallet;若未设 ORACLE_BASE,则为 $ORACLE_HOME/admin/$DB_UNIQUE_NAME/wallet
版本差异说明:

Oracle 12c R1:使用 ENCRYPTION_WALLET_LOCATION 参数,命令为 ALTER SYSTEM SET ENCRYPTION WALLET ...
Oracle 12c R2+:引入 WALLET_ROOT 和 TDE_CONFIGURATION 参数,推荐使用 ADMINISTER KEY MANAGEMENT 命令
Oracle 19c:ENCRYPTION_WALLET_LOCATION 已弃用,必须使用 WALLET_ROOT + TDE_CONFIGURATION
版本适配建议: 生产环境建议统一使用 WALLET_ROOT + TDE_CONFIGURATION 方式(方式二),兼容性最佳且为 Oracle 官方推荐。

3 方式一:不修改 WALLET_ROOT 参数(sqlnet.ora 方式)
3.1 配置 sqlnet.ora 文件
vi $ORACLE_HOME/network/admin/sqlnet.ora
添加以下内容:

WALLET_LOCATION =
  (SOURCE =
    (METHOD = file)
    (METHOD_DATA =
      (DIRECTORY = /opt/oracle/admin/orcl/wallet)
    )
  )
注意: 此方式也可直接在实例中修改参数,此步可省略。但为了配置明确性,建议保留 sqlnet.ora 配置。

3.2 创建密钥库目录
su - oracle
mkdir -p /opt/oracle/admin/orcl/wallet
3.3 创建密码保护的密钥库
-- oracle-19c
-- 创建密码保护的软件密钥库,identified by 后为密钥库密码
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/opt/oracle/admin/orcl/wallet' IDENTIFIED BY [密码];
创建完成后,目录下生成 ewallet.p12 文件,此时密钥库为关闭状态。

-- 验证密钥库状态
COL wrl_parameter FOR a40
SELECT * FROM v$encryption_wallet;
3.4 配置自动登录
配置自动登录后,目录下会生成 cwallet.sso 文件,数据库启动时自动打开密钥库。

-- oracle-19c
-- 创建自动登录密钥库
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/opt/oracle/admin/orcl/wallet' IDENTIFIED BY [密码];
注意: 配置自动登录后 WALLET_TYPE 为 AUTOLOGIN,此时无法直接关闭密钥库。若需关闭,请参考 3.7 关闭密钥库。

3.5 设置 TDE 主加密密钥
-- oracle-19c
-- 在软件密钥库中设置 TDE 主加密密钥,force 关键字用于已有密钥时强制覆盖
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY [密码] WITH BACKUP;
CDB-PDB 架构下的操作:

-- 若为 PDB 模式,需进入对应 PDB 单独设置主加密密钥
ALTER SESSION SET CONTAINER = pdb_name;

ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY [密码] WITH BACKUP;
-- 若需对所有 PDB 设置(在 CDB 根容器执行)
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY [密码] WITH BACKUP CONTAINER = ALL;
3.6 创建加密表空间与测试数据
创建加密表空间:

-- oracle-19c
-- 默认使用 AES128 加密算法
CREATE TABLESPACE tde1
  DATAFILE '/opt/oracle/oradata/ORCL/tde01.dbf'
  SIZE 100M
  ENCRYPTION
  ENCRYPT;

-- 指定加密算法与存储参数的写法
-- CREATE TABLESPACE tde1
--   DATAFILE '/opt/oracle/oradata/ORCL/tde01.dbf'
--   SIZE 1024M AUTOEXTEND ON NEXT 100M MAXSIZE 30G
--   ENCRYPTION USING 'AES256'
--   DEFAULT STORAGE (ENCRYPT);
-- 验证表空间加密状态
SELECT tablespace_name, encrypted FROM dba_tablespaces;
创建测试表并插入数据:

CREATE TABLE t1 (id NUMBER) TABLESPACE tde1;
INSERT INTO t1 VALUES (101);
COMMIT;
SELECT * FROM t1;
3.7 关闭密钥库
若已配置自动登录,需先移除自动登录文件,否则会报错。

错误示例(自动登录状态下直接关闭):

ORA-28390: auto login keystore not open
正确关闭流程:

# 移除自动登录文件
mv /opt/oracle/admin/orcl/wallet/cwallet.sso /opt/oracle/admin/orcl/wallet/cwallet.sso.bak
-- oracle-19c
-- 关闭密钥库
ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY [密码];
小贴士: 移除 cwallet.sso 后,数据库重启需手动打开密钥库,请确保已记录密钥库密码。

3.8 开启密钥库
-- oracle-19c
-- 方式一
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY [密码];

-- 方式二(推荐)
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY [密码];

-- CDB-PDB 架构下强制打开所有容器密钥库
-- ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN FORCE KEYSTORE IDENTIFIED BY [密码] CONTAINER = ALL;
-- 验证密钥库状态
SELECT * FROM v$encryption_wallet;
3.9 重新配置自动登录
-- oracle-19c
-- 重新创建自动登录密钥库,需重启数据库生效
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/opt/oracle/admin/orcl/wallet' IDENTIFIED BY [密码];
# 重启数据库
sqlplus / as sysdba
SHUTDOWN IMMEDIATE
STARTUP
-- 验证自动登录是否生效(WALLET_TYPE 应为 AUTOLOGIN)
SELECT * FROM v$encryption_wallet;
4 方式二:修改 WALLET_ROOT 参数(Oracle 推荐方式)
推荐: 此方式为 Oracle 官方推荐,需重启数据库。

4.1 创建密钥库目录
su - oracle
mkdir -p /opt/oracle/admin/orcl/wallet
4.2 设置 WALLET_ROOT 静态参数
-- oracle-19c
-- 设置 WALLET_ROOT 参数(静态参数,需重启)
ALTER SYSTEM SET WALLET_ROOT = '/opt/oracle/admin/orcl/wallet' SCOPE = SPFILE;
# 重启数据库
sqlplus / as sysdba
SHUTDOWN IMMEDIATE
STARTUP
-- 验证参数是否生效
SELECT name, value FROM v$parameter WHERE name = 'wallet_root';
4.3 设置 TDE_CONFIGURATION 参数
-- oracle-19c
-- 指定密钥库类型为 FILE(软件密钥库)
ALTER SYSTEM SET TDE_CONFIGURATION = 'KEYSTORE_CONFIGURATION=FILE' SCOPE = BOTH;
-- 验证参数
SELECT name, value FROM v$parameter WHERE name = 'tde_configuration';
4.4 创建密码保护的密钥库
-- oracle-19c
-- 使用 WALLET_ROOT 方式时,无需指定路径,自动使用 $WALLET_ROOT/tde/ 目录
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY [密码];
创建完成后,在 $WALLET_ROOT/tde/ 目录下生成 ewallet.p12 文件,此时密钥库为关闭状态。

-- 验证密钥库状态
COL wrl_parameter FOR a50
SELECT * FROM v$encryption_wallet;
4.5 配置自动登录
-- oracle-19c
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE IDENTIFIED BY [密码];
4.6 设置 TDE 主加密密钥
-- oracle-19c
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY [密码] WITH BACKUP;
-- 验证主加密密钥
SELECT key_id, activation_time FROM v$encryption_keys;
5 在线加密与解密
5.1 在线加密已有表空间
-- oracle-19c
-- 在线加密 USERS 表空间,使用 AES192 算法
ALTER TABLESPACE users ENCRYPTION ONLINE USING 'AES192' ENCRYPT;
5.2 在线解密表空间
-- oracle-19c
-- 在线解密 USERS 表空间
ALTER TABLESPACE users ENCRYPTION ONLINE DECRYPT;
注意: 在线加密/解密操作期间,表空间仍可正常读写,但会消耗额外的 CPU 和 I/O 资源。建议在业务低峰期执行。

6 密钥库管理常用命令速查
操作        命令
查看密钥库状态        SELECT * FROM v$encryption_wallet;
查看加密密钥信息        SELECT key_id, activation_time FROM v$encryption_keys;
查看加密表空间        SELECT tablespace_name, encrypted FROM dba_tablespaces;
打开密钥库        ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY [密码];
关闭密钥库        ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY [密码];
备份密钥库        ADMINISTER KEY MANAGEMENT BACKUP KEYSTORE IDENTIFIED BY [密码];
修改密钥库密码        ADMINISTER KEY MANAGEMENT ALTER KEYSTORE IDENTIFIED BY [旧密码] SET [新密码];
合并密钥库        ADMINISTER KEY MANAGEMENT MERGE KEYSTORE ... IDENTIFIED BY ... INTO ...;
7 TDE 加密算法说明
算法        密钥长度        说明
AES128        128 位        默认加密算法,性能与安全性平衡
AES192        192 位        中等安全级别
AES256        256 位        最高安全级别,性能开销略大
3DES168        168 位        已不推荐,仅用于向后兼容
建议: 新建加密表空间推荐使用 AES256,兼顾安全与 Oracle 官方建议。

总结 & 注意事项
核心要点:

优先使用方式二(WALLET_ROOT + TDE_CONFIGURATION):Oracle 官方推荐,兼容性最佳,适合 19c 生产环境
密钥库密码必须妥善保管:丢失密码将无法恢复加密数据,建议使用 Oracle Key Vault 或安全密码管理工具
自动登录的利弊权衡:自动登录方便但安全性降低,生产环境需根据合规要求决定是否启用
CDB-PDB 架构需注意:每个 PDB 可拥有独立的主加密密钥,需分别配置
在线加密影响:在线加密/解密期间存在额外资源消耗,建议在业务低峰期执行
避坑提醒:

关闭密钥库前,必须先移除自动登录文件(cwallet.sso),否则报 ORA-28390 错误
WALLET_ROOT 为静态参数,修改后需重启数据库才生效
设置 TDE_CONFIGURATION 时,值格式为 KEYSTORE_CONFIGURATION=FILE,等号两侧无空格
方式一和方式二的密钥库文件路径不同:方式一在指定目录下,方式二在 $WALLET_ROOT/tde/ 子目录下
加密表空间不支持传输(Transportable Tablespace)到未配置 TDE 的数据库

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-6-7 21:38 , Processed in 2.169556 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表