ヘッダーをスキップ
Oracle Database Advanced Security管理者ガイド
11g リリース1(11.1)
E05729-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 透過的データ暗号化を使用した格納済データの保護

透過的データ暗号化を使用すると、表の列に格納する機密データ(クレジット・カード番号など)を暗号化できます。暗号化データは、そのデータへのアクセス権があるデータベース・ユーザーに対して透過的に復号化されます。透過的データ暗号化は、記憶媒体やデータ・ファイルが盗まれた場合、媒体に格納されているデータの保護に役立ちます。

この章では、次の項目について説明します。

3.1 透過的データ暗号化の概要

Oracle Database 11g では、データベース内のデータは認証、認可および監査メカニズムによって保護されますが、データを格納しているオペレーティング・システム・データ・ファイルは保護されません。このようなデータ・ファイルを保護するために、Oracle Databaseには透過的データ暗号化が用意されています。透過的データ暗号化は、データ・ファイルに格納されている機密表データを暗号化します。無許可での復号化を防止するために、透過的データ暗号化では、データベース外部のセキュリティ・モジュールに暗号化鍵が格納されています。

この項では、次の項目について説明します。

3.1.1 透過的データ暗号化を使用する利点

透過的データ暗号化には、次の利点があります。

  • セキュリティ管理者は、記憶媒体やデータ・ファイルが盗まれた場合、機密データの安全性を確保できます。

  • 透過的データ暗号化を実装することで、セキュリティに関する規制準拠問題への対応が促進されます。

  • データを復号化するためにトリガーまたはビューを作成する必要はありません。表のデータは、データベース・ユーザーに対して透過的に復号化されます。

  • データベース・ユーザーは、アクセスしているデータが暗号化されて格納されている事実を認識する必要はありません。データはデータベース・ユーザーに対して透過的に復号化され、ユーザー側での処理は必要ありません。

  • 暗号化データを処理するようにアプリケーションを変更する必要はありません。データの暗号化と復号化はデータベースによって管理されます。

3.1.2 透過的データ暗号化を使用する場合

透過的データ暗号化は、クレジット・カード番号や社会保障番号などの機密データを、鍵の格納を管理したり、補助の表、ビューおよびトリガーを作成せずに保護する場合に使用します。機密データを処理するアプリケーションでこの機能を使用すると、アプリケーションをほとんどあるいはまったく変更せずに、強力なデータ暗号化を提供できます。

3.1.2.1 透過的データ暗号化の使用に関する制限

透過的データ暗号化は、外部キー制約で使用される列の暗号化には使用できません。これは、すべての表に一意の列暗号化鍵があるためです。

透過的データ暗号化は、SQLレイヤーでデータの暗号化と復号化を処理します。したがって、SQLレイヤーをバイパスするOracle Databaseのユーティリティや機能は、透過的データ暗号化によるサービスを利用できません。透過的データ暗号化は、次のデータベース機能と併用しないでください。

  • Bツリー以外の索引タイプ

  • 索引内のレンジ・スキャン検索

  • 外部ラージ・オブジェクト(BFILE

  • マテリアライズド・ビュー・ログ

  • 同期チェンジ・データ・キャプチャ

  • トランスポータブル表領域

  • オリジナルのインポート/エクスポート・ユーティリティ


注意:


Oracle Database 10g リリース2(10.2)では、BLOBCLOBなどのラージ・オブジェクト(LOB)データ型はサポートされませんでした。Oracle Database 11g では、BLOBCLOBなどの内部ラージ・オブジェクト・データ型がサポートされるようになりました。 ただし、外部LOBBFILE)は暗号化できません。

サポート対象外のこれらの機能を使用するアプリケーションでは、DBMS_CRYPTOパッケージを暗号化に使用できます。

透過的データ暗号化は、ディスクや媒体に格納されているデータを保護します。転送中のデータは保護しません。ネットワーク上のデータを暗号化するには、第2章「構成および管理ツールの概要」に記載されているOracle Advanced Securityのネットワーク暗号化ソリューションを使用してください。

3.1.3 透過的データ暗号化の仕組み

透過的データ暗号化は、鍵ベースのアクセス制御システムです。暗号化されたデータを取得しても、許可された復号化が行われるまでは理解不能です。この復号化は、表へのアクセスを許可されたユーザーに対して自動的に行われます。

表に暗号化列が含まれる場合、暗号化列の数に関係なく、単一の鍵が使用されます。この鍵は列暗号化鍵と呼ばれます。暗号化列を含むすべての表の列暗号化鍵は、データベース・サーバーのマスター暗号化鍵で暗号化され、データベース内のディクショナリ表に格納されます。暗号化されていない鍵が格納されることはありません。

図3-1に示すように、マスター暗号化鍵は、データベースの外部にあり、セキュリティ管理者のみがアクセスできる外部セキュリティ・モジュールに格納されます。この外部セキュリティ・モジュールとして、Oracleでは、この章で説明するOracleウォレットを使用します。このようにマスター暗号化鍵を格納することで、許可のない使用を防止します。

図3-1 透過的データ暗号化の概要

この図については本文で説明されています。

外部セキュリティ・モジュールを使用すると、通常のプログラム機能と暗号化操作が分離されるため、データベース管理者とセキュリティ管理者の任務を分離できます。データベース管理者にはウォレット・パスワードを知らせずに、セキュリティ管理者にパスワードの提供を要求できるため、セキュリティが強化されます。

3.1.4 基本的な透過的データ暗号化操作の概要

透過的データ暗号化を使用可能にするには、ALTER SYSTEM権限と、Oracleウォレットへの有効なパスワードが必要です。Oracleウォレットが存在しない場合、SQLコマンドで指定したパスワードを使用して新しいウォレットが作成されます。

新しいマスター鍵を作成し、透過的データ暗号化の使用を開始するには、次のコマンドを発行します。

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY password

passwordは、二重引用符(" ")で囲みます。このコマンドによって、データベース・サーバーのマスター暗号化鍵が生成されます。サーバーはこの鍵を使用して、各表の列暗号化鍵を暗号化します。サーバーのマスター鍵が設定されるまで、データベース内の表の列は暗号化できません。

マスター暗号化鍵は、データベース・インスタンスが停止されるまで、データベースからアクセス可能な状態になります。データベースの再起動後にマスター暗号化鍵をロードするには、次のコマンドを使用します。

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY password

パスワードは、二重引用符(" ")で囲みます。暗号化列を含む新しい表を作成するには、CREATE TABLEコマンドを次の形式で使用します。

CREATE TABLE table_name ( column_name column_type ENCRYPT,....);

列に対するENCRYPTキーワードは、その列が暗号化されることを示します。

既存の表に暗号化が必要な列が含まれている場合は、ALTER TABLEコマンドを次の形式で使用します。

ALTER TABLE table_name MODIFY ( column_name column_type ENCRYPT,...);

列に対するENCRYPTキーワードは、その列が暗号化されることを示します。

データベース内のすべての暗号化列へのアクセスを無効にするには、次のコマンドを使用します。

ALTER SYSTEM SET ENCRYPTION WALLET CLOSE

前述のコマンドによって、ウォレット内のマスター鍵へのアクセスが無効になり、暗号化列内のデータへのアクセスを防止できます。 マスター暗号化鍵へのアクセスを再度有効にするには、ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY passwordコマンドを使用してウォレットを再オープンする必要があります。

3.2 透過的データ暗号化の使用

次に、透過的データ暗号化を使用する手順を説明します。

3.2.1 透過的データ暗号化の有効化

透過的データ暗号化は、Oracle Database 10g リリース2(10.2)で最初に導入されました。この機能を使用するには、Oracle Database 10g リリース2(10.2)以上を実行する必要があります。


注意:


Oracle Database 11g リリース1(11.1)では、JOINSORTなどの操作中に一時表領域のデータを保護することで、より高いセキュリティが確保されます。これらの操作の間、一時表領域のデータは暗号化された状態で存在します。

透過的データ暗号化をOracle Database 10g リリース2(10.2)ですでに使用していて、Oracle Database 11g リリース1(11.1)にアップグレードした場合は、データベースの互換性を11.0.0に設定して、マスター鍵を再設定することをお薦めします。これによって、Oracle Database 11g リリース1(11.1)の透過的データ暗号化による強化されたセキュリティ機能を使用できます。 表領域のマスター暗号化鍵も作成できます。マスター暗号化鍵の再設定の詳細は、「マスター暗号化鍵の設定および再設定」を参照してください。


透過的データ暗号化の使用を開始するには、セキュリティ管理者がウォレットを作成し、マスター鍵を設定する必要があります。ウォレットは、他のOracle Databaseコンポーネントと共有されるデフォルトのデータベース・ウォレットにするか、透過的データ暗号化専用に使用する別のウォレットにできます。マスター暗号化鍵は、独立したウォレットを使用して格納することをお薦めします。

3.2.1.1 透過的データ暗号化用のウォレット・ロケーションの指定

外部セキュリティ・モジュールには、sqlnet.ora構成ファイルで指定されているOracleウォレットの暗号化鍵が格納されています。Oracleウォレット・ロケーションをsqlnet.oraファイルに指定するには、WALLET_LOCATIONパラメータを使用します。

透過的データ暗号化専用のウォレットを使用する場合は、ENCRYPTION_WALLET_LOCATIONパラメータを使用して、sqlnet.oraファイルで2つ目のウォレット・ロケーションを指定する必要があります。透過的データ暗号化のウォレット・ロケーションを指定するには、ENCRYPTION_WALLET_LOCATIONパラメータの使用をお薦めします。


関連項目:


このパラメータの設定に使用する構文の例については、「サンプルsqlnet.oraファイル」を参照してください。

3.2.1.2 自動ログインが有効なウォレットの使用

外部セキュリティ・モジュールでは、自動ログイン機能が有効になっているウォレットを使用できます。このようなウォレットは常にオープンしたままになります。セキュリティ管理者は、データベース・インスタンスの再起動後にウォレットを再オープンする必要はありません。ウォレットによって提供される追加セキュリティ(明示的にオープンして使用する必要があります)を必要としない環境では、自動ログイン・ウォレットを使用できます。


関連項目:


Oracle Wallet Managerを使用して自動ログインを有効にする方法は、「自動ログインの使用方法」を参照してください。

3.2.2 マスター暗号化鍵の設定および再設定

マスター暗号化鍵は、Oracleウォレットに格納され、列暗号化鍵の保護に使用されます。デフォルトでは、マスター暗号化鍵は、透過的データ暗号化によって生成されるランダム鍵です。マスター鍵は、暗号化用に指定されたPKI証明書の既存の鍵ペアにすることもできます。PKI鍵ペアと一緒に透過的データ暗号化を使用するには、発行認証局が、暗号化用にマークされた鍵使用方法フィールドを含むX.509v3証明書を発行できる必要があります。

どちらの鍵タイプもセキュリティは同様ですが、組織内にすでにPKIをデプロイしている場合は、そのPKIサービスを鍵供託およびリカバリとして活用できます。ただし、現在のPKIアルゴリズムを使用する暗号化では、対称鍵暗号化よりもはるかに多くのシステム・リソースが必要になります。マスター暗号化鍵としてPKI鍵ペアを使用すると、データベース内の暗号化列にアクセスする場合にパフォーマンスが大幅に低下する可能性があります。

