在裸金属解决方案上部署和管理 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 hostbastion 机器连接到一个裸金属解决方案服务器。

        $ 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_LOCATIONWALLET_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 语句执行加密操作。

加密新的表空间

创建新的表空间时,您可以在创建过程中配置其加密设置。

  1. 确保用于表空间加密的兼容初始化参数为 11.2.0.0 或更高版本

    SQL> SHOW PARAMETER COMPATIBLE
    
         NAME        TYPE     VALUE
         ----        ----     ------
         compatible  string   11.2.0.4.0
    
  2. 确保您已配置 TDE 主加密密钥;您可以在前提条件部分的“创建初始主密钥”下进行检查。

  3. 创建加密表空间

    如需检查数据文件路径,请使用以下命令:

    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
    
  4. 测试加密

    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)。

  1. 创建包含加密列的表

    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 子句指定的 SALTNO 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 TABLESPACEENCRYPTION 子句,则 ALWAYS 会自动使用 AES128 算法或由 TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM 动态参数指定的算法来加密表空间。但是,如果您提供 ENCRYPTION 子句,则您指定的算法优先于 AES128

  • DDL 会对云环境和本地环境使用 CREATE TABLESPACEENCRYPTION 子句的指定设置,从而加密表空间。

  • 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 备份加密

  1. 设置 Oracle 钱包

  2. 将 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 命令指定的加密设置,该命令默认使用透明加密。

  3. 配置默认备份加密算法。

    如需列出可以获取的 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 密钥库丢失,则无法恢复任何以透明方式加密的备份。此外,如果您忘记或丢失用于加密基于密码的加密备份的密码,则您将无法恢复备份。