在 Bare Metal 解決方案上部署及管理 Oracle 透明資料加密 (TDE)

本頁面說明如何在 Bare Metal 解決方案中部署 Oracle Advanced Security 透明資料加密 (TDE) 機制,以及管理 Oracle 錢包和金鑰。

總覽

Oracle Advanced Security TDE 會以透明方式加密 Oracle 資料庫中的靜態資料,並防止未經授權存取資料庫檔案。TDE 可為整個資料庫備份 (RMAN) 和資料傳輸匯出作業,以及特定的資料表空間和資料欄位加密。

透明資料加密功能的運作方式

TDE 會建立及管理用於加密的多個金鑰。這些金鑰必須受到保護,因為如果攻擊者取得加密資料和相符的金鑰,就能輕易解密,查看明文資料。

TDE 採用雙層金鑰架構,其中資料加密金鑰會由單一資料庫主金鑰包裝。主金鑰與加密資料分開,儲存在資料庫之外,可為 Oracle 軟體金鑰庫錢包或硬體安全性模組 (HSM) 金鑰庫,並由金鑰庫中的資料庫安全性管理員直接管理。

TDE 提供兩種 KeyStore 選項,可支援各種客戶環境。根據預設,TDE 會將主金鑰儲存在 Oracle Wallet 中,這是以 PKCS#12 標準為基礎的金鑰儲存檔案。錢包可為少量加密資料庫提供簡單的解決方案。

在 Bare Metal 解決方案伺服器上啟用 Oracle 資料庫 11g 的 TDE:

您可以在資料欄層級和表格空間層級執行加密作業。您也可以在 RMAN 備份上套用 TDE。

啟用 TDE 先決條件

您必須設定金鑰庫 (11g 為 Oracle Wallet) 並建立初始主金鑰,以便準備資料庫。

在 Bare Metal 解決方案伺服器中設定 Oracle 錢包

  • 透過專案中的 jump hostbastion 機器,連線至其中一個 Bare Metal 解決方案伺服器。

        $ 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. 建立加密的 tablespace

    如要查看資料檔案路徑,請使用以下指令:

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

    使用「AES256」加密的加密功能會指定加密演算法和加密金鑰長度。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。

    或者,您也可以在 init.ora 檔案中將 TABLESPACE_ENCRYPTION_DEFAULT_ALGORITHM 設為初始化參數。

    如要確認是否已設定表格空間加密功能,您可以查看 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

資料表資料欄加密功能可用於加密資料表中機密的特定資料欄資料,例如信用卡號碼、身分證字號 (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 資料欄加密功能?

CHOOSE TDE COLUMN ENCRYPTION IF 選擇 TDE 表格空間加密功能
知道機密資訊的位置 私密資訊的位置不明
應用程式資料欄中只有不到 5% 是加密候選項目 大部分的應用程式資料都屬於機密資料,或是您的產業適用多項國家和國際安全性與隱私權法規
TDE 資料欄加密功能支援資料類型和長度 TDE 資料欄加密功能不支援所有含有機密資訊的資料類型
加密候選項目並非外鍵欄 加密候選項目為外鍵欄
加密候選項目的索引是一般 B-tree 索引 加密候選項目的索引是功能索引
應用程式未對加密資料執行區間掃描 應用程式搜尋機密資料的範圍
每個加密值的儲存空間增加 1 到 52 個位元組 無法接受儲存空間增加
效能影響取決於加密資料欄的百分比、加密值的選取或更新頻率、加密資料的大小和其他變數 持續性的效能影響低於 10%
如要享有硬體加密加速功能的優勢
如要同時享有加密和壓縮的優點。

RMAN 備份加密

備份組合會使用 V$RMAN_ENCRYPTION_ALGORITHMS 中列出的演算法進行加密。RMAN 可將寫入備份集的資料進行透明加密,並在 RESTORE 作業中解密這些備份集。RMAN 提供三種加密模式:透明密碼保護雙模式

  • 如要使用透明模式加密 (預設),請使用 Oracle 加密錢包。

  • 如要使用密碼模式,資料庫管理員必須提供密碼,以便用於加密。您可以透過 SET ENCRYPTION ON IDENTIFIED BY password only 設定密碼模式。

  • 使用雙模式加密功能時,您可以使用 Oracle 錢包或密碼進行解密。您可以透過 SET ENCRYPTION ON IDENTIFIED BY password 設定雙重模式。

設定 RMAN 備份加密

  1. 設定 Oracle Wallet

  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 軟體金鑰庫取得的金鑰進行解密。

  • 透明備份加密功能支援自動登入軟體 KeyStore 和密碼式軟體 KeyStore。使用自動登入軟體金鑰庫時,由於自動登入金鑰庫一律處於開啟狀態,因此隨時都能執行加密備份作業。使用密碼式軟體 KeyStore 時,必須先開啟 KeyStore,才能執行備份加密作業。

  • 如果您使用自動登入金鑰庫,請勿將其與加密的備份資料一併備份,因為如果使用者同時取得備份和自動登入金鑰庫,便可讀取加密備份。備份 Oracle 金鑰庫是安全的,因為如果沒有金鑰庫密碼,就無法使用這類金鑰庫。

  • 如果資料庫中的部分資料欄使用透明資料加密 (TDE) 資料欄加密功能加密,且這些資料欄使用備份加密功能進行備份,則系統會在備份期間再次加密這些資料欄。在還原作業期間解密備份組時,系統會將已加密的資料欄還原為原始加密形式。

  • 如果 Oracle 金鑰庫遺失,您將無法還原任何經過透明加密的備份。此外,如果您忘記或遺失用來加密密碼加密備份的密碼,就無法還原備份。