マスター暗号化鍵を設定または再設定するには、ALTER SYSTEMコマンドを使用します。次の各項では、マスター暗号化鍵の設定および再設定について説明します。

3.2.2.1 マスター暗号化鍵の設定

データベースの列を暗号化または復号化するには、その前に、マスター暗号化鍵を生成または設定しておく必要があります。マスター暗号化鍵は列暗号化鍵の暗号化に使用され、列暗号化鍵は表の列の暗号化に使用されます。

マスター暗号化鍵を設定するには、次のコマンドを使用します。

SQL> ALTER SYSTEM SET ENCRYPTION KEY [certificate_ID] IDENTIFIED BY password

ここで、

  • certificate_IDは、Oracleウォレットに格納されている証明書の一意の識別子を含むオプション文字列です。PKI秘密鍵をマスター暗号化鍵として使用する場合は、このパラメータを使用します。このパラメータにデフォルト設定はありません。

    certificate_IDを検索するには、ウォレットがオープンしているときにV$WALLET固定ビューを問い合せます。透過的データ暗号化でマスター暗号化鍵として使用できる証明書のみが表示されます。

  • passwordは、セキュリティ・モジュールの必須ウォレット・パスワードです。デフォルト設定はありません。このパスワードは大/小文字が区別されます。パスワード文字列は、二重引用符(" ")で囲みます。


関連項目:


パスワードの供給に関する規則については、『Oracle Database SQLリファレンス』を参照してください。

ウォレットが存在しない場合は、このコマンドによって、sqlnet.oraパラメータ・ファイルで指定されているウォレット・ロケーションで新しいウォレットが作成されます。sqlnet.oraファイルでウォレット・ロケーションが指定されていない場合は、デフォルトのデータベース・ウォレット・ロケーションが使用されます。想定しているウォレット・ロケーションに既存の自動ログイン・ウォレットが存在する場合、新しいウォレットは作成されません。

3.2.2.2 マスター暗号化鍵の再設定

マスター暗号化鍵の再設定/再生成は、マスター暗号化鍵の安全性が損なわれた場合にのみ実行します。頻繁にマスター暗号化鍵を再生成しても、システム・セキュリティが強化されるとはかぎりません。セキュリティ・モジュールには多数の鍵を格納できます。ただし、この数は無限ではありません。頻繁にマスター暗号化鍵を再生成すると、使用可能な記憶域を使い果たす可能性があります。

マスター暗号化鍵を再設定するには、「マスター暗号化鍵の設定」に記載されているSQL構文を使用します。

ALTER SYSTEM SET ENCRYPTION KEYコマンドは、ALTER SYSTEM権限が必要なデータ定義言語(DDL)コマンドであり、これによって、保留中のトランザクションがすべて自動的にコミットされます。例3-1に、このコマンドの使用例を示します。

例3-1 PKIベースの秘密鍵を使用するためのマスター暗号化鍵の設定または再設定

ALTER SYSTEM SET ENCRYPTION KEY "j23lm781098dhb345sm" IDENTIFIED BY "p3812dH9E";

PKIベースの鍵の場合、証明書失効リストは規定されません。これは、証明書の失効を規定すると、データベース内の暗号化されたすべての情報にアクセスできなくなる可能性があるためです。

3.2.3 暗号化ウォレットのオープン

外部セキュリティ・モジュールには、Oracleウォレットのマスター暗号化鍵が格納されています。データベースが列を暗号化または復号化するには、その前に、マスター暗号化鍵がメモリーにロードされている必要があります。ウォレットをオープンすると、データベースはマスター暗号化鍵にアクセスできます。次のALTER SYSTEMコマンドを使用して、ウォレットを明示的にオープンします。

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY password

このpasswordは、ウォレットをオープンするためのパスワードです。パスワード文字列は、二重引用符(" ")で囲みます。


注意:


ウォレットをオープンするためのパスワードは、マスター暗号化鍵を作成するために指定したパスワードです。これについては、「マスター暗号化鍵の設定」を参照してください。

ウォレットは、一度オープンされると、データベース・インスタンスを停止するか、またはALTER SYSTEM SET ENCRYPTION WALLET CLOSEコマンドを発行してウォレットを明示的にクローズするまでオープンしたままになります。 インスタンスを再起動するときは、ALTER SYSTEM SET ENCRYPTION WALLET OPENコマンドを再度発行する必要があります。

スキーマにALTER SYSTEM権限がない場合や、ウォレットが使用できない場合、不正なパスワードが入力された場合、このコマンドはエラーを返して終了します。ウォレットがすでにオープンされている場合、このコマンドはエラーを返し、何も実行しません。例3-2に、それぞれの場合の使用例を示します。

例3-2 ALTER SYSTEMを使用した外部セキュリティ・モジュール・ウォレットのオープン

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "U83j10LLt8v";
Wallet opened.

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "U83j10LLt8v";
ERROR at line 1:
ORA-28354: wallet already open

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "U93j10LLt8v";
ERROR at line 1:
ORA-28353: failed to open wallet

3.2.4 暗号化列を含む表の作成

暗号化列を含むリレーショナル表を作成するには、CREATE TABLE文でデータベース列を定義するときにSQL ENCRYPT句を指定します。

この項では、次の項目について説明します。

3.2.4.1 暗号化列を含む表の作成方法

デフォルトでは、透過的データ暗号化は、192ビット長の鍵を使用するAES暗号化アルゴリズム(AES192)を使用します。アルゴリズムを指定せずに表の列を暗号化すると、その列はAES192アルゴリズムを使用して暗号化されます。

例3-3は、暗号化列を含む新しい表を作成しています。この列は、デフォルト・アルゴリズム(AES192)を使用して暗号化されます。

例3-3 デフォルト・アルゴリズム(AES192)を使用する暗号化列を含む新しい表の作成

CREATE TABLE employee (
     first_name VARCHAR2(128),
     last_name VARCHAR2(128),
     empID NUMBER,
     salary NUMBER(6) ENCRYPT
);

3.2.4.2 デフォルト以外のアルゴリズムおよびNO SALTを使用する暗号化列を含む表の作成方法

デフォルトでは、透過的データ暗号化は、暗号化の前にクリアテキストにsaltを追加します。これによって、攻撃者が総当たり攻撃によってデータを盗むことがより困難になります。ただし、暗号化列を索引付けする場合、NO SALTを使用する必要があります。

透過的データ暗号化では、デフォルト以外の暗号化アルゴリズムも指定できます。次のいずれかのアルゴリズムを選択できます。

  • 3DES168

  • AES128

  • AES192(デフォルト)

  • AES256

例3-4に、SQL ENCRYPT句でNO SALTパラメータを指定する方法(empID NUMBER ENCRYPT NO SALT)を示します。また、別の暗号化アルゴリズムを指定するための構文(salary NUMBER(6) ENCRYPT USING '3DES168')も示します。アルゴリズムを指定する文字列は、一重引用符(' ')で囲む必要があることに注意してください。

例3-4 3DES168およびNO SALTを使用する暗号化列を含む新しい表の作成

CREATE TABLE employee (
     first_name VARCHAR2(128),
     last_name VARCHAR2(128),
     empID NUMBER ENCRYPT NO SALT,
     salary NUMBER(6) ENCRYPT USING '3DES168'
);

3.2.4.3 外部表への暗号化列の作成方法

外部表の機能を使用すると、データベース表内のデータであるかのように、外部ソースのデータにアクセスできます。外部表は、ORACLE_DATAPUMPアクセス・ドライバを使用して更新できます。


関連項目:


スキーマ・オブジェクトおよび表については、『Oracle Database概要』を参照してください。

外部表の特定の列を暗号化するには、列を定義するときにENCRYPT句を使用します。列の暗号化には、ランダムに生成された鍵が使用されます。

外部表を新しい場所に移動することを予定している場合、列の暗号化にランダム生成の鍵は使用できません。これは、新しい場所ではランダム生成の鍵が使用できないためです。

このような場合は、列を暗号化する際にパスワードを指定する必要があります。データを移動した後は、同じパスワードを使用して、新しい場所の暗号化列データへのアクセスに必要な鍵を再生成できます。

表区分交換でもパスワード・ベースの列暗号化鍵が必要になります。

例3-5は、列暗号化鍵を作成するためのパスワードを使用して外部表を作成しています。

例3-5 パスワード生成列暗号化鍵を使用した新しい外部表の作成

CREATE TABLE emp_ext (
     first_name,
     last_name,
     empID,
     salary,
     ssn ENCRYPT IDENTIFIED BY "xIcf3T9u"
)  ORGANIZATION EXTERNAL
   (
    TYPE ORACLE_DATAPUMP
    DEFAULT DIRECTORY "D_DIR"
    LOCATION('emp_ext.dat')
    )
    REJECT LIMIT UNLIMITED
as select * from employee;

関連項目:


CREATE TABLEENCRYPTおよびパスワードの規則については、『Oracle Database SQLリファレンス』を参照してください。

3.2.5 既存の表にある列の暗号化

既存の表に暗号化列を追加する、あるいは既存の列を暗号化または復号化するには、ALTER TABLE SQLコマンドをADDまたはMODIFY句とともに使用します。

この項では、次の項目について説明します。

3.2.5.1 既存の表への暗号化列の追加

既存の表に暗号化列を追加するには、ALTER TABLE ADDコマンドを使用し、ENCRYPT句で新しい列を指定します。例3-6は、employeeという外部表に暗号化列ssnを追加しています。

例3-6 既存の表への暗号化列の追加

ALTER TABLE employee ADD (ssn VARCHAR2(11) ENCRYPT);

ssn列は、デフォルトのAES192アルゴリズムを使用して暗号化されます。saltはデフォルトでデータに追加されます。

別のアルゴリズムを使用して列を暗号化することもできます。また、列に索引を付ける場合は、NO SALTを指定できます。

3.2.5.2 暗号化されていない列の暗号化

暗号化されていない列を暗号化するには、ALTER TABLE MODIFYコマンドを使用し、ENCRYPT句で暗号化されていない列を指定します。例3-7は、employee表のfirst_name列を暗号化しています。

例3-7 暗号化されていない列の暗号化

ALTER TABLE employee MODIFY (first_name ENCRYPT);

このfirst_name列は、デフォルトのAES192アルゴリズムを使用して暗号化されます。saltはデフォルトでデータに追加されます。

別のアルゴリズムを使用して列を暗号化することもできます。また、列に索引を付ける場合は、NO SALTを指定できます。

3.2.5.3 列の暗号化の無効化

互換性やパフォーマンスの理由から、暗号化を無効にすることが必要になる場合があります。列の暗号化を無効にするには、ALTER TABLE MODIFYコマンドを使用してDECRYPT句を指定します。例3-8は、employee表のfirst_name列を復号化しています。

例3-8 列の暗号化の無効化

ALTER TABLE employee MODIFY (first_name DECRYPT);

3.2.6 暗号化列に対する索引の作成

