加密源数据库中的数据

透明数据加密 (TDE ) 透明地加密 Oracle Database 中的休息数据。它停止来自操作系统的未经授权访问存储在文件中的数据库数据的尝试,而不会影响应用程序如何使用 SQL 访问数据。 TDE 与 Oracle Database 完全集,可以加密整个数据库备份 (RMAN)、数据泵导出、整个应用程序表空间或特定敏感列。加密数据在数据库中保持加密,无论是在表空间存储文件、临时表空间、还原表空间还是重做日志等其他文件中。

对于灾难恢复,内部部署和 Oracle Cloud Infrastructure 实例中的口令必须相同。如果没有,请使用 sqlplus 命令更新密码。

确定是否在源数据库上启用 TDE

在源数据库上未启用透明数据加密 (TDE ) 时,将数据库迁移到 Oracle Cloud Infrastructure (OCI) 或灾难恢复期间不会加密数据。您需要手动加密未加密的数据。在 OCI 中,将自动加密任何新数据。

  1. 确定表空间是否已加密。
    SQL> select tablespace_name, encrypted from dba_tablespaces;

    表空间未加密时,输出将类似于以下内容:

    TABLESPACE_NAME 	       		ENC
    ------------------------------ ---
    SYSTEM                          NO
    SYSAUX                          NO
    UNDOTBS1                        NO
    TEMP                            NO
    USERS			      NO
  2. 在文件系统中查找关联的数据库数据文件 (.dbf)。
    SQL> select TABLESPACE_NAME, FILE_NAME from dba_data_files;

    输出将类似于以下内容:

    TABLESPACE_NAME
    ------------------------------
    FILE_NAME
    
    SYSTEM
    /opt/oracle/oradata/ORCLCDB/system01.dbf
    
    SYSAUX
    /opt/oracle/oradata/ORCLCDB/sysaux01.dbf
    
    UNDOTBS1
    /opt/oracle/oradata/ORCLCDB/undotbs01.dbf
    
    USERS
    /opt/oracle/oradata/ORCLCDB/users01.dbf

在源数据库上启用 TDE 加密

使用透明数据加密 (Transparent Data Encryption, TDE ) 可以加密存储在表和表空间中的敏感数据。对于有权访问数据的数据库用户或应用程序,将以透明方式解密加密数据。

  1. 转到源数据库中的$ORACLE_BASE 目录。
    bash-4.2$ pwd
    /opt/oracle/admin/ORCLCDB
  2. 创建名为 wallet 的目录。
    $ mkdir wallet
  3. 创建 Wallet 以及使用字母数字字符组合的安全口令。
    此步骤将创建并打开 Wallet。打开数据库后,Wallet 将保持打开状态,直到显式关闭 Wallet 或关闭数据库,然后 Wallet 将自动关闭。
    SQL> alter system set encryption key identified by "wallet_password";
  4. 重新启动数据库后重新打开已关闭的 wallet。
    SQL> alter system set wallet open identified by "wallet_password";
  5. 加密表空间。
    以下代码使用 AES-128 加密。
    alter tablespace system encryption online using 'aes128' encrypt file_name_convert=('/opt/oracle/oradata/ORCLCDB/system01.dbf','/opt/oracle/oradata/ORCLCDB/system01_enc.dbf');
    
    alter tablespace sysaux encryption online using 'aes128' encrypt file_name_convert=('/opt/oracle/oradata/ORCLCDB/sysaux01.dbf','/opt/oracle/oradata/ORCLCDB/sysaux01_enc.dbf');
    
    alter tablespace undotbs1 encryption online using 'aes128' encrypt file_name_convert=('/opt/oracle/oradata/ORCLCDB/undotbs01.dbf','/opt/oracle/oradata/ORCLCDB/undotbs01_enc.dbf');
    
    alter tablespace users encryption online using 'aes128' encrypt file_name_convert=('/opt/oracle/oradata/ORCLCDB/users01.dbf','/opt/oracle/oradata/ORCLCDB/users01_enc.dbf');
    
  6. 验证表空间是否已加密。
    SQL> select tablespace_name, encrypted from dba_tablespaces;

    输出将类似于以下内容:

    TABLESPACE_NAME 	       ENC
    ------------------------------ ---
    SYSTEM			    YES
    SYSAUX			    YES
    UNDOTBS1                       YES
    TEMP			      NO
    USERS			     YES
  7. 验证文件系统上的关联数据库数据文件 (.dbf) 是否已加密。
    SQL> select TABLESPACE_NAME, FILE_NAME from dba_data_files;

    输出将类似于以下内容:

    TABLESPACE_NAME
    ------------------------------
    FILE_NAME
    
    SYSTEM
    /opt/oracle/oradata/ORCLCDB/system01_enc.dbf
    
    SYSAUX
    /opt/oracle/oradata/ORCLCDB/sysaux01_enc.dbf
    
    UNDOTBS1
    /opt/oracle/oradata/ORCLCDB/undotbs01_enc.dbf
    
    USERS
    /opt/oracle/oradata/ORCLCDB/users01_enc.dbf

