Oracle Exadata Cloud Serviceで顧客が管理するTDE暗号化キーを使用する方法 (2021/07/19)
Oracle Exadata Cloud Serviceで顧客が管理するTDE暗号化キーを使用する方法 (2021/07/19)
はじめに
Oracle CloudのOracle Databaseは、デフォルトでTransparent Data Encryption (TDE)を使用して、静止状態のデータを保護しています。デフォルトの構成「Oracle-Managed Keys」では、マスター暗号化キーをデータベースサーバー上のローカルなウォレットファイルに保存します。今回、オラクルはOCI Vault Serviceとの統合をサポートし、TDEのマスター暗号化キーを作成・管理したり、既存の暗号化キーをインポートしたりすることができるようになりました。
OCI Vaultは、高可用性、耐久性、および管理されたサービスを提供し、中央の場所からすべてのキーを作成および管理します。
OCI VaultとOracle Key Vault(OKV)を混同しないでください。
- OCI Vault:暗号化キーを管理するクラウドサービス
- Oracle Key Vault (OKV): 暗号化キーを管理するフルスタックのソフトウェア・アプライアンス
このブログ記事では、顧客管理キーを使用するデータベースを作成する方法と、既存のデータベースのキー管理をオラクル管理キー(ローカルウォレットを使用)から顧客管理キー(OCI Vaultを使用)に変更する方法をご紹介します。
環境について
- Exadata Cloud Service(ExaCS)X7-2クォーターラック
- Oracle Databaseバージョン19.11(マルチテナント・アーキテクチャ使用時)
準備編
ステップ1: Vaultと暗号化キーの作成
Cloud Consoleから「Vault」を検索し、「Identity & Security」にある「Vault」サービスをクリックします。
「Create Vault」をクリックし、Vault の名前を入力して、Vault を作成します。Vault がアクティブになったら、Vault の名前をクリックして Vault の詳細を確認します。
「キーの作成」をクリックして、鍵の名前を入力し、TDE の顧客管理キーでサポートされている唯一の暗号化アルゴリズムである AES 256 を選択します。
キーを作成します。キーは数秒後に利用可能になります。
Step 2: OCI Vault 内のキーへのアクセスを Exadata Database リソースに許可
VM Cluster detailsページからExadata VM Cluster OCIDを取得します。
VMクラスタOCIDをリソースとして提供する動的グループを作成します。
Any { resource.id = 'ocid1.cloudvmcluster.oc1.phx.abyhqljrxrwolxhj6cqu7ymberiakbj3hj2fwt7hfwlfppeapreaajv3jqna' }.
Dynamic Group のメンバーが OCI Vault のキーにアクセスできるようにするためのポリシーを作成します。
allow dynamic-group Vault_DG to manage keys in tenancy
ステップ 3: Oracle Services Network へのアクセスを許可
Oracle Services Network へのイグレス・トラフィックを許可するように Exadata クライアントのサブネット・セキュリティ・リストを構成します。ルート・テーブルには、サービス・ゲートウェイを経由して Oracle Services Network にトラフィックを転送するルールが設定されている必要があります。
ステップ 4: dbaastools を最新版にアップデート
ユーザーrootでExadata仮想マシンにログインし、以下のコマンドを実行して、dbaastoolsを最新版にアップデートします。
sudo -s
rpm -qa | grep dbaas
dbaascli patch tools list
dbaascli patch tools apply --patchid LATEST
新しいデータベースの作成
新しいデータベースにカスタマーマネージメントキーを使用するには、詳細オプションにスクロールダウンし、「暗号化」タブをクリックし、「カスタマーマネージメントキーを使用する」を選択し、Vaultと以前作成したキーを選択します。
OK、とても簡単でしたね。それでは、Oracle-managed keysを使用している場合のTDEの構成を見てみましょう。キーマネージメントをcustomer-managed keysに変更し、TDEの構成に変更が適用されていることを確認してください。
既存のデータベースのキー管理タイプの変更
変更の前に
キー管理タイプを変更する前に、データベースがoracle-managed keys (local wallet file)を使用している場合の現在の構成を見てみましょう。
-- formatting
set
lines 300
set
pages 100
col
name
for
a20
col wrl_type
for
a10
col status
for
a15
col wallet_order
for
a15
col key_id
for
a60
col keystore_type
for
a20
col origin
for
a20
col encryptionalg
for
a15
col encryptedts
for
a15
col inst_id
for
999
col value
for
a60
-- status of the wallet and the wallet location
SQL>
select
p.con_id, p.
name
, p.open_mode, ew.wrl_type, ew.wallet_type, ew.status, ew.wallet_order
from
v$pdbs p
join
v$encryption_wallet ew
on
(ew.con_id = p.con_id)
order
by
p.con_id;
CON_ID
NAME
OPEN_MODE WRL_TYPE WALLET_TYPE STATUS WALLET_ORDER
---------- --------------- ---------- ---------- -------------------- --------------- ---------------
2 PDB$SEED
READ
ONLY
FILE AUTOLOGIN
OPEN
SINGLE
3 PDB1
READ
WRITE FILE AUTOLOGIN
OPEN
SINGLE
-- master encryption key description attributes
SQL>
select
con_id, key_id, keystore_type, origin
from
v$encryption_keys;
CON_ID KEY_ID KEYSTORE_TYPE ORIGIN
---------- ------------------------------------------------------------ -------------------- --------------------
1 ASFX5KQeDE9mvwJzKyhBtD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA SOFTWARE KEYSTORE
LOCAL
3 AfuItHCV5k/Fv1BsWpeHJgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA SOFTWARE KEYSTORE
LOCAL
-- encrypted tablespaces
SQL>
select
t.con_id, t.
name
, et.encryptionalg, et.encryptedts, et.encryptedkey
from
v$tablespace t
join
v$encrypted_tablespaces et
on
(t.ts# = et.ts#)
order
by
t.con_id,
name
;
CON_ID
NAME
ENCRYPTIONALG ENCRYPTEDTS ENCRYPTEDKEY
---------- --------------- --------------- --------------- ----------------------------------------------------------------
1 SYSAUX AES128 YES 0D9F8565ACC8FA55F9622697FE362D4E00000000000000000000000000000000
1 SYSTEM AES128 YES 9E1C0695053E874930B89C69681807DB00000000000000000000000000000000
. ......
-- wallet path and configuration
SQL>
select
name
, value
from
v$parameter
where
name
in
(
'wallet_root'
,
'tde_configuration'
);
NAME
VALUE
-------------------- ------------------------------------------------------------
wallet_root /var/opt/oracle/dbaas_acfs/CDB1911/wallet_root
tde_configuration keystore_configuration=FILE
-- content of sqlnet.ora
cat $ORACLE_HOME/network/admin/CDB1911/sqlnet.ora
ENCRYPTION_WALLET_LOCATION =
(SOURCE=
(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=/var/opt/oracle/dbaas_acfs/CDB1911/wallet_root/tde)))
-- content of the wallet directory
ls -ltr /var/opt/oracle/dbaas_acfs/CDB1911/wallet_root/tde
-rw
------- 1 oracle oinstall 5467 Jul 15 07:14 ewallet.p12 --password wallet
-rw
------- 1 oracle oinstall 5512 Jul 15 07:14 cwallet.sso --auto login wallet
キーの管理タイプを変更してCustomer-Managed Keysを使用する
データベースの詳細ページから、「その他のアクション」をクリックし、「暗号化キーの管理」をクリックします。
「キー管理タイプの変更」をクリックし、「顧客が変更したキーを使用する」を選択し、Vaultと以前作成したキーを選択します。
「Apply」をクリックします。データベース名を入力して 「Change Key Management Type」をクリックすると、変更を確認するメッセージが表示されます。
操作が完了するまで、データベースはUI上で「更新中」の状態になります。
一方、気になる方は、バックグラウンドでデータベースのアラートログを監視することができます。
tail -f /u02/app/oracle/diag/rdbms/cdb1911_phx1qn/CDB19111/trace/alert_CDB19111.log
お客様が管理するキーへの変換には、合計で約15分かかります。キーの管理を変更すると、すべてのデータベースインスタンスが再起動されるため、データベースが利用できなくなります。操作が正常に完了すると、UIに変更が反映されます。UIに変更が反映されるまで、さらに数秒かかります。
変更後
それでは、新しいTDEの設定を見て、何が変更されたかを確認してみましょう。
ウォレットの状態と、ウォレットの場所
プライマリウォレットである「OKV」ウォレットを追加しています。
しかし、これは少し混乱しています。私たちはOKV(Oracle Key Vault)ではなく、OCI Vaultサービスを使用しているからです。これらは2つの全く異なるものです。
別のデータベース(CDBではないバージョン12.1)では、ウォレットタイプは「HSM」と表示されていますが、これはOCI Vaultにとってより正しい値だと私は思います。
マスター暗号化キーの記述属性
マスター暗号化キーがローテーションされたため、KEY_IDが変更されています。キーの詳細ページで、OCI Vault Keyに対して新しいキーのバージョンが自動的に作成されているのがわかります。
暗号化されたテーブルスペース
テーブルスペースの暗号化キーは変更されていますが、暗号化アルゴリズムはAES128のままです。つまり、これはマスターの暗号化キーがAES256であることとは無関係です。
ウォレットのパスと設定
wallet_rootはそのままですが、tde_configurationは "FILE "ではなく "OKV|FILE "になりました。
sqlnet.ora
sqlnet.oraのMETHODも "OKV "になります。ここでもCDB 12.1以外のデータベースでは "HSM "となりました。
ウォレット・ディレクトリの内容
パスワードウォレット(ewallet.p12)とオートログインウォレット(kwallet.sso)の両方が残っています。ewallet.p12にはキーが残っています。
cd
/var/opt/oracle/dbaas_acfs/CDB1911/wallet_root/tde
orapki wallet display -wallet .
/ewallet
.p12
...
ORACLE.SECURITY.DB.ENCRYPTION.AfuItHCV5k
/Fv1BsWpeHJgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORACLE.SECURITY.DB.ENCRYPTION.ASFX5KQeDE9mvwJzKyhBtD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
...
では、OCI Vaultのキーが使われているかどうかを確認するにはどうすればよいのでしょうか。これは非常に簡単です。ewallet.p12のパスワードウォレットの名前を変更し、データベースを再起動します。自動ログイン用のウォレットが使われているので、再起動は成功します。
新しいテーブルスペースの作成も成功します。
追加のプラグイン式データベースの作成
PDB$SEEDから新しいプラグイン式データベースを作成する場合、新しいPDBにはマスター暗号化キーがありません。
SQL>
create
pluggable
database
PDB2 admin
user
pdbadmin identified
by
MyAdminPW__22;
Pluggable
database
created.
SQL>
alter
pluggable
database
PDB2
open
instances=
all
;
Pluggable
database
altered.
SQL>
alter
session
set
container = PDB2;
Session altered.
SQL>
select
key_id, keystore_type, origin
from
v$encryption_keys;
no
rows
selected
新しいマスター暗号化キーを作成します。
SQL> ADMINISTER
KEY
MANAGEMENT
SET
KEY
FORCE
KEYSTORE IDENTIFIED
BY
MyWalletPW__11
WITH
BACKUP;
keystore altered.
SQL>
select
key_id, keystore_type, origin
from
v$encryption_keys;
KEY_ID KEYSTORE_TYPE ORIGIN
---------------------------------------- -------------------- --------------------
06AD09A1F0E7014F21BF9F2150E312A6D5 OKV
LOCAL
コマンドが実行されている間、UIでは新しいバージョンのキーが作成されているのがわかります。
ローカルPDBクローニングも同じ方法で行います。
SQL> create pluggable database PDB3 from PDB1 keystore identified by "MyWalletPW__11";
Pluggable database created.
リモートPDBクローニングでは、ターゲットCDBもOCI Vaultを使ってキーマネージメントを行い、同じOCI Vaultキーを使用する必要があります。ターゲットCDBのキー管理を変更する場合は、ソースCDBで使用しているのと同じキーを選択する必要があります。操作中、新しいキーバージョンが作成されます。
-- on source CDB
SQL>
grant
create
session, sysoper
to
C##SYSOPER identified
by
MySYSoperWP__11 container=
all
;
Grant
succeeded.
-- on target CDB
SQL>
create
database
link DBLINK_TO_B
connect
to
C##SYSOPER identified
by
MySYSoperWP__11 using
'(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.2.2)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = CDB1911B_phx1n8.exacsdns.exavcn.oraclevcn.com)))'
;
Database
link created.
SQL>
create
pluggable
database
PDB1RC
from
PDB1@DBLINK_TO_B keystore identified
by
"MyWalletPW__11"
;
Pluggable
database
created.
その他の検討事項
バックアップから新しいデータベースを作成
通常、クラウドツーリングを使用して、バックアップから新しいデータベースを作成することができます。ただし、データベースのキー管理にOCI Vaultを使用している場合は、お客様が変更したキーで暗号化されたバックアップはインプレースリストアにしか使用できません。
ADMINISTER KEY MANAGEMENT SQL コマンドを使用したキーのエクスポート
ADMINISTER KEY MANAGEMENT SQL コマンドは、ウォレットからのキーのエクスポートにのみ使用できますが、OKV や OCI Vault からは使用できません。
SQL> administer key management export keys with secret "MySecretPW__11" to '/home/oracle/cdb.key' force keystore identified by "MyWalletPW__11";
ORA-46650: cannot retrieve information for a master key identifier
このような場合は、まず外部のキーストアからマイグレーションバックする必要があります。
外部のキーストアからのマイグレーションバック
顧客管理キーからOracle管理キーへの移行機能は、クラウドツーリングでは提供されていません。しかし、このドキュメントに従えば、OCI Vaultからローカルウォレットに再び移行することができます。この操作の間も、データベースは利用可能です。
-- edit the keystore directory location on all nodes, set METHOD=FILE
vi $ORACLE_HOME/network/admin/CDB1911/sqlnet.ora
ENCRYPTION_WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /var/opt/oracle/dbaas_acfs/CDB1911/wallet_root/tde/)
)
)
SQL>
alter
system
set
tde_configuration=
'KEYSTORE_CONFIGURATION=FILE'
scope=both sid=
'*'
;
System altered.
-- reverse migrate the keystore, execute on one node
SQL> ADMINISTER
KEY
MANAGEMENT
SET
ENCRYPTION
KEY
IDENTIFIED
BY
"MyWalletPW__11"
REVERSE MIGRATE USING
"SYS:MyWalletPW__11"
WITH
BACKUP;
keystore altered.
-- restart the database instances on all other nodes to reflect the change
srvctl stop instance -db CDB1911_phx1qn -instance CDB19112
srvctl start instance -db CDB1911_phx1qn -instance CDB19112
SQL>
select
p.con_id, p.
name
, p.open_mode, ew.wrl_type, ew.wallet_type, ew.status, ew.wallet_order
from
v$pdbs p
join
v$encryption_wallet ew
on
(ew.con_id = p.con_id)
order
by
p.con_id;
CON_ID
NAME
OPEN_MODE WRL_TYPE WALLET_TYPE STATUS WALLET_ORDER
---------- --------------- ---------- ---------- -------------------- ---------- ---------------
2 PDB$SEED
READ
ONLY
FILE
PASSWORD
OPEN
SINGLE
3 PDB1
READ
WRITE OKV OKV
OPEN
SECONDARY
3 PDB1
READ
WRITE FILE
PASSWORD
OPEN
PRIMARY
-- password wallet is the primary now
-- change the keystore password if required (do not change the password if you want to "reverse reverse migrate", check next topic below)
SQL> ADMINISTER
KEY
MANAGEMENT
ALTER
KEYSTORE
PASSWORD
IDENTIFIED
BY
"MyWalletPW__11"
SET
"MyWalletPW__22"
WITH
BACKUP USING
'pwd_change'
;
keystore altered.
-- export the master encryption key
SQL> administer
key
management export keys
with
secret
"MySecretPW__22"
to
'/home/oracle/cdb.key'
force
keystore identified
by
"MyWalletPW__22"
;
keystore altered.
これはクラウドツールの外での手動操作であるため、変更内容はクラウドのコントロールプレーンには同期されず、UIには「顧客が管理するキー」が表示されたままになることに留意してください。
"リバース・リバース・マイグレート"
再びOCI Vaultに戻りたい場合はどうすればよいでしょうか。クラウドコンソールにはそのためのオプションはありませんが、dbaascliというコマンドラインツールを使って実現できます。また、クラウドのコントロールプレーンから見ると、データベースはOCI Vaultを使用していることを忘れないでください。
この操作中は、すべてのデータベースインスタンスが再起動されるため、データベースは利用できなくなります。完了までには5~7分程度かかります。
注:データベース名は、TDEパスワードを含む/var/opt/oracle/dbaas_acfs/CDB1911/db_wallet/にあるdbウォレット(cwallet.sso)を見つけるために、大文字でなければなりません。このため、dbaascliコマンドでTDEのパスワードを指定する必要はありません。
-- as root user
KEY_OCID=ocid1.key.oc1.phx.bbqccvs3aafqw.abyhqljr7pca4v7beztarxj2kd6ekhwp5h3nco65wl6n5csp6emluegjvdbq
DBNAME=CDB1911
dbaascli tde file_to_hsm --kmsKeyOCID $KEY_OCID --dbname $DBNAME --precheckOnly
yes
dbaascli tde file_to_hsm --kmsKeyOCID $KEY_OCID --dbname $DBNAME --precheckOnly no
# if you changed the password during reverse migrate, then:
# set it back to the original value using "dbaascli tde changePassword --dbname $DBNAME", this will update the db wallet as well.
# or revert it back in the database: ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD IDENTIFIED BY MyWalletPW__22 SET MyWalletPW__11 WITH BACKUP;
そして今、OCI Vaultは再びプライマリーになりました。
select
p.con_id, p.
name
, p.open_mode, ew.wrl_type, ew.wallet_type, ew.status, ew.wallet_order
from
v$pdbs p
join
v$encryption_wallet ew
on
(ew.con_id = p.con_id)
order
by
p.con_id;
CON_ID
NAME
OPEN_MODE WRL_TYPE WALLET_TYPE STATUS WALLET_ORDER
---------- --------------- ---------- ---------- -------------------- --------------- ---------------
2 PDB$SEED
READ
ONLY
FILE AUTOLOGIN
OPEN
SINGLE
2 PDB$SEED
READ
ONLY
OKV OKV
OPEN
SINGLE
3 PDB1
READ
WRITE FILE AUTOLOGIN
OPEN
SECONDARY
3 PDB1
READ
WRITE OKV OKV
OPEN
PRIMARY
METHODは、すべてのノードのsqlnet.oraで自動的にOKVに設定されます。
まとめ
OCI Vaultを使ったTDE暗号化キーの管理は、データベース作成時にすぐに行っても、後からキーの管理を変更しても、非常に簡単です。Vaultサービスで独自のキーを作成またはインポートし、データベースの作成時またはその後のキー管理の変更時にそれを選択するだけです。
一度OCI Vault(顧客管理キー)を利用すると、クラウドツールを使ってローカルウォレット(オラクル管理キー)の利用に戻すことはできません。しかし、この操作を予約することは、SQLコマンドを使って可能です。dbaascliコマンドラインツールを使って、OCI Vaultに再び切り替えることも可能です。
最後になりますが、OCI VaultとOracle Key Vault(OKV)を混同しないでください。
コメント
コメントを投稿