暗号化列に対して索引を作成するには、標準のCREATE INDEXコマンドを使用します。索引付け対象の列は、saltなしで暗号化されています。例3-9に、saltなしで暗号化された列に対して索引を作成する方法を示します。

例3-9 saltなしで暗号化された列に対する索引の作成

CREATE TABLE employee (
   first_name VARCHAR2(128),
   last_name VARCHAR2(128),
   empID NUMBER ENCRYPT NO SALT,
   salary NUMBER(6) ENCRYPT USING '3DES168'
);
CREATE INDEX employee_idx on employee (empID);

注意:


saltを使用して暗号化された列に対して索引を作成することはできません。作成しようとすると、エラー(ORA-28338)が発生します。

3.2.7 暗号化列に対するsaltの追加または削除

saltは、暗号化データのセキュリティを強化する方法の1つです。saltは暗号化の前にデータに追加するランダムな文字列で、これにより、暗号化されていないテキストの繰り返しが、暗号化すると異なって表示されるようになります。 saltは、攻撃者がデータを盗むために使用する一般的な方法の1つである暗号化テキストのパターン一致を排除します。

暗号化列に対してsaltを追加または削除するには、ALTER TABLE MODIFYコマンドを使用します。例3-10は、saltを使用してfirst_name列を暗号化しています。first_name列が以前にsaltなしで暗号化されていた場合は、このコマンドによって、saltを使用して列が再暗号化されます。

例3-10 暗号化列へのsaltの追加

ALTER TABLE employee MODIFY (first_name ENCRYPT SALT);

例3-11は、first_name列からsaltを削除しています。saltを使用して暗号化された列に索引を付ける必要がある場合は、索引を付ける前に、このコマンドを使用してsaltを削除します。

例3-11 暗号化列からのsaltの削除

ALTER TABLE employee MODIFY (first_name ENCRYPT NO SALT);

3.2.7.1 NOMACパラメータを使用したディスク領域の節約およびパフォーマンスの向上

NOMACパラメータを使用すると、透過的データ暗号化によって実行される整合性チェックを省略できます。 このパラメータで、暗号化された値ごとに20バイトのディスク領域が節約されます。 表の行および暗号化列の数が多い場合、これにより節約されるディスク領域はかなりの量になります。

また、NOMACパラメータは透過的データ暗号化に関連するパフォーマンスのオーバーヘッドも削減します。 NOMACパラメータを使用すると、暗号化および復号化操作時の整合性チェックが省略されます。 これにより処理循環が短縮され、パフォーマンスが高速化されます。


注意:


透過的データ暗号化では、デフォルトでSHA-1整合性アルゴリズムを使用します。 表内のすべての暗号化列が同一の整合性アルゴリズムを使用している必要があります。 SHA-1アルゴリズムを使用している表の列がすでに存在する場合、NOMACパラメータを使用して同じ表の別の列を暗号化することはできません。

表の整合性チェックを省略するには、初めて表の列を暗号化する際に、NOMACパラメータを使用する必要があります。 表内の以降の暗号化する列は、すべて暗黙的にNOMACパラメータを使用することになります。


例3-12は、暗号化列を含む表を作成しています。 empID列は、NOMACパラメータを使用して暗号化されます。

例3-12 CREATE TABLE文でのNOMACパラメータの使用

CREATE TABLE employee (
     first_name VARCHAR2(128),
     last_name VARCHAR2(128),
     empID NUMBER ENCRYPT 'NOMAC' NO SALT ,
     salary NUMBER(6)
);

例3-13は、NOMACパラメータを使用してemployee表のsalary列を暗号化しています。

例3-13 ALTER TABLE文でのNOMACパラメータの使用

ALTER TABLE employee MODIFY (salary ENCRYPT 'NOMAC');

3.2.8 暗号化列を含む表に対する暗号化鍵またはアルゴリズムの変更

各表が列に対して保持できる列暗号化鍵は1つのみです。列暗号化鍵はALTER TABLEコマンドを使用して再生成できます。新しい列暗号化鍵に対して別の暗号化アルゴリズムを使用することもできます。このような変更の前後には、セキュリティ上の賢明な習慣として、ウォレットをバックアップすることをお薦めします。

例3-14は、employee表に対する列暗号化鍵を再生成しています。

例3-14 暗号化列を含む表での暗号化鍵の変更

ALTER TABLE employee REKEY;

例3-15は、3DES168アルゴリズムを使用してemployee表に対する列暗号化鍵を再生成しています。

例3-15 暗号化列を含む表での暗号化鍵およびアルゴリズムの変更

ALTER TABLE employee REKEY USING '3DES168';

3.3 透過的データ暗号化の管理

この項では、次の項目について説明します。

3.3.1 Oracleウォレットの管理

透過的データ暗号化では、マスター暗号化鍵はOracleウォレット内に格納されます。透過的データ暗号化では、すべてのOracleコンポーネントが共有するデフォルトのデータベース・ウォレットを使用できます。別のウォレットを使用することもできます。ウォレットは、セキュリティ管理者がウォレットを明示的にオープンすることなく、暗号化データにアクセスできる自動ログイン・ウォレットにできます。

3.3.1.1 透過的データ暗号化用の別のウォレットの指定

デフォルトでは、透過的データ暗号化には、デフォルトのデータベース・ウォレットまたはsqlnet.ora構成ファイルのWALLET_LOCATIONパラメータで指定されているウォレットが使用されます。ただし、このウォレットは他のOracleコンポーネントと共有される可能性があるため、透過的データ暗号化に使用するマスター暗号化鍵の格納には、別のウォレットを使用することをお薦めします。別のウォレットを指定するには、sqlnet.oraファイルでENCRYPTION_WALLET_LOCATIONパラメータを設定して、透過的データ暗号化専用のウォレットを指定します。


関連項目:


このパラメータの設定に使用する構文の例については、「サンプルsqlnet.oraファイル」を参照してください。

使用するウォレットを決定する際、透過的データ暗号化では、最初にパラメータENCRYPTION_WALLET_LOCATIONで指定されているウォレットの使用が試行されます。このパラメータが設定されていない場合は、パラメータWALLET_LOCATIONで指定されているウォレットの使用が試行されます。再度失敗した場合、透過的データ暗号化では、デフォルトのデータベース位置でウォレットが検索されます。

3.3.1.2 自動ログイン・ウォレットの使用

自動ログイン・ウォレットは、mkwalletユーティリティまたはOracle Wallet Managerを使用して作成できます。自動ログイン・ウォレットを使用すると、データベース・インスタンスの再起動後に暗号化データに容易にアクセスできます。

透過的データ暗号化で自動ログイン・ウォレットが使用されるのは、その自動ログイン・ウォレットが正しい位置にあり、暗号化ウォレットをオープンするSQLコマンドがまだ実行されていない場合のみです。 自動ログイン・ウォレットの使用中は、ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY passwordコマンドを使用しないでください。


関連項目:


Oracle Wallet Managerを使用して自動ログインを有効にする方法は、「自動ログインの使用方法」を参照してください。

3.3.1.3 ウォレットの作成

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY passwordコマンドを使用してマスター暗号化鍵を作成すると、透過的データ暗号化によって、ウォレットがデフォルトまたは指定の位置に存在しているかどうかがチェックされます。ウォレットが存在しない場合は、ウォレットが自動的に作成されます。

SQLコマンドの他、mkwalletコマンドライン・ユーティリティおよびOracle Wallet Managerを使用してウォレットを作成することもできます。これらは、ウォレットの作成とそのコンテンツの表示および変更を可能にする完全な機能を備えたツールです。


関連項目:


Oracle Wallet Managerの詳細は、第9章「Oracle Wallet Managerの使用方法」を参照してください。

3.3.2 マスター暗号化鍵のバックアップおよびリカバリ

この項では、次の項目について説明します。

3.3.2.1 Oracleウォレットのバックアップおよびリカバリ

暗号化データには、マスター暗号化鍵なしでアクセスすることはできません。マスター暗号化鍵はOracleウォレットに格納されるため、ウォレットは、安全な場所に定期的にバックアップする必要があります。新しいマスター暗号化鍵を設定するたびにウォレットのバックアップ・コピーを作成する必要があります。

Oracleウォレットは、暗号化データと一緒にバックアップしないでください。ウォレットは個別にバックアップする必要があります。自動ログイン・ウォレットを使用している場合は、オープン時にパスワードが要求されないため、特に注意してください。バックアップ・テープの紛失に備えて、悪意のあるユーザーが暗号化データとウォレットの両方を取得できないようにすることが大切です。

Recovery Manager(RMAN)では、ウォレットは、データベース・バックアップの一環としてバックアップされません。Oracle Secure Backup(OSB)などのメディア・マネージャをRMANと併用している場合は、OSBによって、自動オープン・ウォレット(cwallet.ssoファイル)がバックアップ対象から自動的に除外されます。ただし、暗号化ウォレット(ewallet.p12ファイル)は自動的には除外されません。賢明な習慣として、次のexcludeデータセット文をOSB構成に追加することをお薦めします。

exclude name *.p12

この文は、バックアップ・セットから暗号化ウォレットを除外することをOSBに指示します。

マスター暗号化鍵を格納しているウォレットに障害が発生した場合は、ウォレットのバックアップを適切な場所にコピーすることで、暗号化データへのアクセスをリストアできます。最後にマスター暗号化鍵を再設定した後にリストアしたウォレットがアーカイブされた場合、追加処置の必要はありません。

リストアしたウォレットに最新のマスター暗号化鍵が含まれていない場合に、古いデータをマスター暗号化鍵が再設定された時点までリカバリするには、データベースの状態をその時点までロールバックします。マスター暗号化鍵の再設定後に行われた暗号化列に対するすべての変更は失われます。

3.3.2.2 PKI鍵ペアのバックアップおよびリカバリ

透過的データ暗号化では、マスター暗号化鍵としてPKI非対称鍵ペアをサポートしています。これにより、主要な認証局ベンダーの既存の鍵のバックアップ、供託およびリカバリ機能を活用できます。

現在の鍵供託またはリカバリ・システムでは、鍵のリカバリ機能を提供する認証局に通常、秘密鍵のバージョンまたは秘密鍵のリカバリに役立つ情報が格納されています。秘密鍵が失われた場合、ユーザーは、認証局に連絡し、鍵のリカバリ・プロセスを開始することで、元の鍵および証明書をリカバリできます。

通常、鍵のリカバリ・プロセスは自動化されており、ユーザーは認証局に対して特定の認証資格証明を提示する必要があります。透過的データ暗号化では、リカバリされる鍵およびその関連証明書は、Oracleウォレットにインポート可能なPKCS#12ファイルである必要があるという制限以外に鍵のリカバリ・プロセスに制限を加えていません。この要件は、主要な認証局の鍵のリカバリ・メカニズムと一致しています。

元の証明書および秘密鍵を含むPKCS#12ファイルの取得後は、以前のウォレットと同じ位置に新しい空のウォレットを作成する必要があります。このためには、mkwalletコマンドライン・ユーティリティまたはOracle Wallet Managerを使用できます。次に、同じユーティリティを使用してPKCS#12ファイルをウォレットにインポートできます。ウォレットを保護するために強力なパスワードを選択する必要があります。

