第10回:RAC環境におけるTDEの設定について

技術者向け・データベースの技術情報発信

はじめに

皆様、お久しぶりでございます。マルチDBソリューション部の奥田です。

今回は、RAC環境構築時に要件としてユーザー表領域の暗号化が求められた際に発生した事象についてご紹介します。環境は以下の通りです。

・OS:RHEL7.3
・DB:Oracle12cR2(12.2.0.1)非CDB

この案件のエンドユーザは銀行業で、ミッションは老朽化システムの更改(ほぼ新規構築)でした。本システムは信用情報等、かなりセンシティブな情報を取り扱うシステムであったため、通信、データの暗号化は必須でした。

通信についてはOracleの標準機能で暗号化を行い、データの暗号化については以下が検討対象となっていました。

1.Oracle標準暗号化機能(DBMS_CRYPTOパッケージ)
2.Oracle Advanced Security(有償オプション)のTransparent Data Encryption(TDE)
3.OSの機能によるファイル暗号化

1、3については無償で暗号化が可能ですが、管理が複雑になったりパフォーマンスへの影響が大きかったりと、システム運用において問題があったため、2のTDEという機能による表領域暗号化を採用することにしました。(その他に、アプリケーションによりデータそのものを暗号化してDBに登録するという方法もありますが、やはり管理が複雑になることと、そもそもアプリ側でその工数を積んでいなかったため対象外としました。)

上記の通り、TDEを利用し表領域の暗号化を行うこと自体は決定しておりましたが、ウォレットの設定場所等の詳細な仕様は固まっておりませんでした。そこで、セキュリティの面からASM内に配置せず、少し管理に手間がかかりますが、各ノードのローカルに配置することにしました。

Oracleのマニュアルによると、ウォレットを配置するデフォルトは以下のいずれかです。(今回は①を作成しました)

①ORACLE_BASE/admin/DB_UNIQUE_NAME/wallet
②ORACLE_HOME/admin/DB_UNIQUE_NAME/wallet

sqlnet.oraに「ENCRYPTION_WALLET_LOCATION」パラメータを記載し①のパスを設定することで、TDE用のキーストア作成準備が整います。RACの場合、sqlnet.oraはGI(Grid Infrastructure)側の「ORACLE_HOME/network/admin」ディレクトリに配置されていたので、そこに以下のように設定を追加しました。

ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/admin/oradb1/wallet)))2

その後、キーストア作成⇒ウォレットの自動オープン設定⇒暗号化表領域の作成⇒デフォルト表領域の変更を行い、以下のテスト用のテーブルを作成してウォレットの自動オープン検証を行いました。

SQL> create table test_user.test_tbl1(col number);

表が作成されました。

SQL> insert into test_user.test_tbl1 values(1);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> select * from test_user.test_tbl1;

       COL
----------
1

SQL>

運用を想定してDBを再起動することでウォレットをクローズし、ウォレットの自動オープンを検証します。

まずはローカル接続での検証。

  [oracle@rh7-122-rac1 wallet]$ sqlplus test_user

SQL*Plus: Release 12.2.0.1.0 Production on 日 3月 30 22:32:07 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

パスワードを入力してください:


Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>
SQL> select * from test_tbl1;

       COL
----------
1

SQL>

ウォレットが自動オープンし、暗号化表領域内に作成された「test_tbl1」のデータを参照することができました。

次にDB再起動後、リモート(リスナー経由)接続での検証を行うと。。。

[oracle@rh7-122-rac1 wallet]$ sqlplus test_user@oradb1

SQL*Plus: Release 12.2.0.1.0 Production on 日 3月 30 22:38:53 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

パスワードを入力してください:


Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>
SQL> select * from test_tbl1;
select * from test_tbl1
              *
行1でエラーが発生しました。:
ORA-28365: ウォレットがオープンしていません


SQL>  
  

ウォレットが自動オープンしてくれません。

これは想定外でした。運用上、毎日DBが再起動されるため、ウォレットはクローズされた状態になります。システムは通常リモートから接続されるので、これを解消しなければなりませんでした。結論から言うと、この事象は解消され、無事にリモートからウォレットを自動オープンさせることができました。では、どこがいけなかったのでしょうか?

