透過的データ暗号化を使用すると、表の列に格納する機密データ(クレジット・カード番号など)を暗号化できます。暗号化データは、そのデータへのアクセス権があるデータベース・ユーザーに対して透過的に復号化されます。透過的データ暗号化は、記憶媒体やデータ・ファイルが盗まれた場合、媒体に格納されているデータの保護に役立ちます。
この章では、次の項目について説明します。
Oracle Database 11g では、データベース内のデータは認証、認可および監査メカニズムによって保護されますが、データを格納しているオペレーティング・システム・データ・ファイルは保護されません。このようなデータ・ファイルを保護するために、Oracle Databaseには透過的データ暗号化が用意されています。透過的データ暗号化は、データ・ファイルに格納されている機密表データを暗号化します。無許可での復号化を防止するために、透過的データ暗号化では、データベース外部のセキュリティ・モジュールに暗号化鍵が格納されています。
この項では、次の項目について説明します。
透過的データ暗号化には、次の利点があります。
セキュリティ管理者は、記憶媒体やデータ・ファイルが盗まれた場合、機密データの安全性を確保できます。
透過的データ暗号化を実装することで、セキュリティに関する規制準拠問題への対応が促進されます。
データを復号化するためにトリガーまたはビューを作成する必要はありません。表のデータは、データベース・ユーザーに対して透過的に復号化されます。
データベース・ユーザーは、アクセスしているデータが暗号化されて格納されている事実を認識する必要はありません。データはデータベース・ユーザーに対して透過的に復号化され、ユーザー側での処理は必要ありません。
暗号化データを処理するようにアプリケーションを変更する必要はありません。データの暗号化と復号化はデータベースによって管理されます。
透過的データ暗号化は、クレジット・カード番号や社会保障番号などの機密データを、鍵の格納を管理したり、補助の表、ビューおよびトリガーを作成せずに保護する場合に使用します。機密データを処理するアプリケーションでこの機能を使用すると、アプリケーションをほとんどあるいはまったく変更せずに、強力なデータ暗号化を提供できます。
透過的データ暗号化は、外部キー制約で使用される列の暗号化には使用できません。これは、すべての表に一意の列暗号化鍵があるためです。
透過的データ暗号化は、SQLレイヤーでデータの暗号化と復号化を処理します。したがって、SQLレイヤーをバイパスするOracle Databaseのユーティリティや機能は、透過的データ暗号化によるサービスを利用できません。透過的データ暗号化は、次のデータベース機能と併用しないでください。
Bツリー以外の索引タイプ
索引内のレンジ・スキャン検索
サポート対象外のこれらの機能を使用するアプリケーションでは、DBMS_CRYPTOパッケージを暗号化に使用できます。
透過的データ暗号化は、ディスクや媒体に格納されているデータを保護します。転送中のデータは保護しません。ネットワーク上のデータを暗号化するには、第2章「構成および管理ツールの概要」に記載されているOracle Advanced Securityのネットワーク暗号化ソリューションを使用してください。
透過的データ暗号化は、鍵ベースのアクセス制御システムです。暗号化されたデータを取得しても、許可された復号化が行われるまでは理解不能です。この復号化は、表へのアクセスを許可されたユーザーに対して自動的に行われます。
表に暗号化列が含まれる場合、暗号化列の数に関係なく、単一の鍵が使用されます。この鍵は列暗号化鍵と呼ばれます。暗号化列を含むすべての表の列暗号化鍵は、データベース・サーバーのマスター暗号化鍵で暗号化され、データベース内のディクショナリ表に格納されます。暗号化されていない鍵が格納されることはありません。
図3-1に示すように、マスター暗号化鍵は、データベースの外部にあり、セキュリティ管理者のみがアクセスできる外部セキュリティ・モジュールに格納されます。この外部セキュリティ・モジュールとして、Oracleでは、この章で説明するOracleウォレットを使用します。このようにマスター暗号化鍵を格納することで、許可のない使用を防止します。
外部セキュリティ・モジュールを使用すると、通常のプログラム機能と暗号化操作が分離されるため、データベース管理者とセキュリティ管理者の任務を分離できます。データベース管理者にはウォレット・パスワードを知らせずに、セキュリティ管理者にパスワードの提供を要求できるため、セキュリティが強化されます。
透過的データ暗号化を使用可能にするには、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コマンドを使用してウォレットを再オープンする必要があります。
次に、透過的データ暗号化を使用する手順を説明します。
透過的データ暗号化は、Oracle Database 10g リリース2(10.2)で最初に導入されました。この機能を使用するには、Oracle Database 10g リリース2(10.2)以上を実行する必要があります。
|
注意: Oracle Database 11g リリース1(11.1)では、 JOINやSORTなどの操作中に一時表領域のデータを保護することで、より高いセキュリティが確保されます。これらの操作の間、一時表領域のデータは暗号化された状態で存在します。
透過的データ暗号化をOracle Database 10g リリース2(10.2)ですでに使用していて、Oracle Database 11g リリース1(11.1)にアップグレードした場合は、データベースの互換性を11.0.0に設定して、マスター鍵を再設定することをお薦めします。これによって、Oracle Database 11g リリース1(11.1)の透過的データ暗号化による強化されたセキュリティ機能を使用できます。 表領域のマスター暗号化鍵も作成できます。マスター暗号化鍵の再設定の詳細は、「マスター暗号化鍵の設定および再設定」を参照してください。 |
透過的データ暗号化の使用を開始するには、セキュリティ管理者がウォレットを作成し、マスター鍵を設定する必要があります。ウォレットは、他のOracle Databaseコンポーネントと共有されるデフォルトのデータベース・ウォレットにするか、透過的データ暗号化専用に使用する別のウォレットにできます。マスター暗号化鍵は、独立したウォレットを使用して格納することをお薦めします。
外部セキュリティ・モジュールには、sqlnet.ora構成ファイルで指定されているOracleウォレットの暗号化鍵が格納されています。Oracleウォレット・ロケーションをsqlnet.oraファイルに指定するには、WALLET_LOCATIONパラメータを使用します。
透過的データ暗号化専用のウォレットを使用する場合は、ENCRYPTION_WALLET_LOCATIONパラメータを使用して、sqlnet.oraファイルで2つ目のウォレット・ロケーションを指定する必要があります。透過的データ暗号化のウォレット・ロケーションを指定するには、ENCRYPTION_WALLET_LOCATIONパラメータの使用をお薦めします。
マスター暗号化鍵は、Oracleウォレットに格納され、列暗号化鍵の保護に使用されます。デフォルトでは、マスター暗号化鍵は、透過的データ暗号化によって生成されるランダム鍵です。マスター鍵は、暗号化用に指定されたPKI証明書の既存の鍵ペアにすることもできます。PKI鍵ペアと一緒に透過的データ暗号化を使用するには、発行認証局が、暗号化用にマークされた鍵使用方法フィールドを含むX.509v3証明書を発行できる必要があります。
どちらの鍵タイプもセキュリティは同様ですが、組織内にすでにPKIをデプロイしている場合は、そのPKIサービスを鍵供託およびリカバリとして活用できます。ただし、現在のPKIアルゴリズムを使用する暗号化では、対称鍵暗号化よりもはるかに多くのシステム・リソースが必要になります。マスター暗号化鍵としてPKI鍵ペアを使用すると、データベース内の暗号化列にアクセスする場合にパフォーマンスが大幅に低下する可能性があります。
マスター暗号化鍵を設定または再設定するには、ALTER SYSTEMコマンドを使用します。次の各項では、マスター暗号化鍵の設定および再設定について説明します。
データベースの列を暗号化または復号化するには、その前に、マスター暗号化鍵を生成または設定しておく必要があります。マスター暗号化鍵は列暗号化鍵の暗号化に使用され、列暗号化鍵は表の列の暗号化に使用されます。
マスター暗号化鍵を設定するには、次のコマンドを使用します。
SQL> ALTER SYSTEM SET ENCRYPTION KEY [certificate_ID] IDENTIFIED BY password
ここで、
certificate_IDは、Oracleウォレットに格納されている証明書の一意の識別子を含むオプション文字列です。PKI秘密鍵をマスター暗号化鍵として使用する場合は、このパラメータを使用します。このパラメータにデフォルト設定はありません。
certificate_IDを検索するには、ウォレットがオープンしているときにV$WALLET固定ビューを問い合せます。透過的データ暗号化でマスター暗号化鍵として使用できる証明書のみが表示されます。
passwordは、セキュリティ・モジュールの必須ウォレット・パスワードです。デフォルト設定はありません。このパスワードは大/小文字が区別されます。パスワード文字列は、二重引用符(" ")で囲みます。
ウォレットが存在しない場合は、このコマンドによって、sqlnet.oraパラメータ・ファイルで指定されているウォレット・ロケーションで新しいウォレットが作成されます。sqlnet.oraファイルでウォレット・ロケーションが指定されていない場合は、デフォルトのデータベース・ウォレット・ロケーションが使用されます。想定しているウォレット・ロケーションに既存の自動ログイン・ウォレットが存在する場合、新しいウォレットは作成されません。
マスター暗号化鍵の再設定/再生成は、マスター暗号化鍵の安全性が損なわれた場合にのみ実行します。頻繁にマスター暗号化鍵を再生成しても、システム・セキュリティが強化されるとはかぎりません。セキュリティ・モジュールには多数の鍵を格納できます。ただし、この数は無限ではありません。頻繁にマスター暗号化鍵を再生成すると、使用可能な記憶域を使い果たす可能性があります。
マスター暗号化鍵を再設定するには、「マスター暗号化鍵の設定」に記載されているSQL構文を使用します。
ALTER SYSTEM SET ENCRYPTION KEYコマンドは、ALTER SYSTEM権限が必要なデータ定義言語(DDL)コマンドであり、これによって、保留中のトランザクションがすべて自動的にコミットされます。例3-1に、このコマンドの使用例を示します。
例3-1 PKIベースの秘密鍵を使用するためのマスター暗号化鍵の設定または再設定
ALTER SYSTEM SET ENCRYPTION KEY "j23lm781098dhb345sm" IDENTIFIED BY "p3812dH9E";
PKIベースの鍵の場合、証明書失効リストは規定されません。これは、証明書の失効を規定すると、データベース内の暗号化されたすべての情報にアクセスできなくなる可能性があるためです。
外部セキュリティ・モジュールには、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
暗号化列を含むリレーショナル表を作成するには、CREATE TABLE文でデータベース列を定義するときにSQL ENCRYPT句を指定します。
この項では、次の項目について説明します。
デフォルトでは、透過的データ暗号化は、192ビット長の鍵を使用するAES暗号化アルゴリズム(AES192)を使用します。アルゴリズムを指定せずに表の列を暗号化すると、その列はAES192アルゴリズムを使用して暗号化されます。
例3-3は、暗号化列を含む新しい表を作成しています。この列は、デフォルト・アルゴリズム(AES192)を使用して暗号化されます。
デフォルトでは、透過的データ暗号化は、暗号化の前にクリアテキストにsaltを追加します。これによって、攻撃者が総当たり攻撃によってデータを盗むことがより困難になります。ただし、暗号化列を索引付けする場合、NO SALTを使用する必要があります。
透過的データ暗号化では、デフォルト以外の暗号化アルゴリズムも指定できます。次のいずれかのアルゴリズムを選択できます。
3DES168
AES128
AES192(デフォルト)
AES256
例3-4に、SQL ENCRYPT句でNO SALTパラメータを指定する方法(empID NUMBER ENCRYPT NO SALT)を示します。また、別の暗号化アルゴリズムを指定するための構文(salary NUMBER(6) ENCRYPT USING '3DES168')も示します。アルゴリズムを指定する文字列は、一重引用符(' ')で囲む必要があることに注意してください。
外部表の機能を使用すると、データベース表内のデータであるかのように、外部ソースのデータにアクセスできます。外部表は、ORACLE_DATAPUMPアクセス・ドライバを使用して更新できます。
外部表の特定の列を暗号化するには、列を定義するときにENCRYPT句を使用します。列の暗号化には、ランダムに生成された鍵が使用されます。
外部表を新しい場所に移動することを予定している場合、列の暗号化にランダム生成の鍵は使用できません。これは、新しい場所ではランダム生成の鍵が使用できないためです。
このような場合は、列を暗号化する際にパスワードを指定する必要があります。データを移動した後は、同じパスワードを使用して、新しい場所の暗号化列データへのアクセスに必要な鍵を再生成できます。
表区分交換でもパスワード・ベースの列暗号化鍵が必要になります。
例3-5は、列暗号化鍵を作成するためのパスワードを使用して外部表を作成しています。
既存の表に暗号化列を追加する、あるいは既存の列を暗号化または復号化するには、ALTER TABLE SQLコマンドをADDまたはMODIFY句とともに使用します。
この項では、次の項目について説明します。
既存の表に暗号化列を追加するには、ALTER TABLE ADDコマンドを使用し、ENCRYPT句で新しい列を指定します。例3-6は、employeeという外部表に暗号化列ssnを追加しています。
ssn列は、デフォルトのAES192アルゴリズムを使用して暗号化されます。saltはデフォルトでデータに追加されます。
別のアルゴリズムを使用して列を暗号化することもできます。また、列に索引を付ける場合は、NO SALTを指定できます。
暗号化されていない列を暗号化するには、ALTER TABLE MODIFYコマンドを使用し、ENCRYPT句で暗号化されていない列を指定します。例3-7は、employee表のfirst_name列を暗号化しています。
このfirst_name列は、デフォルトのAES192アルゴリズムを使用して暗号化されます。saltはデフォルトでデータに追加されます。
別のアルゴリズムを使用して列を暗号化することもできます。また、列に索引を付ける場合は、NO SALTを指定できます。
互換性やパフォーマンスの理由から、暗号化を無効にすることが必要になる場合があります。列の暗号化を無効にするには、ALTER TABLE MODIFYコマンドを使用してDECRYPT句を指定します。例3-8は、employee表のfirst_name列を復号化しています。
暗号化列に対して索引を作成するには、標準の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)が発生します。 |
saltは、暗号化データのセキュリティを強化する方法の1つです。saltは暗号化の前にデータに追加するランダムな文字列で、これにより、暗号化されていないテキストの繰り返しが、暗号化すると異なって表示されるようになります。 saltは、攻撃者がデータを盗むために使用する一般的な方法の1つである暗号化テキストのパターン一致を排除します。
暗号化列に対してsaltを追加または削除するには、ALTER TABLE MODIFYコマンドを使用します。例3-10は、saltを使用してfirst_name列を暗号化しています。first_name列が以前にsaltなしで暗号化されていた場合は、このコマンドによって、saltを使用して列が再暗号化されます。
例3-11は、first_name列からsaltを削除しています。saltを使用して暗号化された列に索引を付ける必要がある場合は、索引を付ける前に、このコマンドを使用してsaltを削除します。
NOMACパラメータを使用すると、透過的データ暗号化によって実行される整合性チェックを省略できます。 このパラメータで、暗号化された値ごとに20バイトのディスク領域が節約されます。 表の行および暗号化列の数が多い場合、これにより節約されるディスク領域はかなりの量になります。
また、NOMACパラメータは透過的データ暗号化に関連するパフォーマンスのオーバーヘッドも削減します。 NOMACパラメータを使用すると、暗号化および復号化操作時の整合性チェックが省略されます。 これにより処理循環が短縮され、パフォーマンスが高速化されます。
|
注意: 透過的データ暗号化では、デフォルトで SHA-1整合性アルゴリズムを使用します。 表内のすべての暗号化列が同一の整合性アルゴリズムを使用している必要があります。 SHA-1アルゴリズムを使用している表の列がすでに存在する場合、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列を暗号化しています。
この項では、次の項目について説明します。
透過的データ暗号化では、マスター暗号化鍵はOracleウォレット内に格納されます。透過的データ暗号化では、すべてのOracleコンポーネントが共有するデフォルトのデータベース・ウォレットを使用できます。別のウォレットを使用することもできます。ウォレットは、セキュリティ管理者がウォレットを明示的にオープンすることなく、暗号化データにアクセスできる自動ログイン・ウォレットにできます。
デフォルトでは、透過的データ暗号化には、デフォルトのデータベース・ウォレットまたはsqlnet.ora構成ファイルのWALLET_LOCATIONパラメータで指定されているウォレットが使用されます。ただし、このウォレットは他のOracleコンポーネントと共有される可能性があるため、透過的データ暗号化に使用するマスター暗号化鍵の格納には、別のウォレットを使用することをお薦めします。別のウォレットを指定するには、sqlnet.oraファイルでENCRYPTION_WALLET_LOCATIONパラメータを設定して、透過的データ暗号化専用のウォレットを指定します。
使用するウォレットを決定する際、透過的データ暗号化では、最初にパラメータENCRYPTION_WALLET_LOCATIONで指定されているウォレットの使用が試行されます。このパラメータが設定されていない場合は、パラメータWALLET_LOCATIONで指定されているウォレットの使用が試行されます。再度失敗した場合、透過的データ暗号化では、デフォルトのデータベース位置でウォレットが検索されます。
自動ログイン・ウォレットは、mkwalletユーティリティまたはOracle Wallet Managerを使用して作成できます。自動ログイン・ウォレットを使用すると、データベース・インスタンスの再起動後に暗号化データに容易にアクセスできます。
透過的データ暗号化で自動ログイン・ウォレットが使用されるのは、その自動ログイン・ウォレットが正しい位置にあり、暗号化ウォレットをオープンするSQLコマンドがまだ実行されていない場合のみです。 自動ログイン・ウォレットの使用中は、ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY passwordコマンドを使用しないでください。
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY passwordコマンドを使用してマスター暗号化鍵を作成すると、透過的データ暗号化によって、ウォレットがデフォルトまたは指定の位置に存在しているかどうかがチェックされます。ウォレットが存在しない場合は、ウォレットが自動的に作成されます。
SQLコマンドの他、mkwalletコマンドライン・ユーティリティおよびOracle Wallet Managerを使用してウォレットを作成することもできます。これらは、ウォレットの作成とそのコンテンツの表示および変更を可能にする完全な機能を備えたツールです。
この項では、次の項目について説明します。
暗号化データには、マスター暗号化鍵なしでアクセスすることはできません。マスター暗号化鍵はOracleウォレットに格納されるため、ウォレットは、安全な場所に定期的にバックアップする必要があります。新しいマスター暗号化鍵を設定するたびにウォレットのバックアップ・コピーを作成する必要があります。
Oracleウォレットは、暗号化データと一緒にバックアップしないでください。ウォレットは個別にバックアップする必要があります。自動ログイン・ウォレットを使用している場合は、オープン時にパスワードが要求されないため、特に注意してください。バックアップ・テープの紛失に備えて、悪意のあるユーザーが暗号化データとウォレットの両方を取得できないようにすることが大切です。
Recovery Manager(RMAN)では、ウォレットは、データベース・バックアップの一環としてバックアップされません。Oracle Secure Backup(OSB)などのメディア・マネージャをRMANと併用している場合は、OSBによって、自動オープン・ウォレット(cwallet.ssoファイル)がバックアップ対象から自動的に除外されます。ただし、暗号化ウォレット(ewallet.p12ファイル)は自動的には除外されません。賢明な習慣として、次のexcludeデータセット文をOSB構成に追加することをお薦めします。
exclude name *.p12
この文は、バックアップ・セットから暗号化ウォレットを除外することをOSBに指示します。
マスター暗号化鍵を格納しているウォレットに障害が発生した場合は、ウォレットのバックアップを適切な場所にコピーすることで、暗号化データへのアクセスをリストアできます。最後にマスター暗号化鍵を再設定した後にリストアしたウォレットがアーカイブされた場合、追加処置の必要はありません。
リストアしたウォレットに最新のマスター暗号化鍵が含まれていない場合に、古いデータをマスター暗号化鍵が再設定された時点までリカバリするには、データベースの状態をその時点までロールバックします。マスター暗号化鍵の再設定後に行われた暗号化列に対するすべての変更は失われます。
透過的データ暗号化では、マスター暗号化鍵として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固定ビューを問い合せます。
暗号化列を含む表をエクスポートする場合は、次の点が重要になります。
転送中も機密データが解読不可能であること
宛先にインポートされた後、機密データが権限のあるユーザーによって復号化できること
暗号化列を含む表のインポートとエクスポートには、Oracle Data Pumpユーティリティを使用できます。Oracle Data Pumpでは、ENCRYPTIONパラメータを利用してダンプ・ファイル・セットのデータを暗号化できるようにします。ENCRYPTIONパラメータには、次の値を指定できます。
ENCRYPTED_COLUMNS_ONLY: 暗号化列が暗号化された形式でダンプ・ファイル・セットに書き込まれます。
DATA_ONLY: すべてのデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。
METADATA_ONLY: すべてのメタデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。
ALL: すべてのデータとメタデータが暗号化された形式でダンプ・ファイル・セットに書き込まれます。
NONE: ダンプ・ファイル・セットに対して暗号化は使用されません。
ENCRYPTION=ENCRYPTED_COLUMNS_ONLYを使用して、暗号化列を含む表をエクスポートおよびインポートする手順は、次のとおりです。
暗号化列を含む表をエクスポートする前に、暗号化ウォレットがオープンしていることを確認する必要があります。これは、暗号化列の復号には列暗号化鍵を使用する必要があり、そのためにはマスター暗号化鍵にアクセスすることが必要になるためです。列は、エクスポートされる前にパスワードを使用して再暗号化されます。
エクスポート・ダンプ・ファイル・セットの列データを暗号化する際に使用するパスワードは、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
ターゲット・データベースにデータをインポートする際は、同じパスワードを指定する必要があります。このパスワードは、データの復号化に使用されます。データは、ターゲット・データベースに生成された新しい列暗号化鍵を使用して再暗号化されます。マスター暗号化鍵にアクセスするために、ターゲット・データベースではウォレットがオープンしている必要があります。次に、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を使用すると、ウォレットに保管されているマスター暗号化鍵を使用してダンプ・ファイル・セットを透過的に暗号化できます。この場合、パスワードは不要です。インポートの過程で復号化が正常に実行されるためには、ターゲット・データベースにウォレットが存在し、オープンしている必要があります。このオープン・ウォレットは、ターゲット・データベースで列暗号化データを再暗号化する際にも必要です。
透過的データ暗号化に関連するオーバーヘッドは、次のように分類されます。
透過的データ暗号化がパフォーマンスに影響を与えるのは、暗号化列に対してデータの取得または挿入が行われた場合のみです。暗号化されていない列に関係する操作の場合は、これらの列が暗号化列を含む表内にあっても、パフォーマンスが低下することはありません。
暗号化列のデータへのアクセスには僅かなオーバーヘッドを伴います。一般的な属性(クレジット・カード番号など)の暗号化または復号化に関連するオーバーヘッドは、約5%と推定されます。これは、SELECT操作(復号化に必要)またはINSERT操作(暗号化に必要)では、クリアテキスト・データで取得する場合よりも約5%長い時間が必要になることを意味します。
全体的なパフォーマンスのオーバーヘッドは、暗号化列の数とそのアクセス頻度によって異なります。最も暗号化する必要のある列は、最高機密のデータを含む列です。
既存の表で暗号化を有効にすると、表の特性を変更する他のALTER TABLE操作と同様に、完全な表更新が行われます。管理者は、大規模な既存の表で暗号化を有効にする前に、データベース・サーバーに与えるパフォーマンスおよびREDOログの潜在的な影響を考慮する必要があります。
表に対する書込み操作は、暗号化が有効な間、列鍵が再作成される間、または暗号化アルゴリズムが変更されている間、一時的にアクセスできなくなる場合があります。このような処理が実行されている場合は、表のオンライン再定義を使用して、表への書込み操作が可能かどうかを確認できます。
大規模な表で透過的データ暗号化が有効になっている場合、操作に対応できるよう、REDOログのサイズを大きくする必要がある場合があります。
索引の付いた列の暗号化には、索引のない列の暗号化よりも多くの時間を要することもすでに判明しています。索引の付いた列を暗号化する必要がある場合は、索引を削除してから列を暗号化し、その後で索引を再度作成できます。
暗号化列に索引を付けると、その索引は暗号化された値に対して作成されます。暗号化列の値を問い合せると、SQL問合せで使用される値が透過的に暗号化されます。索引の参照は、暗号化された値を使用して実行されます。
暗号化データには、クリアテキスト・データより多くの記憶域が必要です。暗号化された各値は、20バイトの整合性チェックに関連付けられます。さらに、透過的データ暗号化では、暗号化された値が16バイトに拡張されます。これは、クレジット・カード番号の格納に9バイトが必要な場合、クレジット・カード番号を暗号化して格納するには、さらに7バイトが必要になることを意味します。また、saltを使用してデータを暗号化した場合は、暗号化された各値を保管するために、さらに16バイトの記憶域が必要になります。
つまり、1つの列を暗号化すると、各行について平均32〜48バイトの追加記憶域が必要になります。
透過的データ暗号化を使用する場合のセキュリティに関する考慮事項は、全システム・セキュリティの広範囲に適用されます。セキュリティ管理者は、対処するリスクのレベルと、サイトで保持されるデータの機密度を識別する必要があります。受入れ可能な保護を実現する別の方法について、コストおよび利点を評価する必要があります。多くの場合、暗号化データに対して別のセキュリティ管理者、別のウォレット、および保護されたバックアップ・プロシージャを設定することが望ましい方法です。別のウォレットを設定すると、他のOracleコンポーネントに対して自動ログインが許可されますが、透過的データ暗号化のウォレットに対するパスワード保護は保持されます。
その他のセキュリティに関する考慮事項は、透過的データ暗号化を使用している場合の通常のデータベースおよびネットワーク操作に適用されます。暗号化列のデータは、データ・ファイル、UNDOログ、REDOログおよびシステム・グローバル領域(SGA)のバッファ・キャッシュ内では暗号化されたままになります。一方、データは式の評価時に復号化されるため、復号化したデータは、ディスク上のスワップ・ファイルに表示できます。権限を付与されたオペレーティング・システム・ユーザーは、このデータを潜在的に表示できます。
透過的データ暗号化を使用して暗号化された列値は、暗号化された形式でデータ・ファイルに格納されます。ただし、これらのデータ・ファイルには、表に対する過去のデータ操作で残されたゴースト・コピーと呼ばれるクリアテキストの断片が含まれている場合があります。これは、オペレーティング・システムによってファイルが削除された後に、ディスク上にデータが残存している場合に類似しています。
古いクリアテキストの断片は、それらの値を含んでいるブロックがデータベースによって上書きされるまで、しばらく存在し続ける可能性があります。権限を付与されているオペレーティング・システム・ユーザーがデータベースのアクセス制御をバイパスした場合、そのユーザーは、表領域を保持するデータ・ファイル内のこれらの値に直接アクセスする可能性があります。このリスクを最小限にする手順は、次のとおりです。
新しいデータ・ファイルに新しい表領域を作成します。作成には、CREATE TABLESPACE文を使用します。
暗号化列を含む表を新しい表領域に移動します。移動には、ALTER TABLE.....MOVE文を使用します。元の表領域のすべてのオブジェクトについて、この手順を繰り返します。
元の表領域を削除します。削除するには、DROP TABLESPACE tablespace INCLUDING CONTENTS KEEP DATAFILES文を使用します。データ・ファイルは、プラットフォーム固有のユーティリティを使用して安全に削除することをお薦めします。
古いデータ・ファイルを安全に削除するには、プラットフォームおよびファイル・システムに固有のユーティリティを使用してください。このようなユーティリティの例には、shred(Linuxの場合)やsdelete(Windowsの場合)などがあります。
Oracle Data Guardは透過的データ暗号化をサポートしています。プライマリ・データベースで透過的データ暗号化を使用する場合、Data Guard構成の各スタンバイ・データベースには、プライマリ・データベースからの暗号化ウォレットのコピーが必要です。プライマリ・データベースでマスター暗号化鍵を再設定した場合は、そのマスター暗号化鍵が格納されているウォレットを各スタンバイ・データベースにコピーする必要があります。
透過的データ暗号化は、SQL*Loaderのダイレクト・パス・ロードを使用して機能します。暗号化列にロードされるデータは、ダイレクト・パス・ロードの過程で透過的に暗号化されます。
マテリアライズド・ビューの列も暗号化できます。ただし、マテリアライズド・ビュー・ログに暗号化列を含めることはできません。
表領域暗号化を使用すると、表領域全体を暗号化できます。 暗号化された表領域内に作成されるオブジェクトはすべて自動的に暗号化されます。表領域暗号化は、表内の機密データを保護する場合に便利です。暗号化が必要な列を判断するために、各表の列について詳細分析を実行する必要はありません。
表領域暗号化は、表の複数の列に機密データが含まれている場合や個々の列ではなく表全体を保護する場合に、列ベースの透過的データ暗号化にかわる有効な代替手段です。
表領域暗号化では、暗号化された表領域内に格納されているデータはすべて暗号化されます。 この場合、BLOBやCLOBなどの内部ラージ・オブジェクト(LOB)も暗号化の対象となります。 表領域暗号化では、表領域の外部に格納されているデータは暗号化されません。たとえば、データベース外部に格納されるBFILEデータは暗号化されません。暗号化された表領域内でBFILE列を含む表を作成した場合、この特別な列は暗号化されません。
暗号化された表領域内のすべてのデータは、ディスク上に暗号化された形式で格納されます。データの表示または変更に必要な権限を付与されているユーザーに対しては、データが透過的に復号化されます。データベース・ユーザーは、特定の表がディスク上で暗号化されているかどうかを認識する必要はありません。ディスク上のデータ・ファイルまたはバックアップ・メディアが盗まれた場合でも、データの安全性は損なわれません。
表領域暗号化は、透過的データ暗号化アーキテクチャを使用して表領域を透過的に暗号化(および復号化)します。表領域暗号化のマスター鍵は、透過的データ暗号化のマスター鍵の格納に使用されるウォレットと同じOracleウォレットに格納されます。この表領域暗号化のマスター鍵は表領域暗号化鍵の暗号化に使用され、表領域暗号化鍵は表領域のデータの暗号化と復号化に使用されます。
暗号化データは、JOINやSORTなどの操作中も保護されます。これは、データが一時表領域に移動される場合に安全であることを意味します。UNDOログとREDOログのデータも保護されます。
表領域暗号化を使用すると、暗号化された表領域のデータに対して索引レンジ・スキャンを実行することもできます。索引レンジ・スキャンは、列ベースの透過的データ暗号化では実行できません。
表領域暗号化を使用するには、Oracle Database 11g リリース1(11.1)を実行する必要があります。以前のリリースからアップグレードした場合は、データベースの互換性を11.0.0以上に設定する必要があります。
|
注意: COMPATIBLE初期化パラメータを使用して更新したデータベース互換性を元に戻すことはできません。 |
次に、表領域暗号化を実装する手順を説明します。
表領域のマスター暗号化鍵の設定は、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)できません。 |
暗号化された表領域を作成するには、その前に、表領域のマスター暗号化鍵が格納されている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;
明示的にオープンする必要があるウォレットが提供する特別なセキュリティを必要としない環境では、自動ログイン・ウォレットを使用することもできます。ただし、この方法はお薦めしません。
暗号化された表領域は、CREATE TABLESPACEコマンドを使用して作成できます。permanent_tablespace_clauseを使用すると、暗号化アルゴリズムと暗号化鍵の長さを選択できます。storage_clauseのENCRYPTキーワードによって、表領域が暗号化されます。構文は、次のとおりです。
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です。
|
注意:
|
例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 Data Pumpユーティリティを使用して、暗号化された表領域にデータをインポートすることはできます。 CREATE TABLE...AS SELECT...やALTER TABLE...MOVE...などのSQLコマンドを使用して、暗号化された表領域にデータを移動することもできます。 CREATE TABLE...AS SELECT...コマンドでは、表を既存の表から作成できます。 ALTER TABLE...MOVE...コマンドでは、表を暗号化された表領域に移動できます。
ハードウェア・セキュリティ・モジュール(HSM)は、暗号化鍵のために安全な記憶域を提供する物理的なデバイスです。暗号化および復号化の操作を実行するための安全な計算領域(メモリー)も提供します。HSMは、Oracleウォレットにかわる安全性の高い代替手段です。
透過的データ暗号化では、機密データに対して強化されたセキュリティを提供するためにHSMを使用できます。HSMは、透過的データ暗号化に使用されるマスター暗号化鍵の格納に使用されます。HSMは物理的なデバイスであり、オペレーティング・システム・ファイルではないため、鍵は、許可されていないアクセスの試みから保護されます。マスター暗号化鍵を使用する暗号化および復号化のすべての操作は、HSMの内部で実行されます。これは、安全性の低いメモリー内でもマスター暗号化鍵が危険にさらされないことを意味します。
HSMを使用する手続きには、HSMデバイスの初期設定が含まれます。HSMを使用するには、透過的データ暗号化も構成する必要があります。初期設定を実行した後は、HSMをOracleソフトウェア・ウォレットと同様に使用できます。次に、ハードウェア・セキュリティ・モジュールを構成および使用する手順を説明します。
ENCRYPTION_WALLET_LOCATIONパラメータは、Oracleウォレットの位置を指定します。ソフトウェア・ウォレットのかわりにHSMを使用することを反映するには、このパラメータを変更する必要があります。
ENCRYPTION_WALLET_LOCATIONパラメータを設定する手順は、次のとおりです。
sqlnet.oraファイルを開きます。このファイルは、$ORACLE_HOME/network/adminディレクトリにあります。
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))
ファイルを保存して閉じます。
関連する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ライブラリを以前のベンダーから新しいベンダーに置換してください。 |
HSMインタフェースを設定するための指示は、HSMベンダーによって提供されます。HSM管理インタフェースを使用し、ベンダーの指示に従ってHSMを設定してください。データベースがHSMとの相互作用に使用するユーザー・アカウントとパスワードを作成します。
|
注意: 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_Idとpasswordは自動的には作成されません。これらは、ALTER SYSTEM SET ENCRYPTION KEYコマンドを発行する前に、HSM管理インタフェースを使用して設定しておく必要があります。これは、Oracleウォレットに使用される手順とは異なります。Oracleウォレットでは、ALTER SYSTEM SET ENCRYPTION KEYコマンドを発行する前に、前述の設定を行う必要はありません。 |
透過的データ暗号化をすでに使用していて、HSMを使用していない場合は、前述のコマンドでMIGRATE USING wallet_password句を使用する必要があります。この指定によって、既存の列暗号化鍵が復号化され、新しく作成したHSMベースのマスター暗号化鍵を使用して列暗号化鍵が再度暗号化されます。
|
注意: データベースに公開鍵を使用して暗号化した列が含まれている場合は、その列が復号化され、HSMベースの透過的データ暗号化によって生成されたAES対称鍵を使用して再度暗号化されます。 |
表領域暗号化をすでに使用していて、HSMを使用していない場合は、表領域暗号化ではすべての暗号化および復号化の操作で引き続き同じソフトウェア・ウォレットを使用します。 既存の表領域のマスター暗号化鍵は、HSMに移行できません。
この手順は、すでに表領域暗号化にソフトウェア・ウォレットを使用している場合に当てはまります。この手順は、暗号化データをエクスポートした場合や、ソフトウェア・ウォレットを使用して暗号化したバックアップを作成した場合にも必要です。
表領域暗号化では、ソフトウェア・ウォレットを使用して表領域のマスター暗号化鍵にアクセスします。また、Oracle Data PumpやRecovery Managerなどのツールでは、ソフトウェア・ウォレットを使用してエクスポートまたはバックアップしたデータに対して復号化および暗号化の操作を実行する際に、古いソフトウェア・ウォレットにアクセスする必要があります。
ソフトウェア・ウォレットを再構成するには、次のいずれかのアプローチを使用できます。
ウォレット・パスワードをHSMのuserId:password文字列に変更する方法。ここで、
user_Idは、HSM管理インタフェースを使用してデータベースに対して作成したユーザーIDです。
passwordは、HSM管理インタフェースを使用してユーザーIDに対して作成したパスワードです。user_Id:password文字列は、二重引用符(" ")で囲みます。
ソフトウェア・ウォレットのパスワードは、Oracle Wallet Managerを使用して変更します。
自動ログイン・ウォレットを使用する方法。自動ログイン・ウォレットのファイルは、.ssoの拡張子で識別されます。自動ログイン・ウォレットは、明示的なオープンを必要とするウォレットで提供される特別なセキュリティが不要な環境の場合にのみ使用してください。
セキュリティ管理者は、暗号化または復号化を実行する前に、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
ここでは、透過的データ暗号化と表領域暗号化の開始に役立つチュートリアル・アプローチを使用します。次の各タスクについてサンプル・シナリオを使用して説明します。
透過的データ暗号化の使用を開始するには、最初にデータベースを準備します。このためには、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)を指定しないでください。 |
次に、マスター暗号化鍵を作成する必要があります。このマスター暗号化鍵は、列暗号化鍵の暗号化に使用されます。マスター暗号化鍵を作成するには、次のコマンドを入力します。
SQL> ALTER SYSTEM SET KEY IDENTIFIED BY "welcome1";
このコマンドによって、次の内容が実行されます。
暗号化ウォレットが指定のディレクトリに存在していない場合は、暗号化ウォレット(ewallet.p12)が作成され、このウォレットがオープンされて、透過的データ暗号化用のマスター暗号化鍵が作成(または再作成)されます。
暗号化ウォレットが指定のディレクトリに存在している場合は、そのウォレットがオープンされて、透過的データ暗号化用のマスター暗号化鍵が作成(または再作成)されます。
|
注意:
|
Oracleウォレットは、データベースが停止するたびにクローズします。このウォレットは明示的にクローズすることもできます。
暗号化または復号化の操作を実行するには、その前に、Oracleウォレットがオープンしていることを確認する必要があります。マスター暗号化鍵が格納されているウォレットをオープンするには、次のコマンドを使用します。
ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "welcome1";
|
注意: 前述のコマンドで使用したパスワードは、マスター暗号化鍵の作成で使用したパスワードと同じです。このパスワードは、ウォレットをオープンし、マスター暗号化鍵をアクセス可能にするためのパスワードになります。 |
この時点では、暗号化列を含む表を作成できるようになっています。ここでは、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列に入力されたすべてのデータは、暗号化された形式でディスク上に格納されます。
saltなしで列を暗号化した場合は、その暗号化列に対して索引を作成できます。ここでは、credit_card_number列に対して索引を作成します。credit_card_number列に対して索引を作成するには、次のコマンドを使用します。
CREATE INDEX cust_payment_info_idx ON cust_payment_info (credit_card_number);
既存の表は、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列の既存のデータはすべて、ディスク上で暗号化されます。データへのアクセス権があるデータベース・ユーザーには、データが透過的に復号化されます。
表領域暗号化を使用すると、表領域全体を暗号化できます。表領域に格納されているすべてのデータは、デフォルトで暗号化されます。このように、暗号化された表領域に表を作成すると、その表はデフォルトで暗号化されます。暗号化が必要な列を判断するために、各表の列について詳細分析を実行する必要はありません。
ここでは、暗号化された表を格納するために、暗号化された表領域を作成します。次のコマンドを使用して、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.
暗号化された表領域に表を作成すると、表内のデータはすべて、暗号化された形式でディスク上に格納されます。次のコマンドを使用して、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.
ここでは、透過的データ暗号化の構成時および使用時に表示される可能性がある一般的なエラー・メッセージをリストします。エラー・メッセージの一般的な原因と、考えられる解決策についても示します。
この項では、次の項目について説明します。
デフォルトでは、透過的データ暗号化には、192ビット長の暗号鍵を使用するAdvanced Encryption Standard(AES192)を使用します。また、特に指定しない場合は、暗号化の前にクリアテキストにsaltがデフォルトで追加されます。暗号化の対象となる索引付けされた列にはsaltを追加できないことに注意してください。索引付けされた列に対しては、SQL ENCRYPT句でNO SALTパラメータを選択します。
既存の暗号化列の暗号化アルゴリズムおよび暗号化鍵を変更するには、SQL ENCRYPT句で別のアルゴリズムを設定します。
|
関連項目:
|
表3-1に、サポートされる暗号化アルゴリズムを示します。
表3-1 透過的データ暗号化でサポートされる暗号化アルゴリズム
| アルゴリズム | 鍵のサイズ | パラメータ名 |
|---|---|---|
|
Triple-DES(データ暗号化規格) |
168ビット |
|
|
AES(Advanced Encryption Standard) |
128ビット |
|
|
AES |
192ビット(デフォルト) |
|
|
AES |
256ビット |
|
整合性保護のために、SHA-1ハッシュ・アルゴリズムが使用されます。
この機能を使用して暗号化できるデータ型は、次のとおりです。
BINARY_DOUBLE
BINARY_FLOAT
CHAR
DATE
INTERVAL DAY TO SECOND
INTERVAL YEAR TO MONTH
NCHAR
NUMBER
NVARCHAR2
RAW
TIMESTAMP(TIMESTAMP WITH TIME ZONEおよびTIMESTAMP WITH LOCAL TIME ZONEを含む)
VARCHAR2
暗号化列のサイズが列のデータ型で使用可能なサイズより大きくなる場合は、列を暗号化できません。表3-2に、様々なデータ型について、許容される最大サイズを示します。
表3-3に、透過的データ暗号化の実装および管理に使用可能なSQLコマンドのサマリーを示します。
表3-3 透過的データ暗号化のSQLコマンドのクイック・リファレンス