ウォレットが作成され、正しい証明書がインポートされた後、データベースにログインし、SQLプロンプトで次のコマンドを実行して、リカバリ・プロセスを完了します。

ALTER SYSTEM SET ENCRYPTION KEY certificate_id IDENTIFIED BY wallet_password

ウォレット内の証明書のcertificate_idを取得するには、ウォレットがオープンしてからV$WALLET固定ビューを問い合せます。

3.3.3 暗号化列を含む表のエクスポートとインポート

暗号化列を含む表をエクスポートする場合は、次の点が重要になります。

  • 転送中も機密データが解読不可能であること

  • 宛先にインポートされた後、機密データが権限のあるユーザーによって復号化できること

暗号化列を含む表のインポートとエクスポートには、Oracle Data Pumpユーティリティを使用できます。Oracle Data Pumpでは、ENCRYPTIONパラメータを利用してダンプ・ファイル・セットのデータを暗号化できるようにします。ENCRYPTIONパラメータには、次の値を指定できます。

  • ENCRYPTED_COLUMNS_ONLY: 暗号化列が暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • DATA_ONLY: すべてのデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • METADATA_ONLY: すべてのメタデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • ALL: すべてのデータとメタデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。

  • NONE: ダンプ・ファイル・セットに対して暗号化は使用されません。

ENCRYPTION=ENCRYPTED_COLUMNS_ONLYを使用して、暗号化列を含む表をエクスポートおよびインポートする手順は、次のとおりです。

  1. 暗号化列を含む表をエクスポートする前に、暗号化ウォレットがオープンしていることを確認する必要があります。これは、暗号化列の復号には列暗号化鍵を使用する必要があり、そのためにはマスター暗号化鍵にアクセスすることが必要になるためです。列は、エクスポートされる前にパスワードを使用して再暗号化されます。

  2. エクスポート・ダンプ・ファイル・セットの列データを暗号化する際に使用するパスワードは、ENCRYPTION_PASSWORDパラメータを使用して指定します。次に、employee_data表をエクスポートする例を示します。

    expdp hr TABLES=employee_data DIRECTORY=dpump_dir
    DUMPFILE=dpcd2be1.dmp ENCRYPTION=ENCRYPTED_COLUMNS_ONLY
    ENCRYPTION_PASSWORD=PWD2encrypt
    
    Password: password_for_hr
    
  3. ターゲット・データベースにデータをインポートする際は、同じパスワードを指定する必要があります。このパスワードは、データの復号化に使用されます。データは、ターゲット・データベースに生成された新しい列暗号化鍵を使用して再暗号化されます。マスター暗号化鍵にアクセスするために、ターゲット・データベースではウォレットがオープンしている必要があります。次に、employee_data表をインポートする例を示します。

    impdp hr TABLES=employee_data DIRECTORY=dpump_dir DUMPFILE=dpcd2be1.dmp ENCRYPTION_PASSWORD=PWD2encrypt
    
    Password: password_for_hr
    

Oracle Database 11g リリース1(11.1)では、Oracle Data Pumpの機能が拡張されています。透過的データ暗号化列のみの暗号化とは対照的に、ダンプ・セット全体を暗号化できます。ENCRYPTION_MODEパラメータを使用すると、暗号化モードを指定できます。

ENCRYPTION_MODE=DUALでは、ウォレットに格納されているマスター鍵と指定されたパスワードを使用して、ダンプ・セットが暗号化されます。次に、dual暗号化モードの使用例を示します。

expdp hr DIRECTORY=dpump_dir1 DUMPFILE=hr_enc.dmp
ENCRYPTION=all ENCRYPTION_PASSWORD=PWD2encrypt
ENCRYPTION_ALGORITHM=AES256 ENCRYPTION_MODE=dual

Password: password_for_hr

インポートでは、パスワードまたはウォレット・マスター鍵のいずれかを使用してデータを復号化できます。パスワードが提供されない場合、データの復号化にはウォレットのマスター鍵が使用されます。ターゲット・データベースにはウォレットが存在し、オープンしている必要があります。このオープン・ウォレットは、ターゲット・データベースで列暗号化データを再暗号化する際にも必要です。

ENCRYPTION_MODE=TRANSPARENTを使用すると、ウォレットに保管されているマスター暗号化鍵を使用してダンプ・ファイル・セットを透過的に暗号化できます。この場合、パスワードは不要です。インポートの過程で復号化が正常に実行されるためには、ターゲット・データベースにウォレットが存在し、オープンしている必要があります。このオープン・ウォレットは、ターゲット・データベースで列暗号化データを再暗号化する際にも必要です。


関連項目:

  • Oracle Data Pumpの使用方法と関連する暗号化パラメータの詳細は、『Oracle Databaseユーティリティ』のデータ・ポンプの概要、データ・ポンプ・エクスポートおよびデータ・ポンプ・インポートに関する説明を参照してください。

  • 「外部表への暗号化列の作成方法」


3.3.4 パフォーマンスと記憶域のオーバーヘッド

透過的データ暗号化に関連するオーバーヘッドは、次のように分類されます。

3.3.4.1 パフォーマンスに関するオーバーヘッド

透過的データ暗号化がパフォーマンスに影響を与えるのは、暗号化列に対してデータの取得または挿入が行われた場合のみです。暗号化されていない列に関係する操作の場合は、これらの列が暗号化列を含む表内にあっても、パフォーマンスが低下することはありません。

暗号化列のデータへのアクセスには僅かなオーバーヘッドを伴います。一般的な属性(クレジット・カード番号など)の暗号化または復号化に関連するオーバーヘッドは、約5%と推定されます。これは、SELECT操作(復号化に必要)またはINSERT操作(暗号化に必要)では、クリアテキスト・データで取得する場合よりも約5%長い時間が必要になることを意味します。

全体的なパフォーマンスのオーバーヘッドは、暗号化列の数とそのアクセス頻度によって異なります。最も暗号化する必要のある列は、最高機密のデータを含む列です。

既存の表で暗号化を有効にすると、表の特性を変更する他のALTER TABLE操作と同様に、完全な表更新が行われます。管理者は、大規模な既存の表で暗号化を有効にする前に、データベース・サーバーに与えるパフォーマンスおよびREDOログの潜在的な影響を考慮する必要があります。

表に対する書込み操作は、暗号化が有効な間、列鍵が再作成される間、または暗号化アルゴリズムが変更されている間、一時的にアクセスできなくなる場合があります。このような処理が実行されている場合は、表のオンライン再定義を使用して、表への書込み操作が可能かどうかを確認できます。

大規模な表で透過的データ暗号化が有効になっている場合、操作に対応できるよう、REDOログのサイズを大きくする必要がある場合があります。

索引の付いた列の暗号化には、索引のない列の暗号化よりも多くの時間を要することもすでに判明しています。索引の付いた列を暗号化する必要がある場合は、索引を削除してから列を暗号化し、その後で索引を再度作成できます。

暗号化列に索引を付けると、その索引は暗号化された値に対して作成されます。暗号化列の値を問い合せると、SQL問合せで使用される値が透過的に暗号化されます。索引の参照は、暗号化された値を使用して実行されます。

3.3.4.2 記憶域に関するオーバーヘッド

暗号化データには、クリアテキスト・データより多くの記憶域が必要です。暗号化された各値は、20バイトの整合性チェックに関連付けられます。さらに、透過的データ暗号化では、暗号化された値が16バイトに拡張されます。これは、クレジット・カード番号の格納に9バイトが必要な場合、クレジット・カード番号を暗号化して格納するには、さらに7バイトが必要になることを意味します。また、saltを使用してデータを暗号化した場合は、暗号化された各値を保管するために、さらに16バイトの記憶域が必要になります。

つまり、1つの列を暗号化すると、各行について平均32〜48バイトの追加記憶域が必要になります。

3.3.5 セキュリティに関する考慮事項

透過的データ暗号化を使用する場合のセキュリティに関する考慮事項は、全システム・セキュリティの広範囲に適用されます。セキュリティ管理者は、対処するリスクのレベルと、サイトで保持されるデータの機密度を識別する必要があります。受入れ可能な保護を実現する別の方法について、コストおよび利点を評価する必要があります。多くの場合、暗号化データに対して別のセキュリティ管理者、別のウォレット、および保護されたバックアップ・プロシージャを設定することが望ましい方法です。別のウォレットを設定すると、他のOracleコンポーネントに対して自動ログインが許可されますが、透過的データ暗号化のウォレットに対するパスワード保護は保持されます。

その他のセキュリティに関する考慮事項は、透過的データ暗号化を使用している場合の通常のデータベースおよびネットワーク操作に適用されます。暗号化列のデータは、データ・ファイル、UNDOログ、REDOログおよびシステム・グローバル領域(SGA)のバッファ・キャッシュ内では暗号化されたままになります。一方、データは式の評価時に復号化されるため、復号化したデータは、ディスク上のスワップ・ファイルに表示できます。権限を付与されたオペレーティング・システム・ユーザーは、このデータを潜在的に表示できます。

透過的データ暗号化を使用して暗号化された列値は、暗号化された形式でデータ・ファイルに格納されます。ただし、これらのデータ・ファイルには、表に対する過去のデータ操作で残されたゴースト・コピーと呼ばれるクリアテキストの断片が含まれている場合があります。これは、オペレーティング・システムによってファイルが削除された後に、ディスク上にデータが残存している場合に類似しています。

古いクリアテキストの断片は、それらの値を含んでいるブロックがデータベースによって上書きされるまで、しばらく存在し続ける可能性があります。権限を付与されているオペレーティング・システム・ユーザーがデータベースのアクセス制御をバイパスした場合、そのユーザーは、表領域を保持するデータ・ファイル内のこれらの値に直接アクセスする可能性があります。このリスクを最小限にする手順は、次のとおりです。

  1. 新しいデータ・ファイルに新しい表領域を作成します。作成には、CREATE TABLESPACE文を使用します。

  2. 暗号化列を含む表を新しい表領域に移動します。移動には、ALTER TABLE.....MOVE文を使用します。元の表領域のすべてのオブジェクトについて、この手順を繰り返します。

  3. 元の表領域を削除します。削除するには、DROP TABLESPACE tablespace INCLUDING CONTENTS KEEP DATAFILES文を使用します。データ・ファイルは、プラットフォーム固有のユーティリティを使用して安全に削除することをお薦めします。

  4. 古いデータ・ファイルを安全に削除するには、プラットフォームおよびファイル・システムに固有のユーティリティを使用してください。このようなユーティリティの例には、shred(Linuxの場合)やsdelete(Windowsの場合)などがあります。

3.3.6 分散環境でのレプリケーション

Oracle Data Guardは透過的データ暗号化をサポートしています。プライマリ・データベースで透過的データ暗号化を使用する場合、Data Guard構成の各スタンバイ・データベースには、プライマリ・データベースからの暗号化ウォレットのコピーが必要です。プライマリ・データベースでマスター暗号化鍵を再設定した場合は、そのマスター暗号化鍵が格納されているウォレットを各スタンバイ・データベースにコピーする必要があります。


関連項目:


