今回はデータの暗号化の手順確認の途中でつまづいた出来事のログ。

環境 : Oracle RAC 12c ( 2ノードRAC )
現象 : ウォレットがクローズされない
対処 : 全ノードでウォレットの設定をした後、DB再起動で正しい挙動に。

はじめに

オラクルにはセキュリティの機能として、データの暗号化機能がある。 暗号化はウォレットと呼ばれる、暗号キーを格納しているファイルを用いて実現される。

大まかな流れは以下のとおり。

  1. マスターキーの作成(作成時にウォレットが作成され、その中にマスターキーが格納される)
  2. ウォレットのオープン
  3. 表領域自体や、テーブルの特定列を暗号化した状態でテーブルを作成

このようにして作成された表領域内のオブジェクトやテーブルの列データには
ウォレットをオープンしていないとアクセスできないし
当然ながら、暗号化表領域、暗号化列を含んだ表の作成もできない。
これらの暗号化をTDE表領域暗号化、TDE列暗号化という。
ちなみにTDEとはTransparent Data Encryption (透過的データ暗号化)の略のことである。

今回はこの流れを確認しようとしたところ、冒頭に述べた通りウォレットがクローズできない
(コマンドはエラーが返らないが実際にはクローズされていない)
といった現象が起きた。今回はその状況と対処を備忘録としてまとめておく。
なお、試したのはTDE列暗号化である。

0 : 下準備

マスターキー作成のために以下2つを用意する。

  1. sqlnet.oraファイル
  2. ウォレットを置くディレクトリ

sqlnet.oraの作成

$ORACLE_HOME/network/admin以下に作成する。

[oracle@node1 ~]$ cd /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/
[oracle@node1 admin]$ vi sqlnet.ora

--> 以下を入力。DIRECTORYの場所がウォレットが作成される場所

ENCRYPTION_WALLET_LOCATION=
  (SOURCE=(METHOD=FILE)
    (METHOD_DATA=
      (DIRECTORY=$ORACLE_HOME/admin/wallet)
    )
  )

ウォレットを置くディレクトリの作成

[oracle@node1 admin]$ cd $ORACLE_HOME/admin
[oracle@node1 admin]$ mkdir wallet
[oracle@node1 admin]$ cd wallet/
[oracle@node1 wallet]$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet

1 : マスターキーの作成

[oracle@node1 wallet]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on  5 14 18:36:16 2018

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


Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
に接続されました。
SQL>
SQL> select name from v$database;

NAME
---------------------------
ORCL

SQL> alter system set encryption key identified by hoge;

システムが変更されました。

-- 指定した場所にウォレットが作成されたことを確認

SQL> !ls -l /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet
合計 4
-rw-r--r-- 1 oracle asmadmin 2848  5月 14 18:37 2018 ewallet.p12

1 : ウォレットの状態の確認

SQL> select wrl_parameter,status from gv$encryption_wallet;
WRL_PARAMETER                                         STATUS
-------------------------- -------------------------- ---------
/u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ OPEN

ウォレットはオープンしている模様。

順調である。

-- テスト用にユーザー、表領域を作成

SQL> create user testuser identified by testuser;

ユーザーが作成されました。

SQL> grant dba to testuser;

権限付与が成功しました。

SQL> create tablespace tde_test datafile size 1m;

表領域が作成されました。


SQL>
SQL> connect testuser/testuser
接続されました。

-- 表の作成 ( c2を暗号化列として指定 )
SQL> create table testtable_tde1 ( c1 varchar2(30), c2 varchar2(30) encrypt ) tablespace tde_test ;

表が作成されました。


SQL> desc testtable_tde1
 名前                                    NULL?    
 ----------------------------------------- -------- ----------------------------
 C1                            VARCHAR2(30 CHAR)
 C2                            VARCHAR2(30 CHAR) ENCRYPT


SQL>

-- レコードの挿入
SQL> insert into testtable_tde1 values ('this is not encrypted', 'this is encrypted');


1行が作成されました。

SQL> commit;

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

-- レコードの確認
SQL> select * from testtable_tde1;

C1                     C2
---------------------  ----------------------
this is not encrypted  this is encrypted

この状態でウォレットをクローズしてみる。

SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY hoge;

システムが変更されました。

SQL> select wrl_parameter,status from gv$encryption_wallet;
WRL_PARAMETER                                         STATUS
-------------------------- -------------------------- ---------
/u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ OPEN

