この記事では、既存のテーブルに対して透過的暗号化を有効にする方法について説明します。
OceanBaseデータベースの暗号化は、形式上できるだけOracleデータベースと互換性を持たせており、データの暗号化単位はテーブルスペース(Tablespace)です。OceanBaseデータベースは複数のデータファイルを扱うシステムではなく、テーブルスペースは互換性を確保するために設計されています。
この記事では、暗号化されたテーブルスペースsectest_ts1上の既存テーブルt1に対して暗号化を有効にする例を挙げ、透過的暗号化の操作手順を説明します。
internal方式の透過的データ暗号化を設定する
internal方式ではストレージマスタープライマリキーが使用され、その暗号情報は主に内部テーブルで管理されます。ログ再生時の循環依存を避けるため、このモードではclogは暗号化されません。
管理者ユーザーがクラスタのOracleテナントにログインします。
以下のステートメントを実行して、internal方式の透過的データ暗号化を有効にします。
パラメータ
tde_methodは、透過的テーブル領域暗号化の方式を設定するために使用されます。デフォルトはnoneであり、これは透過的テーブル領域暗号化が無効であることを示します。パラメータ
tde_methodの詳細については、tde_method を参照してください。注意
パラメータ
tde_methodは一度設定すると、変更できなくなります。obclient> ALTER SYSTEM SET tde_method='internal';以下のステートメントを実行して、このテナント上のすべてのOBServerノードのパラメータ
tde_methodの値がinternalであることを確認します。obclient> SHOW PARAMETERS LIKE 'tde_method';Keystoreを作成します。
SQLステートメントは以下のとおりです:
obclient>ADMINISTER KEY MANAGEMENT CREATE KEYSTORE keystore_name IDENTIFIED BY password;例:
obclient> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE sectest1 IDENTIFIED BY **3**;Keystoreを有効にします。
SQLステートメントは以下のとおりです:
obclient> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY password;ここで、
passwordは前のステップで設定したKeystoreの鍵です。例:
obclient> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY **3**;以下のステートメントを実行して、マスタープライマリキーを生成します。
obclient> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY password;ステートメント内の
passwordは、以前に設定したKeystoreの鍵です。例:
obclient> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY **3**;テーブル領域を作成し、暗号化アルゴリズムを指定します。
暗号化アルゴリズムとして
aes-256、aes-128、aes-192、sm4-cbc、aes-128-gcm、aes-192-gcm、aes-256-gcm、sm4-gcmを指定できます。例:
obclient> CREATE TABLESPACE sectest_ts1 ENCRYPTION USING 'aes-256';
既存のテーブルを暗号化テーブルスペースに移動する
一般ユーザーがデータベースのOracleテナントにログインします。
テーブル
t1をテーブルスペースsectest_ts1に移動します。obclient> ALTER TABLE t1 TABLESPACE sectest_ts1;インデックステーブルを修正し、テーブル上のインデックスをテーブルスペース
sectest_ts1に追加します。例:
obclient> ALTER INDEX idx1 TABLESPACE sectest_ts1;
テーブルの透過的暗号化
一般ユーザーがデータベースのOracleテナントにログインします。
テーブルの
progressive_merge_numの値を設定し、テーブルに対してフルコンパクションまたは段階的コンパクションを実行します。progressive_merge_numは、テーブルの段階的コンパクションの回数を設定するために使用されます。デフォルト値は0であり、増分コンパクションを実行することを意味します。値を1に設定すると、フルコンパクションを実行することを意味します。テーブルに対してコンパクション操作を実行する際、通常はフルコンパクション方式を使用します。ただし、テーブル内のデータ量が非常に大きい場合、フルコンパクションを有効にすると、単一のコンパクション時間が長くなる可能性があるため、段階的コンパクションを使用することを推奨します。
テーブルに対してフルコンパクションを実行する
progressive_merge_numの値を1に設定します。obclient> ALTER TABLE t1 set progressive_merge_num = 1;手動で1ラウンドのコンパクションを開始します。
手動でコンパクションを開始する操作については、手動でコンパクションをトリガーするを参照してください。
説明
テーブルに対してフルコンパクションを実行した後、フルコンパクションが完了するまで待機します。すべてのテーブルデータの暗号化が完了したら、
V$OB_ENCRYPTED_TABLESビューを確認することで、暗号化の完了状況を直接確認できます。コンパクションが完了したら、
progressive_merge_numの値を0に設定します。obclient> ALTER TABLE t1 set progressive_merge_num = 0;
テーブルに対して段階的コンパクションを実行する
progressive_merge_numの値を1より大きい数に設定し、SHRINK SPACE操作を実行して、段階的コンパクションの準備をします。例:
obclient> ALTER TABLE t1 set progressive_merge_num = 3; obclient> ALTER TABLE t1 SHRINK SPACE;手動で複数ラウンドの段階的コンパクションを開始し、テーブルおよびその上のインデックスのすべての既存マクロブロックの暗号化を完了させます。
1ラウンドの段階的コンパクションを開始するステートメントは以下のとおりです:
obclient> ALTER SYSTEM MAJOR FREEZE;説明
段階的コンパクション中は、
V$OB_ENCRYPTED_TABLESビューを照会することで、暗号化の完了状況をリアルタイムで確認できます。
完了後、以下のビューを確認して、すべてのマクロブロックが暗号化されているかどうかを確認できます。
obclient> SELECT * FROM V$OB_ENCRYPTED_TABLES; +----------+------------+---------------+---------------+-----------+----------------------------------+-------------+------------------+------------------+--------+--------+ | TABLE_ID | TABLE_NAME | TABLESPACE_ID | ENCRYPTIONALG | ENCRYPTED | ENCRYPTEDKEY | MASTERKEYID | BLOCKS_ENCRYPTED | BLOCKS_DECRYPTED | STATUS | CON_ID | +----------+------------+---------------+---------------+-----------+----------------------------------+-------------+------------------+------------------+--------+--------+ | 500005 | T1 | 500004 | aes-256 | YES | xxxxxxxxxxxxxxxxxxxxxxxxxxxx66F3 | xxxx03 | 0 | 0 | NORMAL | 1010 | +----------+------------+---------------+---------------+-----------+----------------------------------+-------------+------------------+------------------+--------+--------+ 1 row in setクエリ結果に基づいて、
BLOCKS_DECRYPTEDフィールドの値が0であれば、すべてのマクロブロックが暗号化されていることを意味します。ビュー
V$OB_ENCRYPTED_TABLESの他のフィールドとその説明については、V$OB_ENCRYPTED_TABLESを参照してください。