#topicpath [[SQL言語リファレンス:http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05750-03/statements_7.htm]] を見て作ります。 > 暗号化された表領域の作成例: > > 次の文は、暗号化された表領域を作成します。最初にウォレッ > トを開いて、データベースに対して暗号化を有効にする必要が > あります。 > > ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "welcome1"; > > System altered. > > CREATE TABLESPACE encrypt_ts > DATAFILE '$ORACLE_HOME/dbs/encrypt_df.dat' SIZE 1M > ENCRYPTION USING '3DES168' > DEFAULT STORAGE (ENCRYPT); > > Tablespace created. 実際にやってみました。 #pre{{ [oracle@ora1 ~]$ sqlplus sys/oracle@orcl as sysdba SQL*Plus: Release 11.2.0.1.0 Production on 土 9月 19 15:54:04 2009 Copyright (c) 1982, 2009, Oracle. All rights reserved. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options に接続されました。 SQL> alter system set encryption key identified by "ThisIsAPassword"; alter system set encryption key identified by "ThisIsAPassword" * 行1でエラーが発生しました。: ORA-28368: ウォレットを自動作成できません SQL> }} んー wallet がないということですね。 管理者ガイドの「暗号化された表領域」を見直してみますと 次のように書いてあります。 > 透過的データ暗号化の詳細、およびウォレットの作成と > オープンの手順については、『Oracle Database 2日で > セキュリティ・ガイド』を参照してください。 [[Oracle Database 2日でセキュリティ・ガイド11g リリース1(11.1):http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05781-03/toc.htm]] にありました。 * 手順1: ウォレットの場所を設定する [#p5c5a422] ディレクトリを作ります。 #pre{{ [oracle@ora1 1_Basic]$ mkdir $ORACLE_HOME/ORA_WALLETS }} sqlnet.ora を編集します。 #pre{{ [oracle@ora1 1_Basic]$ cp $ORACLE_HOME/network/admin/sqlnet.ora sqlnet.ora.bak [oracle[ora1 1_Basic]$ vi $ORACLE_HOME/network/admin/sqlnet.ora }} こんな感じで書きました。 #pre{{ [oracle@ora1 1_Basic]$ cat $ORACLE_HOME/network/admin/sqlnet.ora ENCRYPTION_WALLET_LOCATION= (SOURCE= (METHOD=file) (METHOD_DATA= (DIRECTORY=/u01/app/oracle/product/11.2.0/dbhome_1/ORA_WALLETS))) }} 一度インスタンスを再起動しておくんだそうです。 #pre{{ SQL> shutdown immediate データベースがクローズされました。 データベースがディスマウントされました。 ORACLEインスタンスがシャットダウンされました。 SQL> startup ORACLEインスタンスが起動しました。 Total System Global Area 521936896 bytes Fixed Size 2214936 bytes Variable Size 398459880 bytes Database Buffers 117440512 bytes Redo Buffers 3821568 bytes データベースがマウントされました。 データベースがオープンされました。 }} * 手順2: ウォレットを作成する [#k9b0260e] #pre{{ SQL> alter system set encryption key identified by "ThisIsAPassword"; システムが変更されました。 SQL> }} 今度は作れました。 ファイルが作られています。 #pre{{ [oracle@ora1 ~]$ ls -l $ORACLE_HOME/ORA_WALLETS/ 合計 4 -rw-r--r-- 1 oracle oinstall 1573 9月 19 16:14 ewallet.p12 }} * 手順3: ウォレットを開く(または閉じる) [#ma6426c0] まず閉じてみます。 #pre{{ SQL> alter system set encryption wallet close; alter system set encryption wallet close * 行1でエラーが発生しました。: ORA-28390: 自動ログイン・ウォレットがオープンしていません }} 閉じれません。 wallet を指定しないといけないんでしょうか。 #pre{{ SQL> alter system set encryption wallet close identified by "ThisIsAPassword"; システムが変更されました。 }} そうみたいです。 通常は開いたままにするようなので、開いておきます。 #pre{{ SQL> alter system set encryption wallet open identified by "ThisIsAPassword"; システムが変更されました。 SQL> }} * 手順4: データを暗号化(または復号化)する [#v228c070] 今度は暗号化表領域がちゃんと作れるでしょう。 #pre{{ SQL> create tablespace ENCRYPT_TS 2 datafile '/u02/oradata/orcl/encrypt01.dbf' size 10M 3 encryption using 'AES256' 4 default storage (ENCRYPT); 表領域が作成されました。 SQL> }} 暗号化方式は4つから選べます。 - AES192 - 3DES168 - AES128 (by default) - AES256 * 確認 [#w3d7efbd] ** ウォレットが開いているかどうか [#y7369ddb] v$encryption_wallet 表を見ます。 #pre{{ SQL> select * from v$encryption_wallet; WRL_TYPE ------------------------------------------------------------ WRL_PARAMETER -------------------------------------------------------------------------------- STATUS ------------------------------------------------------ file /u01/app/oracle/product/11.2.0/dbhome_1/ORA_WALLETS OPEN SQL> }} インスタンスを再起動すると閉じてしまうので、 毎回 OPEN にしましょう。 ** 表領域が暗号化されているかどうか [#d2f07442] dba_tablespaces で見れます。 #pre{{ SQL> col tablespace_name format a20 SQL> select tablespace_name, encrypted from dba_tablespaces; TABLESPACE_NAME ENCRYPTED -------------------- --------- SYSTEM NO SYSAUX NO UNDOTBS1 NO TEMP NO USERS NO EXAMPLE NO ENCRYPT_TS YES 7行が選択されました。 SQL> }} 暗号化の情報は v$encrypted_tablespaces です。 #pre{{ SQL> select * from v$encrypted_tablespaces; TS# ENCRYPTIONALG ENCRYPTED ---------- --------------------- --------- 7 AES256 YES SQL> }} 一緒に見たければこんな感じでしょうか。 #pre{{ SQL> select a.name, b.encryptionalg, b.encryptedts 2 from v$tablespace a, v$encrypted_tablespaces b 3 where a.ts# = b.ts#(+); NAME ENCRYPTIONALG ENCRYPTED -------------------- --------------------- --------- ENCRYPT_TS AES256 YES TEMP SYSAUX UNDOTBS1 EXAMPLE SYSTEM USERS 7行が選択されました。 SQL> }} * 暗号化表領域の利用法 [#e74b1663] この表領域にテーブルを入れると丸ごと暗号化されます。 #pre{{ SQL> conn scott/tigertiger0 接続されました。 SQL> alter table emp move tablespace encrypt_ts; 表が変更されました。 }} ウォレットを閉じてみます。 #pre{{ SQL> conn sys/oracle as sysdba 接続されました。 SQL> alter system set encryption wallet close identified by "ThisIsAPassword"; システムが変更されました。 }} 暗号化されているのでアクセスできません。 #pre{{ SQL> conn scott/tigertiger0 接続されました。 SQL> select * from emp; select * from emp * 行1でエラーが発生しました。: ORA-28365: ウォレットがオープンしていません SQL> }} 開けばまた見えるようになります。 #pre{{ SQL> conn sys/oracle as sysdba 接続されました。 SQL> alter system set encryption wallet open identified by "ThisIsAPassword"; システムが変更されました。 SQL> conn scott/tigertiger0 接続されました。 SQL> select * from emp; EMPNO ENAME JOB MGR ---------- ------------------------------ --------------------------- ---------- HIREDATE SAL COMM DEPTNO -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80-12-17 800 20 ... 14行が選択されました。 }} このウォレットのファイル ewallet.p12 やパスワードは 絶対になくさないようにしましょう。 暗号化したデータを SYS の持つデータディクショナリに書き込むこともあるようで、 なくすと DB 全体を作り直す必要があります。 ---- #comment