標準Oracle DatabaseユーティリティはOracle Label Securityで使用できますが、一定の制限が適用され、期待される結果を得るには追加の手順が必要になる場合があります。この章では、このような考慮事項について説明します。この章の説明では、NUMBER型のポリシー・ラベル列を使用する場合を想定しています。
この章の内容は、次のとおりです。
エクスポート・ユーティリティは、Oracle Label Securityで標準的な方法で動作します。ただし、Oracle Label Securityポリシーの施行結果にいくつか違いがあります。
Oracle Label Securityポリシーで保護されている表の場合は、読取りアクセスが認可されているラベル付きの行のみがエクスポートされます。認可されていない行は、エクスポート・ファイルに含まれません。したがって、保護された表のすべてのデータをエクスポートするには、完全なアクセス権を付与する権限(FULLやREADなど)が必要です。
ポリシーを再適用するSQL文は、エクスポート対象の表およびスキーマとともにエクスポートされます。この種の文はインポート中に実行され、元のデータベース内と同じ施行オプションを使用してポリシーが再適用されます。
HIDEプロパティはエクスポートされません。保護されている表をエクスポートすると、その表のラベル列も(数値として)エクスポートされます。ただし、ラベル列が非表示に設定されていると、通常の表示列としてエクスポートされます。
Oracle Label Securityでは不透明な型が使用されるため、LBACSYSスキーマはエクスポートできません。Oracle Label Securityをインストールした状態でデータベース全体をエクスポートできますが(パラメータFULL=Y)、LBACSYSスキーマはエクスポートされません。
関連項目: 『Oracle Databaseユーティリティ』 |
この項では、Oracle Label Securityでのインポート・ユーティリティの機能について説明します。
関連項目: 『Oracle Databaseユーティリティ』 |
Oracle Label Securityでインポート・ユーティリティを使用するには、インポート・データベースを準備し、インポート・ユーザーが適切な認可を持っているかどうかを確認する必要があります。
Oracle Label Securityでインポート・ユーティリティを使用する前に、次の手順でインポート・データベースを準備する必要があります。
Oracle Label Securityをインストールします。
インポート対象のデータを保護するOracle Label Securityポリシーを作成します。このポリシーでは、エクスポート・データベースと同じ列名を使用する必要があります。
インポート・データベース内で、インポート対象の表に使用されているラベル・コンポーネントと個々のラベルをすべて定義します。各データベース内でポリシー・ラベルに割り当てるタグ値は同じにする必要があります。(エクスポート元のデータベースにインポートする場合、通常はコンポーネントがすでに定義されていることに注意してください。)
Oracle Label Securityでデータを正常にインポートするには、インポート操作を実行するユーザーは、エクスポート・ファイルに含まれているデータとラベルの挿入に必要なすべてのラベルに対する認可を受ける必要があります。次の要件が満たされない場合は、インポート時にエラーが発生します。
要件1: すべての行を確実にインポートできるように、ユーザーはインポート対象となるデータを持つすべてのポリシーについてpolicy_DBAロールを持つ必要があります。各スキーマまたは表のインポート後は、インポートされたオブジェクトにエクスポート・データベースからのポリシーが再適用されます。
要件2: ユーザーは、エクスポートされたすべての行を書き込めるようにする必要があります。そのためには、次の3つの方法があります。
ユーザーにFULL権限を付与できます。
表にユーザー定義のラベル付けファンクションを適用できます。
ユーザーに、インポート・ファイルに含まれるすべてのラベルを書き込める十分な認可を付与できます。
インポート時のラベル定義には、エクスポート・ファイルで使用されているポリシー・ラベルをすべて含める必要があります。エクスポート・データベース内でビューDBA_SA_LEVELS、DBA_SA_COMPARTMENTS、DBA_SA_GROUPSおよびDBA_SA_LABELSを使用すると、インポート・データベース内でポリシーごとにラベル・コンポーネントとラベルを再作成するSQLスクリプトを設計できます。次の例に、HRポリシーについて個々のラベルを再作成するPL/SQLブロックの作成方法を示します。
set serveroutput on BEGIN dbms_output.put_line('BEGIN'); FOR l IN (SELECT label_tag, label FROM dba_sa_labels WHERE policy_name='HR' ORDER BY label_tag) LOOP dbms_output.put_line (' SA_LABEL_ADMIN.CREATE_LABEL(''HR'', ' || l.label_tag || ', ''' || l.label || ''');'); END LOOP; dbms_output.put_line ('END;'); dbms_output.put_line ('/'); END; /
インポート・データベース内に、エクスポート・データベース内と同じ数値および文字列表現を持つ個々のラベルが存在しない場合、インポートされた表内のラベル値は無意味になります。表内の数値ラベル値が異なる文字列表現を参照したり、インポート・データベース内で定義されていないラベル値である場合があります。
ユーザーが無効な数値ラベルを含む行へのアクセスを試みると、操作は失敗します。
ポリシーのラベル列がNUMBER型として定義されている場合は、Oracle Label Securityがインストールされていないデータベースにインポートできます。この場合、ポリシーのラベル列の値は番号としてインポートされます。対応するOracle Label Securityのラベル定義がなければ、この番号で特定のラベルは参照されません。
Oracle Label Securityがインストールされていない場合は、インポートされた表とスキーマにポリシーを再適用するSQL文が失敗するため、インポート中にエラーが発生することに注意してください。
Oracle Label Securityポリシーで保護されている既存の表に、ラベルなしのデータをインポートできます。表への挿入時に行のラベルを自動的に初期化できるように、インポート対象となる表ごとにLABEL_DEFAULTオプションまたはラベル付けファンクションを指定する必要があります。
非表示列は通常の列としてエクスポートされ、非表示ではなくなります。ラベル列の非表示プロパティを保つ場合は、表をインポート・データベース内に事前に作成する必要があります。
インポートを実行する前に、表を作成し、HIDEオプションを指定してポリシーを適用します。これにより、ポリシーのラベル列は表に非表示列として追加されます。
エクスポート・ファイル内で指定した施行オプションをインポート操作中に表に再適用できるように、表からポリシーを削除します。
IGNORE=Y
を指定してインポートを実行します。IGNORE
パラメータをY
に設定すると、インポート時のエラーが無視されます。
HIDEオプションを指定して、表にポリシーを手動で適用します。
SQL*Loaderは、外部ファイルからOracle Database内の表にデータを移動します。この項には、次の項目が含まれます。
Oracle Label SecurityからSQL*Loaderへの入力
関連項目: ログ・ファイル、廃棄ファイル、エラー・ファイルなど、SQL*Loaderの詳細は、『Oracle Databaseユーティリティ』を参照してください。 |
従来型パスを指定してSQL*Loaderを使用すると、Oracle Label Securityで保護されているデータベースにデータをロードできます。SQL*LoaderではINSERT操作が実行されるため、Oracle Label Securityポリシーで保護されている表にSQL*Loaderを使用する場合は、標準的な要件がすべて適用されます。
表のポリシー列が非表示になっている場合は、HIDDENキーワードを使用して、この情報をSQL*Loaderに指示する必要があります。
入力ファイル内で行ラベルを指定するには、制御ファイル内のINTO TABLE句にポリシーのラベル列を含めます。
各行のデータとともにポリシー・ラベルをロードするには、SQL*Loaderの制御ファイル内でCHAR_TO_LABELファンクションまたはTO_DATA_LABELファンクションを指定できます。
注意: Oracle Label SecurityがOracle Internet Directoryで動作するようにインストールされている場合、ラベルはOracle Internet Directoryでolsadmintoolコマンドを使用して集中管理されるため、動的ラベル生成は許可されません。付録B「Oracle Internet Directoryを使用したLabel Security用コマンドライン・ツール」を参照してください。したがって、Oracle Label SecurityがOracle Internet Directory対応の場合、このTO_DATA_LABELファンクションは使用できず、使用するとエラー・メッセージが生成されます。 |
SQL*LoaderでOracle Label Securityのデータをロードする場合は、次のバリエーションを使用できます。
表14-1 SQL*LoaderへのOracle Label Security入力の選択肢
データの書式 | 結果の説明 |
---|---|
|
非表示列がデータのタグ値とともにデータ・ファイルから直接ロードされます。 |
|
非表示列がデータの文字値とともにデータ・ファイルからロードされます。func()を使用して、文字ラベルとタグ値の間の変換を行います。注意: func()はchar_to_label().の場合があります |
|
前述のcol2と同じですが、フィールド型はデフォルトでcharに設定されます。 |
|
非表示列は入力データにマップされません。func()がコールされ、ラベル値が提供されます。これはユーザー・ファンクションにすることができます。 |
たとえば、次のようにデータをDEPT表にロードするINTO TABLE句は、制御ファイル内で有効です。
INTO TABLE dept (hr_label HIDDEN POSITION (1:22) CHAR "CHAR_TO_LABEL('HR',:hr_label)", deptno POSITION (23:26) INTEGER EXTERNAL, dname POSITION (27:40) CHAR, loc POSITION(41,54) CHAR)
この制御ファイルで指定したデータファイル内のエントリは次のようになります。
HS:FN 231 ACCOUNTING REDWOOD SHORES
この項では、Oracle Label Securityで最適なパフォーマンスを達成する方法について説明します。
コストベース・オプティマイザにより問合せ時の実行計画を改善できるように、LBACSYSスキーマ内でOracle Label Securityのデータ・ディクショナリ表に対してANALYZEコマンドを実行します。これにより、Oracle Label Securityのパフォーマンスが改善されます。
アプリケーション表に対してANALYZEを実行すると、アプリケーションのSQLパフォーマンスが改善されます。
ポリシーのラベル列で適切なタイプの索引を作成すると、保護されている表に対してユーザーが発行する問合せのパフォーマンスを改善できます。
特定のスキーマ内でデータベース表にOracle Label Securityポリシーを適用している場合は、様々なラベルの数をデータ量と比較する必要があります。この情報に基づいて、ポリシーのラベル列で作成する索引のタイプを決定できます。
ポリシー・ラベル列のデータのカーディナリティ(つまり、行数に対するラベル数の割合)が低い場合は、ビットマップ索引の作成を考慮してください。
例1:
Oracle Label SecurityポリシーでEMP表が保護され、READ_CONTROL施行オプションが設定されており、HR_LABELがポリシー・ラベル列の名前である場合を考えます。ユーザーが次の問合せを発行するとします。
SELECT COUNT (*) FROM scott.emp;
この場合、Oracle Label Securityではラベル列に基づいて述語が追加されます。次に例を示します。
SELECT COUNT (*) FROM scott.emp WHERE hr_label=100;
これにより、Oracle Label Securityではセキュリティ・ラベルが使用され、ユーザーの認証に基づいて処理対象の行が制限されます。この問合せのパフォーマンスを改善するには、HR_LABEL列で索引を作成できます。
例2:
より複雑な問合せを考えます(この場合も、EMP表にREAD_CONTROLが適用されているとします)。
SELECT COUNT (*) FROM scott.emp WHERE deptno=10
この場合も、Oracle Label Securityではラベル列に基づいて述語が追加されます。
SELECT COUNT (*) FROM scott.emp WHERE deptno=10 AND hr_label=100;
この場合は、DEPTNOおよびHR_LABEL列に基づいてコンポジット索引を作成し、アプリケーションのパフォーマンスを改善できます。
関連項目: 『Oracle Databaseパフォーマンス・チューニング・ガイド』 |
最適なパフォーマンスを得るために、ラベル・タグに値を割り当てる方針を作成できます。通常、最も適切な方法は、機密性レベルの高いラベルほど大きい数値を割り当てることです。これは、一般に、比較的低レベルでデータを表示できるユーザーが多い一方、多数のレベルのデータを高レベルで表示できるユーザーは少ないためです。
また、READ_CONTROLを設定すると、Oracle Label Securityでは、BETWEEN句を使用して問合せの処理対象となる行を制限する述語が生成されます。次の例のように、機密性の高いラベルのラベル・タグの方が機密性の低いラベルよりも上位でない場合、問合せでは大量の行セットが検査される可能性があります。これはパフォーマンスに影響します。
たとえば、次のように割り当てられたラベル・タグを考えます。
最大の認可がS:Aであるユーザーは、ラベルS:A、SおよびU:Aでデータに潜在的にアクセスできます。このユーザーが次の問合せを発行するとします。
SELECT COUNT (*) FROM scott.emp;
Oracle Label Securityにより、このユーザーが表示できる行セットを制限するBETWEEN句を(ユーザーの最大認可と最小認可に基づいて)組み込む述語が追加されます。
SELECT COUNT (*) FROM scott.emp WHERE hr_label BETWEEN 10 AND 50;
問合せではユーザーの認証に基づいてデータのサブセットのみが検査されるため、パフォーマンスが改善されます。ユーザーがアクセスを認可されていない行を処理するのは無意味です。
これに対して、タグ値が次のように割り当てられている場合は、不必要な処理が実行されます。
この場合、S:A認可を持つユーザーは、100から10までのラベルの一部のみ参照できます。ただし、ユーザーはTS:A,Bラベル(ラベル・タグが50の行)を参照できません。ユーザーが最終的にこれらの行にアクセスできなくても、問合せではこれらの行が取得されて処理されます。
ラベルに適用した数値ラベル・タグで数値による順序付け方法を使用している場合は、これをOracle Databaseデータ・パーティション化の基礎として使用できます。アプリケーションによっては、ラベル値に基づいてデータをパーティション化できる場合とできない場合があります。
たとえば、多数の会社がサブスクライブするビジネス・ホスティングCRMアプリケーションを考えます。同じEMP表にサブスクライバ1およびサブスクライバ2の行(およびラベル)がある場合があります。つまり、ラベルが異なっていれば、両方の会社の情報を同じ表に格納できます。この場合、サブスクライバ1の従業員がサブスクライバ2のデータにアクセスする必要はないため、ラベルに基づいてパーティション化しても無意味です。あるパーティションにサブスクライバ1に関する行を入れて、別のパーティションにはサブスクライバ2に関する行を入れることができます。問合せが発行されると、ラベルに応じて一方または他方のパーティションにのみアクセスします。無関係なパーティションが問合せにより検査されることはないため、パフォーマンスが改善されます。
次の例にこの方法を示します。あるパーティションに2000番台のラベル、2番目のパーティションに3000番台のラベル、3番目のパーティションに4000番台のラベルを置きます。
CREATE TABLE EMPLOYEE (EMPNO NUMBER(10) CONSTRAINT PK_EMPLOYEE PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(4), HR_LABEL NUMBER(10)) TABLESPACE PERF_DATA STORAGE (initial 2M NEXT 1M MINEXTENTS 1 MAXEXTENTS unlimited) PARTITION BY RANGE (hr_label) (partition sx1 VALUES LESS THAN (2000) NOLOGGING, partition sx2 VALUES LESS THAN (3000), partition sx3 VALUES LESS THAN (4000) );
Oracle Database Enterprise EditionおよびOracle Label Securityのインストール時に、初期Oracleデータベースが作成されます。その後、該当するプラットフォーム用のOracle Label Securityインストレーション・ノートの説明に従って、Oracle Label Securityをインストールできます。
データベースの追加作成が必要な場合は、Database Configuration Assistantを使用することをお薦めします。また、『Oracle Database管理者ガイド』の第2章に記載されている手順に従ってデータベースを追加作成する方法もあります。
新規データベースを作成するたびに、そこにOracle Label Securityのデータ・ディクショナリ表、ビューおよびパッケージをインストールし、LBACSYSアカウントを作成する必要があります。最初のデータベースの場合は、Oracle Label Securityのインストール時にこのタスクが自動的に実行されます。2番目以降のデータベースの場合は、次のタスクを手動で実行する必要があります。
注意: ターゲットとなるOracle環境にOracle Label Securityを一度もインストールしていない場合は、まずOracle Universal Installerを使用してインストールする必要があります。 |
initsid.oraファイルで、COMPATIBLE パラメータを、実行中のOracle Databaseの現行リリースに設定します。(8.1.7以上のリリースを指定する必要があります。)
この変更が有効になるように、データベースをシャットダウンしてから再起動します。
スクリプト $ORACLE_HOME/rdbms/admin/catols.sql
を実行します。
このスクリプトにより、ラベルベースのフレームワーク、データ・ディクショナリ、データ型およびパッケージがインストールされます。スクリプトの実行後は、パスワードLBACSYSを持つLBACSYSアカウントが存在することになります。すべてのOracle Label Securityパッケージは、このアカウントの下にあります。
LBACSYSユーザーのデフォルト・パスワードを変更します。
これでOracle Label Securityポリシーの作成に進むことができます。
関連項目: Oracleデータベース作成の詳細は、『Oracle Database管理者ガイド』を参照してください。 |