在源数据库上创建 Wallet

请创建一个 Wallet 以及一个安全的口令。

  1. 请在主内部部署数据库的节点 1 上运行以下命令以创建 Wallet:
    SQL>
            ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/admin/db1/wallet/' IDENTIFIED BY
            "wallet-password";
    ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE
            '/u01/app/oracle/admin/db1/wallet/' IDENTIFIED BY "wallet-password";
    SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE
            OPEN IDENTIFIED BY "wallet-password";
    SQL> ADMINISTER KEY MANAGEMENT SET
            KEY USING TAG 'master_key' IDENTIFIED BY "wallet-password” WITH BACKUP USING
            'masterbackup';
    SQL> SELECT KEY_ID,creation_time,activation_time,tag FROM V$ENCRYPTION_KEYS;
  2. 显示加密 Wallet 参数。
    SQL> select * from v$encryption_wallet;

    输出应类似于以下内容:

    WRL_TYPE
    --------------------
    WRL_PARAMETER
    --------------------------------------------------------------------------------
    STATUS       WALLET_TYPE    WALLET_OR KEYSTORE 
    FULLY_BAC
    ------------------------------ -------------------- --------- --------  ---------
        CON_ID
    ----------
    FILE
    /u01/app/oracle/admin/db1/wallet/
    OPEN       AUTOLOGIN    SINGLE    NONE     NO
  3. 请检查 Wallet 位置。
    [oracle@exa11db01 wallet]$ ls -lrttotal

    输出应类似于以下内容:

    total 20
    -rw------- 1 oracle dba 2987 Feb  2 15:37 ewallet_2021020223374667_masterbackup.p12
    -rw------- 1 oracle dba 5419 Feb  2 15:37 ewallet.p12
    -rw------- 1 oracle dba 5464 Feb  2 15:37 cwallet.sso
  4. 请将 Wallet 文件复制到内部部署实例的第二个节点。
    [oracle@exa11db01 wallet]$ scp *.* exa11db02:/u01/app/oracle/admin/db1/wallet/

    输出应类似于以下内容:

    cwallet.sso                                        100% 5464     8.7MB/s   00:00    
    ewallet_2021020223374667_masterbackup.p12          100% 2987    12.1MB/s   00:00    
    ewallet.p12                                         100% 5419    18.2MB/s   00:00 
  5. 在节点 1 上,获取数据库状态。
    [oracle@exa11db01 db1]$ srvctl status database -d db1

    输出应类似于以下内容:

    Instance db11 is running on node exa11db01
    Instance db12 is running on node exa11db02
  6. 在节点 1 上,停止并启动数据库以完成 Wallet 设置。
    [oracle@exa11db01 db1]$ srvctl stop database -d db1
    [oracle@exa11db01db1]$ srvctl start database -d db1
  7. 创建加密的表空间。
    以下代码使用 aes128 加密设置加密的表空间:
    alter tablespace system encryption online using 'aes128' encrypt;
    alter tablespace sysaux encryption online using 'aes128' encrypt;
    alter tablespace undotbs1 encryption online using 'aes128' encrypt;
    alter tablespace undotbs2 encryption online using 'aes128' encrypt;
    alter tablespace users encryption online using 'aes128' encrypt;
  8. 验证表空间名称和 dbf 是否已加密。
    SQL> select tablespace_name, encrypted from dba_tablespaces;

    加密时,文件具有不同的序列号。

在备份数据库上创建 Wallet

在备份 Oracle Database Exadata Cloud Service 的每个节点上创建 Wallet。Wallet 在每个节点上必须相同。

  1. 在 OCI 上的备份数据库中,检查 Wallet 文件位置。
    SQL> select * from V$ENCRYPTION_WALLET;
  2. 将 Wallet 文件从内部部署源数据库复制到云中的备份数据库。
    [oracle@exa11db01 ~]$ scp -i FedExKey.ssh /u01/app/oracle/admin/db1/wallet/*.* 
    opc@10.255.195.131:/tmp/
  3. 验证 Wallet 是否显示在 Oracle Database Exadata Cloud Service 的目录中。
    [oracle@exacs82-vm3sv1 admin]$ cd /var/opt/oracle/dbaas_acfs/DB1/wallet_root/tde
    [oracle@exacs82-vm3sv1 tde]$ ls -lrt

    输出应类似于以下内容:

    total 72
    drwxr-xr-x 2 oracle oinstall 20480 Jan 23 13:50 Backup
    -rwxr-xr-x 1 oracle oinstall  5419 Feb  3 13:38 ewallet.p12
    -rwxr-xr-x 1 oracle oinstall  2987 Feb  3 13:38 ewallet_2021020223374667_masterbackup.p12
    -rw------- 1 oracle oinstall  5464 Feb  3 13:39 cwallet.sso
  4. 将 wallet 文件复制到第二个节点。