透過的データ暗号化とロジカル・スタンバイ・データベースの併用については、『Oracle Data Guard概要および管理』の付録Cを参照してください。

透過的データ暗号化は、SQL*Loaderのダイレクト・パス・ロードを使用して機能します。暗号化列にロードされるデータは、ダイレクト・パス・ロードの過程で透過的に暗号化されます。

マテリアライズド・ビューの列も暗号化できます。ただし、マテリアライズド・ビュー・ログに暗号化列を含めることはできません。


関連項目:


マテリアライズド・ビューの詳細は、『Oracle Databaseアドバンスト・レプリケーション』のマテリアライズド・ビューの概念とアーキテクチャに関する説明を参照してください。

3.3.7 OCIを使用した透過的データ暗号化

行を使用可能にする鍵は受信ポイントでは使用できないため、行の送信は使用できません。

3.3.8 透過的データ暗号化のデータ・ディクショナリ・ビュー

次のデータ・ディクショナリ・ビューは、列の暗号化に使用する暗号化アルゴリズムに関する情報を保持します。

  • DBA_ENCRYPTED_COLUMNS

  • ALL_ENCRYPTED_COLUMNS

    特定のユーザーがアクセス可能なすべての表の列の暗号化に使用するアルゴリズムを表示します。

  • USER_ENCRYPTED_COLUMNS

    特定ユーザーのスキーマ内にあるすべての表の列の暗号化に使用するアルゴリズムを表示します。


関連項目:


これらのデータ・ディクショナリ・ビューの完全な説明については、『Oracle Databaseリファレンス』を参照してください。

3.4 表領域暗号化の概要

表領域暗号化を使用すると、表領域全体を暗号化できます。 暗号化された表領域内に作成されるオブジェクトはすべて自動的に暗号化されます。表領域暗号化は、表内の機密データを保護する場合に便利です。暗号化が必要な列を判断するために、各表の列について詳細分析を実行する必要はありません。

表領域暗号化は、表の複数の列に機密データが含まれている場合や個々の列ではなく表全体を保護する場合に、列ベースの透過的データ暗号化にかわる有効な代替手段です。

表領域暗号化では、暗号化された表領域内に格納されているデータはすべて暗号化されます。 この場合、BLOBCLOBなどの内部ラージ・オブジェクト(LOB)も暗号化の対象となります。 表領域暗号化では、表領域の外部に格納されているデータは暗号化されません。たとえば、データベース外部に格納されるBFILEデータは暗号化されません。暗号化された表領域内でBFILE列を含む表を作成した場合、この特別な列は暗号化されません。

暗号化された表領域内のすべてのデータは、ディスク上に暗号化された形式で格納されます。データの表示または変更に必要な権限を付与されているユーザーに対しては、データが透過的に復号化されます。データベース・ユーザーは、特定の表がディスク上で暗号化されているかどうかを認識する必要はありません。ディスク上のデータ・ファイルまたはバックアップ・メディアが盗まれた場合でも、データの安全性は損なわれません。

表領域暗号化は、透過的データ暗号化アーキテクチャを使用して表領域を透過的に暗号化(および復号化)します。表領域暗号化のマスター鍵は、透過的データ暗号化のマスター鍵の格納に使用されるウォレットと同じOracleウォレットに格納されます。この表領域暗号化のマスター鍵は表領域暗号化鍵の暗号化に使用され、表領域暗号化鍵は表領域のデータの暗号化と復号化に使用されます。

暗号化データは、JOINSORTなどの操作中も保護されます。これは、データが一時表領域に移動される場合に安全であることを意味します。UNDOログとREDOログのデータも保護されます。

表領域暗号化を使用すると、暗号化された表領域のデータに対して索引レンジ・スキャンを実行することもできます。索引レンジ・スキャンは、列ベースの透過的データ暗号化では実行できません。

3.5 表領域暗号化の使用

表領域暗号化を使用するには、Oracle Database 11g リリース1(11.1)を実行する必要があります。以前のリリースからアップグレードした場合は、データベースの互換性を11.0.0以上に設定する必要があります。


注意:


COMPATIBLE初期化パラメータを使用して更新したデータベース互換性を元に戻すことはできません。

次に、表領域暗号化を実装する手順を説明します。

3.5.1 表領域マスター暗号化鍵の設定

表領域のマスター暗号化鍵の設定は、1回かぎりの操作です。この設定によって、表領域を暗号化するためのマスター暗号化鍵が作成されます。この鍵は外部セキュリティ・モジュール(Oracleウォレット)に格納され、表領域暗号化鍵を暗号化する際に使用されます。

表領域暗号化では、マスター暗号化鍵の格納に、列ベースの透過的データ暗号化で使用されるソフトウェア・ウォレットと同じソフトウェア・ウォレットが使用されます。 sqlnet.oraファイルのENCRYPTION_WALLET_LOCATION(またはWALLET_LOCATION)パラメータが、正しいソフトウェア・ウォレット・ロケーションを指し示していることを確認してください。例:

ENCRYPTION_WALLET_LOCATION=
  (SOURCE=(METHOD=FILE)(METHOD_DATA=
   (DIRECTORY=/u01/app/oracle/product/11.1.0/db_1/)))

透過的データ暗号化用にマスター暗号化鍵を作成すると、表領域暗号化用のマスター暗号化鍵も作成されます。マスター暗号化鍵の作成については、「マスター暗号化鍵の設定」を参照してください。

Oracle Database 10g リリース2(10.2)で透過的データ暗号化をすでに使用していて、その後データベースおよび互換性を11g にアップグレードした場合は、ALTER SYSTEM SET ENCRYPTION KEYコマンドを再発行して、表領域暗号化用のマスター暗号化鍵を作成する必要があります。

ALTER SYSTEM SET ENCRYPTION KEYコマンドを発行すると、マスター鍵がすでに存在している場合は、透過的データ暗号化の標準的なマスター鍵が再作成され、表領域の新しいマスター暗号化鍵が作成されます。表領域のマスター暗号化鍵がすでに存在している場合、新しい鍵は作成されません。


注意:


表領域の暗号化鍵は再作成(REKEY)できません。

3.5.2 Oracleウォレットのオープン

暗号化された表領域を作成するには、その前に、表領域のマスター暗号化鍵が格納されているOracleウォレットをオープンする必要があります。また、このウォレットは、暗号化された表領域のデータにアクセスする前にオープンしている必要があります。Oracleウォレットのオープン方法については、「暗号化ウォレットのオープン」を参照してください。


注意:


セキュリティ管理者は、Oracleインスタンスを開始した後にOracleウォレットをオープンする必要があります。Oracleインスタンスを再開するには、セキュリティ管理者がウォレットを再度オープンする必要があります。

Oracle Real Application Clusters(RAC)インスタンスを使用している場合、セキュリティ管理者は、各インスタンスについてウォレットがオープンしていることを確認してください。これは、Oracle RACインスタンスには暗号化および復号化操作の実行が要求される可能性があるためです。

セキュリティ管理者は、データベースのリカバリ操作を実行する前にもウォレットをオープンする必要があります。これは、バックグラウンド・プロセスで、暗号化されたREDOログおよびUNDOログへのアクセスが必要になる可能性があるためです。データベースのリカバリを実行するときは、データベースをオープンする前にウォレットをオープンする必要があります。次に例を示します。

SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY password;
SQL> ALTER DATABASE OPEN;

明示的にオープンする必要があるウォレットが提供する特別なセキュリティを必要としない環境では、自動ログイン・ウォレットを使用することもできます。ただし、この方法はお薦めしません。

3.5.3 暗号化された表領域の作成

暗号化された表領域は、CREATE TABLESPACEコマンドを使用して作成できます。permanent_tablespace_clauseを使用すると、暗号化アルゴリズムと暗号化鍵の長さを選択できます。storage_clauseENCRYPTキーワードによって、表領域が暗号化されます。構文は、次のとおりです。

CREATE
   [ BIGFILE | SMALLFILE ]
   { permanent_tablespace_clause
   | temporary_tablespace_clause
   | undo_tablespace_clause
   } ;

この場合、

permanent_tablespace_clause=
TABLESPACE tablespace
.........
ENCRYPTION [USING algorithm]
.........
storage_clause
.........

この場合、

storage_clause=
.........
[ENCRYPT]
.........

ここで、

algorithmには、次のいずれかの値を指定できます。

  • 3DES168

  • AES128

  • AES192

  • AES256

鍵の長さは、アルゴリズム自体の名前に含まれています。暗号化アルゴリズムを指定しないと、デフォルトの暗号化アルゴリズムが使用されます。デフォルトの暗号化アルゴリズムはAES128です。


注意:

  • permanent_tablespace_clauseENCRYPTIONキーワードは、暗号化アルゴリズムの指定に使用されます。表領域は、storage_clauseENCRYPTキーワードによって実際に暗号化されます。

  • セキュリティ上の理由から、NO SALTオプションでは表領域を暗号化できません。



関連項目:


CREATE TABLESPACEコマンドの構文については、『Oracle Database SQLリファレンス』を参照してください。

例3-16は、securespaceという表領域を作成しています。この表領域は、3DESアルゴリズムを使用して暗号化されます。キーは168ビット長です。

例3-16 暗号化された表領域の作成

CREATE TABLESPACE securespace
DATAFILE '/home/user/oradata/secure01.dbf'
SIZE 150M
ENCRYPTION USING '3DES168'
DEFAULT STORAGE(ENCRYPT);

例3-17は、securespace2という表領域を作成しています。暗号化アルゴリズムの指定がないため、デフォルトの暗号化アルゴリズム(AES128)が使用されます。キーは128ビット長です。

例3-17 暗号化された表領域の作成

CREATE TABLESPACE securespace2
DATAFILE '/home/user/oradata/secure01.dbf'
SIZE 150M
ENCRYPTION
DEFAULT STORAGE(ENCRYPT);

次のデータ・ディクショナリ・ビューには、表領域の暗号化状態に関する情報が保持されます。次のビューを問い合せて、表領域が暗号化されたことを確認できます。

  • DBA_TABLESPACES: ENCRYPTED列に、表領域が暗号化されているかどうかが表示されます。

  • USER_TABLESPACES: ENCRYPTED列に、表領域が暗号化されているかどうかが表示されます。


関連項目:


これらのデータ・ディクショナリ・ビューの完全な説明については、『Oracle Databaseリファレンス』を参照してください。

既存の表領域は暗号化できません。ただし、Oracle Data Pumpユーティリティを使用して、暗号化された表領域にデータをインポートすることはできます。 CREATE TABLE...AS SELECT...ALTER TABLE...MOVE...などのSQLコマンドを使用して、暗号化された表領域にデータを移動することもできます。 CREATE TABLE...AS SELECT...コマンドでは、表を既存の表から作成できます。 ALTER TABLE...MOVE...コマンドでは、表を暗号化された表領域に移動できます。


関連項目:


CREATE TABLEおよびALTER TABLEコマンドの詳細は、『Oracle Database SQLリファレンス』を参照してください。

3.6 ハードウェア・セキュリティ・モジュールの概要

ハードウェア・セキュリティ・モジュール(HSM)は、暗号化鍵のために安全な記憶域を提供する物理的なデバイスです。暗号化および復号化の操作を実行するための安全な計算領域(メモリー)も提供します。HSMは、Oracleウォレットにかわる安全性の高い代替手段です。