現状の動的ビュー「encryption_wallet」の状態を調査したところ、以下の通りでした。

SQL> select * from v$encryption_wallet;

WRL_TYPE     WRL_PARAMETER                                           STATUS      WALLET_TYPE          WALLET_OR FULLY_BAC     CON_ID
------------ ------------------------------------------------------- ----------- -------------------- --------- --------- ----------
FILE         /u01/app/oracle/admin/oradb1/wallet                     OPEN        AUTOLOGIN            SINGLE    NO                 0


SQL> select * from gv$encryption_wallet;

   INST_ID WRL_TYPE     WRL_PARAMETER                                           STATUS      WALLET_TYPE          WALLET_OR FULLY_BAC     CON_ID

---------- ------------ ------------------------------------------------------- ----------- -------------------- --------- --------- ----------
         1 FILE         /u01/app/oracle/product/12.2.0/db_1/admin/oradb1/wallet OPEN        AUTOLOGIN            SINGLE    NO                 0
         2 FILE         /u01/app/oracle/product/12.2.0/db_1/admin/oradb1/wallet OPEN        AUTOLOGIN            SINGLE    NO                 0


SQL>
	

動的ビュー「v$encryption_wallet」と「gv$encryption_wallet」の「WRL_PARAMETER」列の値が異なります。この原因を調査していたとき、ふと「sqlnet.ora」の配置場所が2箇所あることに気づきました。1つはGIのホームディレクトリ配下、もう1つはDBのホームディレクトリ配下です。当時、私は既存のsqlnet.oraにパラメータを追加すればよいと考えており、当該ファイルを新規作成しようとは思いませんでした。そこで、GIホームディレクトリ配下のsqlnet.oraに設定した「ENCRYPTION_WALLET_LOCATION」パラメータをDBホームディレクトリ配下にsqlnet.oraを作成して移行し、リモート接続によるウォレットの自動オープン検証を行うと。。。

[oracle@rh7-122-rac1 ~]$ sqlplus test_user@oradb1

SQL*Plus: Release 12.2.0.1.0 Production on 日 3月 30 22:50:01 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

パスワードを入力してください:


Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL> col wrl_type_format for a10
SQL> col wrl_parameter for a55
SQL> col status for a15
SQL> set pages 200
SQL> select instance_name, status from v$instance;

INSTANCE_NAME    STATUS
---------------- ---------------
oradb11          OPEN

SQL>
SQL> select * from test_tbl1;

       COL
----------
1

SQL>
	

リモート接続でウォレットが自動オープンできました!

ここで動的ビュー「encryption_wallet」の状態を調査したところ。。。

SQL> select * from v$encryption_wallet;

WRL_TYPE     WRL_PARAMETER                                           STATUS      WALLET_TYPE          WALLET_OR FULLY_BAC     CON_ID
------------ ------------------------------------------------------- ----------- -------------------- --------- --------- ----------
FILE         /u01/app/oracle/admin/oradb1/wallet/                    OPEN        AUTOLOGIN            SINGLE    NO                 0


SQL>
SQL> select * from gv$encryption_wallet;

   INST_ID WRL_TYPE     WRL_PARAMETER                                           STATUS      WALLET_TYPE          WALLET_OR FULLY_BAC     CON_ID
---------- ------------ ------------------------------------------------------- ----------- -------------------- --------- --------- ----------
         2 FILE         /u01/app/oracle/admin/oradb1/wallet/                    OPEN        AUTOLOGIN            SINGLE    NO                 0

         1 FILE         /u01/app/oracle/admin/oradb1/wallet/                    OPEN        AUTOLOGIN            SINGLE    NO                 0


SQL>
		

動的ビュー「v$encryption_wallet」と「gv$encryption_wallet」の「WRL_PARAMETER」列の値が同じになりました。

RAC環境を構築する場合、GIとDB両製品を導入する必要があり、この2製品は同じような構成となっているため、分かりにくい部分があるので注意が必要です。

※これはあくまでひとつのケースであり、解決方法は他にいくつもありますので、ご参考程度にしていただければと思います。