クローズしたはずなのにOPENのまま。DBを再起動しても変わらず。 試しにgv$ビューで全ノードのウォレットの状態を確認してみる。

SQL> select inst_id,wrl_parameter,status from gv$encryption_wallet;
   INST_ID WRL_PARAMETER STATUS
---------- ------------- -----------------------------------------------------------------
     1 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ OPEN
     2 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ NOT_AVAILABLE

確認するとnode2の方はNOT_AVAILABLEに。
まだウォレットを置いてないので当然だがこれが原因かもしれない。

ということでnode2側にもwalletを置く。

[oracle@node2 ~]$ cd /u01/app/oracle/product/12.1.0/dbhome_1/admin/
[oracle@node2 admin]$ mkdir wallet; cd wallet
[oracle@node2 wallet]$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet
[oracle@node2 wallet]$ scp node1:/u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ewallet.p12 .
ewallet.p12                                                                                                    100% 2848     2.8KB/s   00:00
[oracle@node2 wallet]$ ls
ewallet.p12
[oracle@node2 ~]$ cd /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/
[oracle@node2 admin]$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/network/admin
[oracle@node2 admin]$ scp node1:/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/sqlnet.ora .
sqlnet.ora                                                                                                     100%  124     0.1KB/s   00:00

DBを再起動し再挑戦

[oracle@node1 wallet]$ srvctl stop database -db orcl
[oracle@node1 wallet]$ srvctl start database -db orcl
[oracle@node1 wallet]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on  5 14 19:26:00 2018

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



Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
に接続されました。

-- ウォレットの状態を確認

SQL> select inst_id,wrl_parameter,status from gv$encryption_wallet;
   INST_ID WRL_PARAMETER STATUS
---------- ------------- -----------------------------------------------------------------
     1 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ CLOSED
     2 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ CLOSED


-- ウォレットをオープン

SQL> ALTER SYSTEM SET ENCRYPTION WALLET open identified by hoge;

システムが変更されました。


-- ステータスの確認
SQL> select inst_id,wrl_parameter,status from gv$encryption_wallet;

---------- ------------- -----------------------------------------------------------------
     1 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ OPEN
     2 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ OPEN


-- ウォレットのクローズ
SQL> ALTER SYSTEM SET ENCRYPTION WALLET close identified by hoge;

システムが変更されました。

SQL> select inst_id,wrl_parameter,status from gv$encryption_wallet;
   INST_ID WRL_PARAMETER STATUS
---------- ------------- -----------------------------------------------------------------
     1 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ CLOSED
     2 /u01/app/oracle/product/12.1.0/dbhome_1/admin/wallet/ CLOSED

今度はクローズされた。よしよし。

最後に、当初の主目的であったTDE列暗号化を試す。

SQL> connect testuser/testuser;
接続されました。
SQL>  select * from testtable_tde1;
 select * from testtable_tde1
               *
1でエラーが発生しました。:
ORA-28365: ウォレットがオープンしていません

-- 暗号化列を含むデータは取得できないことを確認


-- 暗号化していない列のデータは見られる
SQL> select c1 from testtable_tde1;

C1
--------------------------
this is not encrypted


-- 暗号化している列のデータは見れない

SQL> select c2 from testtable_tde1;
select c2 from testtable_tde1
               *
1でエラーが発生しました。:
ORA-28365: ウォレットがオープンしていません



-- レコードのINSERTを試してみる

SQL> insert into testtable_tde1 values ('this is not encrypted','yaho');
insert into testtable_tde1 values ('this is not encrypted','yaho')
            *
1でエラーが発生しました。:
ORA-28365: ウォレットがオープンしていません


-- NULLはいけるみたい。ぬるいですな。

SQL> insert into testtable_tde1 values ('this is not encrypted', null);

1行が作成されました。

SQL> commit;

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


-- そうはいってもアクセスはできないみたい

SQL> select c2 from testtable_tde1;
select c2 from testtable_tde1
               *
1でエラーが発生しました。:
ORA-28365: ウォレットがオープンしていません


-- ウォレットをオープンする。

SQL> alter system set encryption wallet open identified by hoge;

システムが変更されました。

-- 暗号化された列のデータも見れるようになった

SQL> select c2 from testtable_tde1;

C2
--------------------------
this is encrypted

最後に

ウォレットを誤って削除した場合は、そのウォレットの中のマスターキーを使って暗号化されたものはどうなってしまうのだろうか。 また時間のある時に試してみようと思う。