透過的データ暗号化では、機密データに対して強化されたセキュリティを提供するためにHSMを使用できます。HSMは、透過的データ暗号化に使用されるマスター暗号化鍵の格納に使用されます。HSMは物理的なデバイスであり、オペレーティング・システム・ファイルではないため、鍵は、許可されていないアクセスの試みから保護されます。マスター暗号化鍵を使用する暗号化および復号化のすべての操作は、HSMの内部で実行されます。これは、安全性の低いメモリー内でもマスター暗号化鍵が危険にさらされないことを意味します。

3.7 ハードウェア・セキュリティ・モジュールの使用

HSMを使用する手続きには、HSMデバイスの初期設定が含まれます。HSMを使用するには、透過的データ暗号化も構成する必要があります。初期設定を実行した後は、HSMをOracleソフトウェア・ウォレットと同様に使用できます。次に、ハードウェア・セキュリティ・モジュールを構成および使用する手順を説明します。

  1. sqlnet.oraファイルへのENCRYPTION_WALLET_LOCATIONパラメータの設定

  2. 正しいパスへのPKCS#11ライブラリのコピー

  3. HSMの設定

  4. HSMベースの暗号化のためのマスター暗号化鍵の生成

  5. ソフトウェア・ウォレットの再構成(オプション)

  6. HSMがアクセス可能であることの確認

  7. データの暗号化と復号化

3.7.1 sqlnet.oraファイルへのENCRYPTION_WALLET_LOCATIONパラメータの設定

ENCRYPTION_WALLET_LOCATIONパラメータは、Oracleウォレットの位置を指定します。ソフトウェア・ウォレットのかわりにHSMを使用することを反映するには、このパラメータを変更する必要があります。

ENCRYPTION_WALLET_LOCATIONパラメータを設定する手順は、次のとおりです。

  1. sqlnet.oraファイルを開きます。このファイルは、$ORACLE_HOME/network/adminディレクトリにあります。

  2. ENCRYPTION_WALLET_LOCATIONパラメータを検索します。METHOD値をHSMに変更します。

    ENCRYPTION_WALLET_LOCATION=
      (SOURCE=(METHOD=HSM)(METHOD_DATA=
        (DIRECTORY=/app/oracle/admin/SID1/wallet)))
    

    注意:


    ENCRYPTION_WALLET_LOCATIONパラメータにDIRECTORY値が指定されている場合は、その値を削除しないでください。DIRECTORY値はHSMには不要ですが、HSMベースの透過的データ暗号化に移行する場合は、この値を使用して古いソフトウェア・ウォレットの位置が特定されます。また、DIRECTORY値は、Recovery Manager(RMAN)などのツールでは、ソフトウェア・ウォレットの位置を特定するために必要な場合があります。

    sqlnet.oraファイルにENCRYPTION_WALLET_LOCATIONパラメータが指定されていない場合は、このパラメータを追加する必要があります。sqlnet.oraファイルの最後に、次のようにパラメータを追加します。

    ENCRYPTION_WALLET_LOCATION=(SOURCE=(METHOD=HSM))
    
  3. ファイルを保存して閉じます。

3.7.2 正しいパスへのPKCS#11ライブラリのコピー

関連するPKCS#11ライブラリは、HSMベンダーによって提供されます。このライブラリは、データベースが検出できるように、特定のディレクトリ構造にコピーする必要があります。UNIXおよびWindowsでは、次のディレクトリ構造をそれぞれ使用します。

/opt/oracle/extapi/[32,64]/hsm/{VENDOR}/{VERSION}/libapiname.ext

%SYSTEM_DRIVE%\oracle\extapi\[32,64]\hsm\{VENDOR}\{VERSION}\libapiname.ext

ここで、

[32,64]には、提供されるバイナリが32ビットか64ビットかを指定します。

VENDORは、ライブラリを提供しているベンダー名を表します。

VERSIONは、ライブラリのバージョンを示します。なるべく、number.number.numberの形式を使用してください。

apinameには、特に決まった形式はありません。ただし、構文に記載されているように、apinameの前にはlibという語を付ける必要があります。

extは、ライブラリ・ファイルの拡張子で置換する必要があります。


注意:


一度にサポートされるのは、1つのPKCS#11ライブラリのみです。新しいベンダーのHSMを使用する場合は、PKCS#11ライブラリを以前のベンダーから新しいベンダーに置換してください。

3.7.3 HSMの設定

HSMインタフェースを設定するための指示は、HSMベンダーによって提供されます。HSM管理インタフェースを使用し、ベンダーの指示に従ってHSMを設定してください。データベースがHSMとの相互作用に使用するユーザー・アカウントとパスワードを作成します。


注意:


HSMは、透過的データ暗号化の管理を担当するセキュリティ管理者が設定します。

3.7.4 HSMベースの暗号化のためのマスター暗号化鍵の生成

HSMベースの暗号化の使用を開始するには、HSM内部に格納されるマスター暗号化鍵を作成する必要があります。このマスター暗号化鍵は、HSM内部での列暗号化鍵の暗号化または復号化に使用されます。

マスター暗号化鍵を作成するには、次のコマンドを使用します。

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY user_Id:password [MIGRATE USING wallet_password]

ここで、

user_Idは、HSM管理インタフェースを使用してデータベースに対して作成したユーザーIDです。

passwordは、HSM管理インタフェースを使用してユーザーIDに対して作成したパスワードです。user_Id:password文字列は、二重引用符(" ")で囲みます。

wallet_passwordは、ファイル・システム上の既存のOracleウォレットをオープンする際に必要なパスワードです。wallet_password文字列は、二重引用符(" ")で囲みます。


注意:


user_Idpasswordは自動的には作成されません。これらは、ALTER SYSTEM SET ENCRYPTION KEYコマンドを発行する前に、HSM管理インタフェースを使用して設定しておく必要があります。これは、Oracleウォレットに使用される手順とは異なります。Oracleウォレットでは、ALTER SYSTEM SET ENCRYPTION KEYコマンドを発行する前に、前述の設定を行う必要はありません。

透過的データ暗号化をすでに使用していて、HSMを使用していない場合は、前述のコマンドでMIGRATE USING wallet_password句を使用する必要があります。この指定によって、既存の列暗号化鍵が復号化され、新しく作成したHSMベースのマスター暗号化鍵を使用して列暗号化鍵が再度暗号化されます。


注意:


データベースに公開鍵を使用して暗号化した列が含まれている場合は、その列が復号化され、HSMベースの透過的データ暗号化によって生成されたAES対称鍵を使用して再度暗号化されます。

表領域暗号化をすでに使用していて、HSMを使用していない場合は、表領域暗号化ではすべての暗号化および復号化の操作で引き続き同じソフトウェア・ウォレットを使用します。 既存の表領域のマスター暗号化鍵は、HSMに移行できません。


注意:


表領域のマスター暗号化鍵は、ソフトウェア・ウォレットで表領域のマスター暗号化鍵を作成していない場合にかぎり、HSMに作成されます。

3.7.5 ソフトウェア・ウォレットの再構成(オプション)

この手順は、すでに表領域暗号化にソフトウェア・ウォレットを使用している場合に当てはまります。この手順は、暗号化データをエクスポートした場合や、ソフトウェア・ウォレットを使用して暗号化したバックアップを作成した場合にも必要です。

表領域暗号化では、ソフトウェア・ウォレットを使用して表領域のマスター暗号化鍵にアクセスします。また、Oracle Data PumpやRecovery Managerなどのツールでは、ソフトウェア・ウォレットを使用してエクスポートまたはバックアップしたデータに対して復号化および暗号化の操作を実行する際に、古いソフトウェア・ウォレットにアクセスする必要があります。

ソフトウェア・ウォレットを再構成するには、次のいずれかのアプローチを使用できます。

  • ウォレット・パスワードをHSMのuserId:password文字列に変更する方法。ここで、

    user_Idは、HSM管理インタフェースを使用してデータベースに対して作成したユーザーIDです。

    passwordは、HSM管理インタフェースを使用してユーザーIDに対して作成したパスワードです。user_Id:password文字列は、二重引用符(" ")で囲みます。

    ソフトウェア・ウォレットのパスワードは、Oracle Wallet Managerを使用して変更します。


    関連項目:


    ウォレット・パスワードの変更に関する詳細は、「パスワードの変更」を参照してください。

  • 自動ログイン・ウォレットを使用する方法。自動ログイン・ウォレットのファイルは、.ssoの拡張子で識別されます。自動ログイン・ウォレットは、明示的なオープンを必要とするウォレットで提供される特別なセキュリティが不要な環境の場合にのみ使用してください。


    関連項目:


    Oracle Wallet Managerを使用して自動ログインを有効にする方法は、「自動ログインの使用方法」を参照してください。

3.7.6 HSMがアクセス可能であることの確認

セキュリティ管理者は、暗号化または復号化を実行する前に、HSMがデータベースにアクセスできることを確認する必要があります。これは、Oracleウォレットのオープンに類似しています。HSMをアクセス可能にするには、次のコマンドを使用します。

ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY user_Id:password

ここで、

user_Idは、HSM管理インタフェースを使用してデータベースに対して作成したユーザーIDです。

passwordは、HSM管理インタフェースを使用してユーザーIDに対して作成したパスワードです。

user_Id:password文字列は、二重引用符(" ")で囲みます。


注意:


HSMへのアクセスは、データベース・インスタンスが再開されるたびに再度有効化する必要があります。

セキュリティ管理者は、ALTER SYSTEM SET WALLET CLOSEコマンドを使用してHSMへのアクセスを無効にできます。これによって、HSMでの暗号化および復号化のすべての操作が無効になります。データベース・ユーザーは、ウォレットが再度オープンされるまで、暗号化データに関係する操作を実行できません。たとえば、HSMがアクセス可能でない場合、次の操作は失敗します。

  • 暗号化列からのデータのSELECT

  • 暗号化列に対するデータのINSERT

  • 暗号化列を含む表のCREATE

  • 列の暗号化プロパティのALTER

3.7.7 データの暗号化と復号化

HSMの使用はエンド・ユーザーに透過的です。 暗号化列を含む表を作成するコマンド、暗号化データにアクセスするコマンド、またはデータを復号化するコマンドは、マスター暗号化鍵がOracleウォレットにある場合もHSMにある場合も同じです。

3.8 透過的データ暗号化と表領域暗号化のスタート・ガイド

ここでは、透過的データ暗号化と表領域暗号化の開始に役立つチュートリアル・アプローチを使用します。次の各タスクについてサンプル・シナリオを使用して説明します。

3.8.1 透過的データ暗号化用データベースの準備

透過的データ暗号化の使用を開始するには、最初にデータベースを準備します。このためには、Oracleウォレット・ロケーションを指定してマスター暗号化鍵を設定する必要があります。次に、透過的データ暗号化を使用するためのデータベースを準備する手順を説明します。

  1. sqlnet.oraファイルへのOracleウォレット・ロケーションの指定

  2. マスター暗号化鍵の作成

  3. Oracleウォレットのオープン

