在裸金属解决方案上部署和管理 Oracle 透明数据加密 (TDE)
本页面介绍如何在裸金属解决方案上部署 Oracle 高级安全透明数据加密 (TDE) 以及如何管理 Oracle 钱包和密钥。
概览
Oracle 高级安全 TDE 以透明方式加密 Oracle 数据库中的静态数据,并防止对数据库文件进行未经授权的访问。TDE 可以加密整个数据库备份 (RMAN) 和数据泵导出以及特定表空间和列。
透明数据加密的工作原理
TDE 会创建和管理多个用于加密的密钥。这些密钥必须妥善保护,因为如果攻击者获得加密数据和匹配密钥,则可以很容易地解密,查看明码数据。
TDE 具有双层密钥架构,其中包含由单个数据库主密钥封装的数据加密密钥。主密钥与加密数据分开,存储在数据库的外部,该数据库可以是 Oracle 软件密钥库钱包或硬件安全模块 (HSM) 密钥库,并在密钥库中由数据库安全管理员直接管理。
TDE 有两种密钥库选项可用于支持各种客户环境。默认情况下,TDE 会将其主密钥存储在 Oracle 钱包中,这是一个基于 PKCS#12 标准的密钥存储文件。钱包为少量加密数据库提供了一种简单的解决方案。
在裸金属解决方案服务器上为 Oracle 数据库 11g 启用 TDE:
您可以在列级层和表空间级层执行加密操作。您还可以在 RMAN 备份上应用 TDE。
满足 TDE 前提条件
您需要设置密钥库(对于 11g 为 Oracle Wallet
)来准备数据库并创建初始主密钥。
在裸金属解决方案服务器中配置 Oracle 钱包
从项目中的
jump host
或bastion
机器连接到一个裸金属解决方案服务器。$ ssh customeradmin@192.168.1.10 $ su - oracle
设置环境变量。
[oracle@svr002 ~]$ . oraenv ORACLE_SID = [tdedb] ? DB11G The Oracle base has been changed from /u01/app/oracle to /apps/oracle/oracle_base [oracle@svr002 ~]$ export ORACLE_SID=DB11G1
以 sysdba 身份进行连接。
[oracle@svr002 ~]$ sqlplus / as sysdba
确保已正确设置以下所有环境变量。
$ echo $ORACLE_HOME $ echo $ORACLE_BASE $ echo $DB_UNIQUE_NAME
为钱包文件创建新目录。
$ mkdir -p $ORACLE_BASE/admin/DB11G/wallet
使用 orapki 实用程序创建电子钱包并启用自动登录,这样我们就无需在重启时启用电子钱包。
$ orapki wallet create -wallet $ORACLE_BASE/admin/DB11G/wallet -auto_login -pwd Oracle2020
Oracle 会使用钱包的默认路径。
$ ORACLE_BASE/admin/$DB_UNIQUE_NAME/wallet $ ORACLE_HOME/admin/$DB_UNIQUE_NAME/wallet
如果您未使用默认路径,则需要在
sqlnet.ora
文件中设置备用路径。您需要设置参数ENCRYPTION_WALLET_LOCATION
或WALLET_LOCATION
。如需找到电子钱包路径,请运行以下命令:
SQL> COL wrl_type FORMAT a12 COL wrl_parameter FORMAT a35 COL status FORMAT a15 SQL> select * from v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS -------- ------------- ------- file /apps/oracle/oracle_base OPEN_NO_MASTER_KEY /admin/DB11G/wallet
如需在
sqlnet.ora
文件中设置钱包路径,请运行以下命令:$ vi sqlnet.ora ENCRYPTION_WALLET_LOCATION= (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=/apps/oracle/oracle_base/admin/DB11G/wallet)) Or WALLET_LOCATION = (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=/apps/oracle/oracle_base/admin/DB11G/wallet))
为钱包添加用户名和密码。如需为现有钱包添加用户名和密码,请将
mkstore
命令与-createCredential
选项结合使用,如下所示:mkstore -wrl <wallet_location> -createCredential <TNS_alias> <username> <password> $ mkstore -wrl apps/oracle/oracle_base/admin/DB11G/wallet -createCredential DB11G testuser testtest123
您可以使用
testuser@SID
登录,无需输入密码。创建初始主密钥。
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY Oracle2020;
检查钱包状态是否为
OPEN
。SQL> COL wrl_type FORMAT a12 COL wrl_parameter FORMAT a35 COL status FORMAT a15 SQL> select * from v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS -------- ------------- ------ file /apps/oracle/oracle_base/ OPEN admin/DB11G/wallet
如需打开和关闭钱包,请运行以下命令:
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "Password"; SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
在表空间级层启用 TDE
您可以使用 CREATE TABLESPACE SQL
语句执行加密操作。
加密新的表空间
创建新的表空间时,您可以在创建过程中配置其加密设置。
确保用于表空间加密的兼容初始化参数为 11.2.0.0 或更高版本
SQL> SHOW PARAMETER COMPATIBLE NAME TYPE VALUE ---- ---- ------ compatible string 11.2.0.4.0
确保您已配置 TDE 主加密密钥;您可以在前提条件部分的“创建初始主密钥”下进行检查。
创建加密表空间
如需检查数据文件路径,请使用以下命令:
SQL> select * from dba_data_files ;
使用加密子句运行 CREATE TABLESPACE 语句
SQL> create TABLESPACE encrypted_ts DATAFILE '+DATA/db11g/datafile/encrypted_ts01.dbf' SIZE 5 M AUTOEXTEND on NEXT 64K ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);
ENCRYPTION USING 'AES256' ENCRYPT 子句会指定加密算法和加密的密钥长度。ENCRYPT 子句会对表空间进行加密。
如果省略 USING 子句,则加密算法默认为“AES128”。此外,必须指定 ENCRYPT 的默认存储子句。另外,您还可以设置 TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM 动态参数,以使用 ALTER SYSTEM 语句为将来的表空间创建操作定义默认加密算法:
sql> ALTER SYSTEM SET TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM = value;
值可以是以下加密算法之一:AES128、AES192、AES256、3DES168、ARIA128、ARIA192、ARIA256、SEED128 和 GOST256。默认值为 AES128。
或者,您可以将
TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM
设置为init.ora
文件中的初始化参数。如需检查是否已配置表空间加密,您可以检查 DBA_TABLESPACES 和 USER_TABLESPACES 视图的 ENCRYPTED 列,该列表示是否已加密表空间。
SQL> SELECT tablespace_name, encrypted FROM dba_tablespaces; TABLESPACE_NAME ENC ----------------------------------- SYSTEM NO SYSAUX NO UNDOTBS1 NO TEMP NO USERS NO UNDOTBS2 NO ENCRYPTED_TS YES
测试加密
SQL> CREATE TABLE test (id NUMBER(10),data VARCHAR2(50))TABLESPACE encrypted_ts; Table created. SQL> CREATE INDEX test_idx ON test(data) TABLESPACE encrypted_ts; Index created. SQL> INSERT INTO test (id, data) VALUES (1, 'Test Encryptio'); 1 row created. SQL> COMMIT; Commit complete
刷新缓冲区缓存以确保数据写入数据文件。
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
使用字符串命令读取数据文件中的数据。
export ORACLE_SID=+ASM asmcmd ASMCMD> strings +DATA/db11g/datafile/encrypted_ts01.dbf
数据以二进制格式显示。
在表列级层启用 TDE
TDE 列加密可用于加密处于保密状态的数据库表中特定列数据,例如信用卡号、社会保障号 (SSN) 和个人账号 (PAN)。
创建包含加密列的表
SQL> CREATE TABLE employee ( first_name VARCHAR2(128), last_name VARCHAR2(128), empID NUMBER ENCRYPT NO SALT, salary NUMBER(6) ENCRYPT USING '3DES168' ); Table created.
SALT
是一种加强加密数据安全性的方法。它是在数据加密之前添加到数据的随机字符串,使得明文中的重复文本在加密时看起来不同。SALT
可防范攻击者用于窃取数据的一种方法,即加密文本的匹配模式。您可以使用通过ENCRYPT
子句指定的SALT
或NO SALT
参数。您可以使用
ALTER TABLE
命令,通过添加加密列或加密已存在的列来加密现有表中的列。如需将加密列添加到数据库中的现有表,请运行以下命令:
SQL> ALTER TABLE employee ADD (credit_card_number VARCHAR2(16) ENCRYPT NO SALT); Table altered.
如需对数据库中的表的现有列进行加密,请运行以下命令:
SQL> ALTER TABLE employee MODIFY (last_name encrypt); Table altered.
如需将
SALT
添加到数据库中的表的加密列,请运行以下命令:SQL> ALTER TABLE employee MODIFY (last_name encrypt salt); Table altered.
如需解密数据库中的表的现有列,请运行以下命令:
SQL> ALTER TABLE employee MODIFY (last_name decrypt); Table altered.
如需从数据库中的表的加密列移除 SALT,请运行以下命令:
SQL> ALTER TABLE employee MODIFY (last_name encrypt no salt); Table altered.
如需更改包含一个或多个加密列的表的加密密钥,请运行以下命令:
SQL> ALTER TABLE employee rekey; Table altered.
如需更改包含一个或多个加密列的表的加密算法,请运行以下命令:
SQL> ALTER TABLE employee rekey USING '3DES168'; Table altered.
加密将来的表空间
您可以将 Oracle 数据库配置为自动加密您将使用 ENCRYPT_NEW_TABLESPACES
数据库初始化参数创建的将来的表空间。
使用以下 ALTER SYSTEM
命令:
SQL> ALTER SYSTEM SET ENCRYPT_NEW_TABLESPACES=value;
可能的值:
如果您在云场景和本地场景中均省略
CREATE TABLESPACE
的ENCRYPTION
子句,则ALWAYS
会自动使用AES128
算法或由TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM
动态参数指定的算法来加密表空间。但是,如果您提供ENCRYPTION
子句,则您指定的算法优先于AES128
。DDL
会对云环境和本地环境使用CREATE TABLESPACE
的ENCRYPTION
子句的指定设置,从而加密表空间。CLOUD_ONLY
(不适用于我们的使用场景)仅适用于 Oracle Cloud 环境。默认为CLOUD_ONLY
。
是选择 TDE 表空间加密还是 TDE 列加密?
在以下情况下选择 TDE 列加密 | 在以下情况下选择 TDE 表空间加密 |
---|---|
敏感信息的位置已知 | 敏感信息的位置未知 |
不到 5% 的应用列是加密候选项 | 大多数应用数据被视为敏感数据,或者多项国家和国际安全与隐私权法规适用于您的行业 |
TDE 列加密支持数据类型和长度 | 并非所有包含敏感信息的数据类型都受 TDE 列加密的支持 |
加密候选项不是外键列 | 加密候选项是外键列 |
加密候选项的索引是常规 B 树索引 | 加密候选项的索引是功能索引 |
应用未对加密数据执行范围扫描 | 应用会搜索敏感数据的范围 |
每个加密值将存储空间扩容 1 到 52 个字节 | 存储空间扩容不被接受 |
性能影响取决于加密列的百分比、选择或更新加密值的频率、加密数据的大小和其他变量 | 性能影响一直低于 10% |
您希望受益于硬件加密加速时 | |
您希望同时获享加密和压缩的优势时。 |
RMAN 备份加密
备份集使用 V$RMAN_ENCRYPTION_ALGORITHMS
中列出的算法进行加密。RMAN 可以透明方式加密写入备份集的数据,并在 RESTORE
操作需要时解密这些备份集。RMAN 提供三种加密模式:transparent模式、密码保护模式和双模式。
如需使用透明模式加密(默认),应使用 Oracle 加密钱包。
如果要使用密码模式,则应由将用于加密的 DBA 提供密码。您可以通过
SET ENCRYPTION ON IDENTIFIED BY password only
设置密码模式。借助双重模式加密,您可以使用 Oracle 钱包或密码进行解密。您可以通过
SET ENCRYPTION ON IDENTIFIED BY password
设置双重模式。
配置 RMAN 备份加密
设置 Oracle 钱包。
将 RMAN 配置为使用加密。
配置 RMAN 加密模式。本示例使用双模式。为此,请连接到 RMAN 目标数据库并运行
SET ENCRYPTION ON IDENTIFIED BY password
命令。[oracle@svr002 ~]$ . oraenv ORACLE_SID = [tdedb] ? DB11G The Oracle base has been changed from /u01/app/oracle to /apps/oracle/oracle_base export ORACLE_SID=DB11G1
连接到 RMAN。
rman target / RMAN> SET ENCRYPTION ON IDENTIFIED BY <password>; executing command: SET encryption
SET ENCRYPTION
将替换CONFIGURE ENCRYPTION
命令指定的加密设置,该命令默认使用透明加密。配置默认备份加密算法。
如需列出可以获取的 RMAN 加密算法,请查询
v$rman_encryption_algorithms
视图:SQL> COL algorithm_name FORMAT a15 COL algorithm_description FORMAT a15 COL is_default FORMAT a15 SQL> select algorithm_id, algorithm_name, algorithm_description, is_default from v$rman_encryption_algorithms; ALGORITHM_ID ALGORITHM_NAME ALGORITHM_DESCR IS_DEFAULT ----------- -------------- --------------- ---------- 1 AES128 AES 128-bit key YES 2 AES192 AES 192-bit key NO 3 AES256 AES 256-bit key NO
如需更改默认算法,请运行以下命令:
RMAN> CONFIGURE ENCRYPTION ALGORITHM 'AES256'; using target database control file instead of recovery catalog new RMAN configuration parameters: CONFIGURE ENCRYPTION ALGORITHM 'AES256'; new RMAN configuration parameters are successfully stored
使用常规 RMAN 备份命令进行加密备份。例如:
RMAN> backup tablespace users;
如需使用加密密码恢复备份,请运行以下命令:
RMAN> set decryption identified by <password>; RMAN> restore tablespace users;
重要注意事项
如果所需的解密密钥可用,则加密的备份会在恢复期间自动解密。每个备份集都会获得单独的密钥。密钥以加密形式存储在备份空间中。可使用用户提供的密码或 Oracle 软件密钥库获取的密钥来解密备份。
透明备份加密支持自动登录软件密钥库和基于密码的软件密钥库。使用自动登录软件密钥库时,您可以随时执行加密备份操作,因为自动登录密钥库始终处于打开状态。使用基于密码的软件密钥库时,必须先打开密钥库,然后才能执行备份加密。
如果您使用自动登录密钥库,请不要将其与加密的备份数据一起进行备份,因为如果用户同时获取加密的备份和自动登录密钥库,用户可以读取这些备份。备份 Oracle 密钥库是安全的,因为如果没有密钥库密码,就无法使用这种形式的密钥库。
如果数据库中的某些列使用透明数据加密 (TDE) 列加密进行加密,并且这些列使用备份加密进行备份,则这些列会在备份期间再次加密。在恢复操作期间解密备份集后,已加密的列会恢复为原始加密形式。
如果 Oracle 密钥库丢失,则无法恢复任何以透明方式加密的备份。此外,如果您忘记或丢失用于加密基于密码的加密备份的密码,则您将无法恢复备份。