3.8.1.1 sqlnet.oraファイルへのOracleウォレット・ロケーションの指定

$ORACLE_HOME/network/adminにあるsqlnet.oraファイルを開きます。ファイルの最後に、次の行を入力します。

ENCRYPTION_WALLET_LOCATION=
  (SOURCE=(METHOD=FILE)(METHOD_DATA=
   (DIRECTORY=/u01/app/oracle/product/11.1.0/db_1/)))

変更内容を保存してファイルを閉じます。


注意:


暗号化ウォレットには任意のディレクトリを選択できますが、そのパスでは、データベースのインストール時に作成した不明瞭化された標準ウォレット(cwallet.sso)を指定しないでください。

3.8.1.2 マスター暗号化鍵の作成

次に、マスター暗号化鍵を作成する必要があります。このマスター暗号化鍵は、列暗号化鍵の暗号化に使用されます。マスター暗号化鍵を作成するには、次のコマンドを入力します。

SQL> ALTER SYSTEM SET KEY IDENTIFIED BY "welcome1";

このコマンドによって、次の内容が実行されます。

  • 暗号化ウォレットが指定のディレクトリに存在していない場合は、暗号化ウォレット(ewallet.p12)が作成され、このウォレットがオープンされて、透過的データ暗号化用のマスター暗号化鍵が作成(または再作成)されます。

  • 暗号化ウォレットが指定のディレクトリに存在している場合は、そのウォレットがオープンされて、透過的データ暗号化用のマスター暗号化鍵が作成(または再作成)されます。


注意:

  • マスター暗号化鍵は、データを新しい暗号化鍵で再暗号化しないかぎり1回のみ作成してください。

  • マスター暗号化鍵の作成またはウォレットのオープンを実行できるのは、ALTER SYSTEM権限が付与されているユーザーのみです。


3.8.1.3 Oracleウォレットのオープン

Oracleウォレットは、データベースが停止するたびにクローズします。このウォレットは明示的にクローズすることもできます。

暗号化または復号化の操作を実行するには、その前に、Oracleウォレットがオープンしていることを確認する必要があります。マスター暗号化鍵が格納されているウォレットをオープンするには、次のコマンドを使用します。

ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "welcome1";

注意:


前述のコマンドで使用したパスワードは、マスター暗号化鍵の作成で使用したパスワードと同じです。このパスワードは、ウォレットをオープンし、マスター暗号化鍵をアクセス可能にするためのパスワードになります。

3.8.2 暗号化列を含む表の作成

この時点では、暗号化列を含む表を作成できるようになっています。ここでは、cust_payment_infoという表を作成します。この表にはcredit_card_numberという列が含まれます。このcredit_card_number列には、暗号化する必要がある機密データが格納されます。表を作成するには、次のコマンドを使用します。

CREATE TABLE cust_payment_info
  (first_name VARCHAR2(11),
  last_name VARCHAR2(10),
  order_number NUMBER(5),
  credit_card_number VARCHAR2(16) ENCRYPT NO SALT,
  active_card VARCHAR2(3));

この表は、このコマンドを発行したユーザーのデフォルト表領域に作成されます。credit_card_number列はSALTなしで暗号化されます。credit_card_number列に入力されたすべてのデータは、ディスク上で暗号化されます。credit_card_numberデータへのアクセス権があるユーザーは、暗号化データを表示できます。データベース・ユーザーは、特定の列の内容がディスク上で暗号化されているかどうかを認識する必要はありません。

この時点では、データを入力できるようになっています。次に、サンプル・データをcust_payment_info表に追加する例を示します。

INSERT INTO cust_payment_info VALUES
  ('Jon', 'Oldfield', 10001, '5446959708812985','YES');
INSERT INTO cust_payment_info VALUES
  ('Chris', 'White', 10002, '5122358046082560','YES');
INSERT INTO cust_payment_info VALUES
  ('Alan', 'Squire', 10003, '5595968943757920','YES');
INSERT INTO cust_payment_info VALUES
  ('Mike', 'Anderson', 10004, '4929889576357400','YES');
INSERT INTO cust_payment_info VALUES
  ('Annie', 'Schmidt', 10005, '4556988708236902','YES');
INSERT INTO cust_payment_info VALUES
  ('Elliott', 'Meyer', 10006, '374366599711820','YES');
INSERT INTO cust_payment_info VALUES
  ('Celine', 'Smith', 10007, '4716898533036','YES');
INSERT INTO cust_payment_info VALUES
  ('Steve', 'Haslam', 10008, '340975900376858','YES');
INSERT INTO cust_payment_info VALUES
  ('Albert', 'Einstein', 10009, '310654305412389','YES');

credit_card_number列に入力されたすべてのデータは、暗号化された形式でディスク上に格納されます。

3.8.3 暗号化列に対する索引の作成

saltなしで列を暗号化した場合は、その暗号化列に対して索引を作成できます。ここでは、credit_card_number列に対して索引を作成します。credit_card_number列に対して索引を作成するには、次のコマンドを使用します。

CREATE INDEX cust_payment_info_idx ON cust_payment_info (credit_card_number);

3.8.4 既存の列を暗号化するための表の変更

既存の表は、ALTER TABLEコマンドを使用して変更できます。ここでは、列が暗号化されていないemployeesという表を変更します。次のコマンドを使用して、employees表を表示します。

SQL> DESC employees
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FIRSTNAME                                          VARCHAR2(11)
 LASTNAME                                           VARCHAR2(10)
 EMP_SSN                                            VARCHAR2(9)
 DEPT                                               VARCHAR2(20)

次のコマンドを使用して、employees表のemp_ssn列を暗号化します。

SQL> ALTER TABLE employees MODIFY (emp_ssn VARCHAR2(9) ENCRYPT);

次のコマンドを使用して、変更したemployees表を表示します。

SQL> DESC employees
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 FIRSTNAME                                          VARCHAR2(11)
 LASTNAME                                           VARCHAR2(10)
 EMP_SSN                                            VARCHAR2(9) ENCRYPT
 DEPT                                               VARCHAR2(20)

emp_ssn列の既存のデータはすべて、ディスク上で暗号化されます。データへのアクセス権があるデータベース・ユーザーには、データが透過的に復号化されます。

3.8.5 暗号化された表領域の作成

表領域暗号化を使用すると、表領域全体を暗号化できます。表領域に格納されているすべてのデータは、デフォルトで暗号化されます。このように、暗号化された表領域に表を作成すると、その表はデフォルトで暗号化されます。暗号化が必要な列を判断するために、各表の列について詳細分析を実行する必要はありません。

ここでは、暗号化された表を格納するために、暗号化された表領域を作成します。次のコマンドを使用して、securespaceという暗号化された表領域を作成します。

SQL> CREATE TABLESPACE securespace
  2  DATAFILE '/home/oracle/oracle3/product/11.1.0/db_1/secure01.dbf'
  3  SIZE 150M
  4  ENCRYPTION
  5  DEFAULT STORAGE(ENCRYPT);
Tablespace created.

3.8.6 暗号化された表領域での表の作成

暗号化された表領域に表を作成すると、表内のデータはすべて、暗号化された形式でディスク上に格納されます。次のコマンドを使用して、securespaceという暗号化された表領域にcustomer_info_paymentという表を作成します。

SQL> CREATE TABLE customer_payment_info
  2  (first_name VARCHAR2(11),
  3  last_name VARCHAR2(10),
  4  order_number NUMBER(5),
  5  credit_card_number VARCHAR2(16),
  6  active_card VARCHAR2(3))TABLESPACE securespace;
Table created.

3.9 透過的データ暗号化のトラブルシューティング

ここでは、透過的データ暗号化の構成時および使用時に表示される可能性がある一般的なエラー・メッセージをリストします。エラー・メッセージの一般的な原因と、考えられる解決策についても示します。

ORA-28330: このデータ型は暗号化できません
原因: このデータ型の列暗号化はサポートされていません。
処置: 特にありません。
ORA-28331: 暗号化された列サイズはデータ型に対して長すぎます
原因: 列が暗号化されましたが、VARCHAR2に対して3932、CHARに対して1932、NVARCHAR2に対して1966、またはNCHARに対して966を超える長さが指定されました。
処置: 列サイズを減らします。
ORA-28332: 暗号化キーには複数のパスワードは指定できません
原因: ユーザー・コマンドに複数のパスワードが指定されました。
処置: 特にありません。
ORA-28333: 列が暗号化されていません
原因: 暗号化されていない列の鍵を再作成するか、暗号化されていない列を復号化しようとしました。
処置: 特にありません。
ORA-28334: 列はすでに暗号化されています
原因: 暗号化されている列を暗号化しようとしました。
処置: 特にありません。
ORA-28335: 参照型または被参照型の外部キー制約列は暗号化できません
原因: 暗号化列は参照制約に関連しています。
処置: 特にありません。
ORA-28336: SYSが所有するオブジェクトは暗号化できません
原因: SYSが所有する表の列を暗号化しようとしました。
処置: 特にありません。
ORA-28337: 指定した索引が暗号化列に定義されていない可能性があります
原因: 索引列は、ファンクション索引、ドメイン索引または結合索引です。
処置: 特にありません。
ORA-28338: 索引付けされた列は、saltを使用して暗号化できません
原因: saltを使用して索引列を暗号化しようとしました。
処置: 表を変更し、列の暗号化をsaltなしで指定します。
ORA-28339:暗号化アルゴリズムが欠落しているか、または無効です
原因: ユーザー・コマンドで暗号化アルゴリズムが欠落しているか、無効な暗号化アルゴリズムが指定されました。
処置: 有効なアルゴリズムを指定する必要があります。
ORA-28340: 表には、別の暗号化アルゴリズムが選択されています
原因: 暗号化された既存の列は、別のアルゴリズムに関連付けられています。
処置: アルゴリズムを指定する必要はありません。あるいは、暗号化された既存の列と同じアルゴリズムを指定します。
ORA-28341: 制約列は、saltを使用して暗号化できません
原因: saltを使用して制約列を暗号化しようとしました。
処置: 制約列をsaltなしで暗号化します。
ORA-28342: 列キーでは整合性チェックが正常に実行されません
原因: 暗号化メタデータが不適切に変更された可能性があります。
処置: 特にありません。
ORA-28343: データを暗号化できません
原因: データまたは暗号化メタデータが不適切に変更された可能性があります。あるいは、セキュリティ・モジュールが正しく設定されていない可能性があります。
処置: 特にありません。
ORA-28344: データを復号化できません
原因: データまたは暗号化メタデータが不適切に変更された可能性があります。あるいは、セキュリティ・モジュールが正しく設定されていない可能性があります。
処置: 特にありません。
ORA-28345: 暗号化された列が存在するため、ダウングレードできません
原因: システム内に暗号化列が存在している状態で、ダウングレードしようとしました。
処置: これらの列は復号化した後にダウングレードします。
ORA-28346: 暗号化された列は、パーティション化列として機能しません
原因: パーティション化列を暗号化しようとしました。あるいは、暗号化列を使用してパーティション索引を作成しようとしました。
処置: 列を復号化する必要があります。
ORA-28347: 暗号化プロパティの不一致
原因: ALTER TABLE EXCHANGE PARTITION | SUBPARTITIONコマンドを発行しようとしましたが、暗号化プロパティの組合せが不適切です。
処置: 暗号化アルゴリズムと列鍵が一致していることを確認します。saltおよびsalt以外の同じフレーバを使用して、双方の表の対応する列を暗号化する必要があります。
ORA-28348: 指定した列に定義されている索引を暗号化できません
原因: ファンクション索引、ドメイン索引または結合索引内の列を暗号化しようとしました。
処置: 索引を削除します。
ORA-28349: マテリアライズド・ビュー・ログに記録された指定の列を暗号化できません
原因: マテリアライズド・ビュー・ログにすでに記録されている列を暗号化しようとしました。
処置: マテリアライズド・ビュー・ログを削除します。
ORA-28350: CDC同期変更表に記録された指定の列を暗号化できません
原因: CDC同期変更表にすでに記録されている列を暗号化しようとしました。
処置: 同期変更表を削除します。
ORA-28351: クラスタ・キーの列を暗号化できません
原因: クラスタ・キーの列を暗号化しようとしました。クラスタ表内のクラスタ・キーの列は暗号化できません。
処置: 特にありません。
ORA-28353: ウォレットのオープンに失敗しました
原因: ウォレット・パスまたはパスワードが不適切なため、セキュリティ・モジュール・ウォレットをオープンできませんでした。ウォレットが作成されていない可能性もあります。詳細を確認するには、コマンドラインからmkwalletと入力します。
処置: 正しいウォレット・パスワードを使用してコマンドを再実行するか、指定のディレクトリにあるウォレットを検証します。必要な場合は、新しいウォレットを作成して初期化します。
ORA-28354: ウォレットはすでにオープンしています。
原因: セキュリティ・モジュール・ウォレットはすでにオープンしています。
処置: 特にありません。
ORA-28356: 無効なopen wallet構文
原因: ウォレットをオープンするコマンドの綴りまたは構文に誤りがあります。
処置: ウォレットをオープンする場合は、綴りと構文を検証して、コマンドを再実行します。
ORA-28357: ウォレットのオープンに必要なパスワード
原因: open walletコマンドの実行時にパスワードを指定していません。
処置: 有効なパスワードを使用してコマンドを再試行します。
ORA-28358: 不適切なset key構文
原因: マスター鍵を設定するコマンドの綴りまたは構文に誤りがあります。
処置: 透過的データ暗号化のマスター鍵を設定する場合は、綴りと構文を検証して、コマンドを再実行します。
ORA-28359: 無効な証明書識別子
原因: 指定された証明書がウォレット内に存在しません。
処置: V$WALLET固定ビューを問い合せ、使用する証明書の正しい証明書識別子を検索します。
ORA-28361: マスター鍵が設定されていません
原因: インスタンスのマスター鍵が設定されていません。
処置: ALTER SYSTEM SET KEYコマンドを実行し、データベース・インスタンスのマスター鍵を設定します。
ORA-28362: マスター鍵が見つかりません
原因: 必須のマスター鍵が見つかりません。無効または不適切なウォレットの使用が起因している可能性があります。
処置: ウォレット・ロケーション・パラメータをチェックし、正しいウォレットを指定していることを確認します。また、暗号化ウォレットの使用を意図している場合は、SSOウォレットを使用していないことを検証します。
ORA-28363: 用意されたバッファーは出力用には不十分です
原因: 用意された出力バッファは、出力を格納するには小さすぎます。
処置: 適切なサイズに初期化されるように、出力バッファのサイズを確認します。
ORA-28364: 無効なウォレット操作です
原因: ウォレットを操作するコマンドの綴りまたは構文に誤りがあります。
処置: 綴りと構文を検証して、コマンドを再実行します。
ORA-28365: ウォレットがオープンしていません
原因: セキュリティ・モジュール・ウォレットがオープンしていません。
処置: ウォレットをオープンします。
ORA-28366: 無効なデータベース暗号化操作です
原因: データベースを暗号化するコマンドの綴りまたは構文に誤りがあります。
処置: 綴りと構文を検証して、コマンドを再実行します。
ORA-28367: ウォレットが存在しません
原因: Oracleウォレットが作成されていないか、sqlnet.oraのウォレット・ロケーション・パラメータに無効なウォレット・パスが指定されています。
処置: WALLET_LOCATIONまたはENCRYPTION_WALLET_LOCATIONパラメータが正しいこと、および指定されたパスに有効なウォレットが存在していることを確認します。
ORA-28368: ウォレットを自動作成できません
原因: Oracleウォレットの自動作成に失敗しました。Oracleプロセスに適切なファイル権限が付与されていないか、ウォレットがすでに存在している可能性があります。
処置: 適切なディレクトリ権限がOracleユーザーに付与され、暗号化も不明瞭化も行われていないウォレットが指定のウォレット・ロケーションに存在していることを確認して、再試行します。
ORA-28369: オフライン時には暗号化可能な表領域にファイルを追加できません
原因: 表領域内のすべてのファイルがオフラインのときに、暗号化可能な表領域にファイルを追加しようとしました。
処置: 表領域をオンラインにして、再試行します。
ORA-28370: ENCRYPT記憶域オプションは使用できません
原因: ENCRYPT記憶域オプションを指定しようとしました。このオプションは、CREATE TABLESPACEにのみ指定できます。
処置: このオプションを削除して、文を再試行します。
ORA-28371: ENCRYPTION句またはENCRYPT記憶域オプション(あるいはその両方)は使用できません
原因: ENCRYPTION句またはENCRYPT記憶域オプションを指定して、一時表領域またはUNDO表領域を作成しようとしました。
処置: これらのオプションを削除して、文を再試行します。
ORA-28372: 暗号化された表領域にENCRYPT記憶域オプションがありません
原因: 表領域を暗号化する際にENCRYPT記憶域オプションを指定せずにENCRYPTIONプロパティをCREATE TABLESPACEに指定しようとしました。
処置: ENCRYPT記憶域オプションを追加して、文を再試行します。
ORA-28373: 暗号化された表領域にENCRYPTION句がありません
原因: 表領域を暗号化する際にENCRYPTIONプロパティを指定せずにENCRYPT記憶域オプションをCREATE TABLESPACEに指定しようとしました。
処置: ENCRYPTION句を追加して、文を再試行します。
ORA-28374: 入力したマスター鍵がウォレットに見つかりません
原因: ウォレットに存在しないマスター鍵を入力して、暗号化された表領域またはREDOログにアクセスしようとしました。
処置: 表領域を作成したインスタンスから、正しいOracleウォレットをコピーしてください。
ORA-28375: 暗号化された表領域ではエンディアン間の変換を実行できません
原因: 暗号化された表領域でエンディアン間の変換を実行しようとしました。
処置: 暗号化された表領域でのエンディアン間の変換はサポートされていません。
ORA-28376: PKCS11ライブラリが見つかりません
原因: HSMベンダーのライブラリが見つかりません。
処置: Unix系システムの場合は/opt/oracle/extapi/[32,64]/hsm/{VENDOR}/{VERSION}/lib<apiname>.<ext>、Windowsシステムの場合は%SYSTEM_DRIVE%¥oracle¥extapi¥[32,64]¥hsm¥{VENDOR}¥{VERSION}¥lib<apin// ame>.<ext>のディレクトリ構造に、HSMベンダーのライブラリを配置します。[32, 64]は、32または64ビット・バイナリを示します。{VENDOR}には、ライブラリを提供するベンダー名が入ります。{VERSION}には、ライブラリのバージョンが入ります。なるべく、num#.num#.num#の形式を使用してください。
ORA-28377: ウォレットからHSMに移行する必要はありません
原因: 暗号化列がないか、すべての列鍵がHSMマスター鍵を使用してすでに暗号化されています。
処置: 特にありません。
ORA-28378: マスター鍵の設定後、ウォレットがオープンしていません
原因: マスター鍵が設定または再設定されています。一方、ウォレットは正しく再オープンできませんでした。
処置: ウォレットを再オープンします。

3.10 透過的データ暗号化の参照情報

この項では、次の項目について説明します。

3.10.1 サポートされる暗号化と整合性のアルゴリズム

デフォルトでは、透過的データ暗号化には、192ビット長の暗号鍵を使用するAdvanced Encryption Standard(AES192)を使用します。また、特に指定しない場合は、暗号化の前にクリアテキストにsaltがデフォルトで追加されます。暗号化の対象となる索引付けされた列にはsaltを追加できないことに注意してください。索引付けされた列に対しては、SQL ENCRYPT句でNO SALTパラメータを選択します。

既存の暗号化列の暗号化アルゴリズムおよび暗号化鍵を変更するには、SQL ENCRYPT句で別のアルゴリズムを設定します。


関連項目:


表3-1に、サポートされる暗号化アルゴリズムを示します。

表3-1 透過的データ暗号化でサポートされる暗号化アルゴリズム

アルゴリズム 鍵のサイズ パラメータ名

Triple-DES(データ暗号化規格)

168ビット

3DES168

AES(Advanced Encryption Standard)

128ビット

AES128

AES

192ビット(デフォルト)

AES192

AES

256ビット

AES256


整合性保護のために、SHA-1ハッシュ・アルゴリズムが使用されます。

3.10.2 透過的データ暗号化で暗号化できるデータ型

この機能を使用して暗号化できるデータ型は、次のとおりです。

  • BINARY_DOUBLE

  • BINARY_FLOAT

  • CHAR

  • DATE

  • INTERVAL DAY TO SECOND

  • INTERVAL YEAR TO MONTH

  • NCHAR

  • NUMBER

  • NVARCHAR2

  • RAW

  • TIMESTAMPTIMESTAMP WITH TIME ZONEおよびTIMESTAMP WITH LOCAL TIME ZONEを含む)

  • VARCHAR2

暗号化列のサイズが列のデータ型で使用可能なサイズより大きくなる場合は、列を暗号化できません。表3-2に、様々なデータ型について、許容される最大サイズを示します。

表3-2 各データ型の最大許容サイズ

データ型 最大サイズ

CHAR

1932バイト

VARCHAR2

3932バイト

NVARCHAR2

1966バイト

NCHAR

966バイト


3.10.3 クイック・リファレンス: 透過的データ暗号化のSQLコマンド

表3-3に、透過的データ暗号化の実装および管理に使用可能なSQLコマンドのサマリーを示します。

表3-3 透過的データ暗号化のSQLコマンドのクイック・リファレンス

作業 SQLコマンド

既存の表への暗号化列の追加

ALTER TABLE table_name ADD (column_name datatype ENCRYPT);

表の作成および列の暗号化

CREATE TABLE table_name (column_name datatype ENCRYPT);

暗号化されていない既存の列の暗号化

ALTER TABLE table_name MODIFY (column_name ENCRYPT);

マスター暗号化鍵: 設定または再設定

ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY password;

マスター暗号化鍵: PKI証明書を使用するための設定または再設定

ALTER SYSTEM SET ENCRYPTION KEY certificate_ID IDENTIFIED BY password;

ウォレット: マスター暗号化鍵にアクセスするためのオープン

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY password;