Oracle Label Securityでは標準Oracle Databaseユーティリティをサポートしますが、一定の制限が適用され、期待される結果を得るには追加の手順が必要になる場合があります。
内容は次のとおりです。
Oracle Database 12c以降、完全なデータベース・エクスポートおよびインポート操作を実行するときに、LBACSYSスキーマにあるOracle Label Securityのメタデータを含めることができます。
ソース・データベースは、Oracle Database 11gリリース2 (11.2.0.3)以上に対応しますが、ターゲット・データベースはOracle Database 12c以上である必要があります。
ターゲット・データベースに対してData Pumpインポートを開始する前に、Oracle Label Securityを有効にする必要があります。
Data Pumpエクスポート・ユーティリティは、Oracle Label Securityで標準的な方法で動作します。
ただし、Oracle Label Securityポリシーの施行結果にいくつか違いがあります。
注意:
表のすべての行をエクスポートするにはEXEMPT ACCESS POLICY権限が必要で、そうでない場合は行がエクスポートされません。
Oracle Label Securityポリシーで保護されている表の場合は、読取りアクセスが認可されているラベル付きの行のみがエクスポートされます。認可されていない行は、エクスポート・ファイルに含まれません。したがって、保護された表のすべてのデータをエクスポートするには、完全なアクセス権を付与する権限(FULLやREADなど)が必要です。
ポリシーを再適用するSQL文は、エクスポート対象の表およびスキーマとともにエクスポートされます。この種の文はインポート中に実行され、元のデータベース内と同じ施行オプションを使用してポリシーが再適用されます。
HIDEプロパティはエクスポートされません。保護されている表をエクスポートすると、その表のラベル列も(数値として)エクスポートされます。ただし、ラベル列が非表示に設定されていると、通常の表示列としてエクスポートされます。
表のすべての行をエクスポートするには、ユーザーにEXEMPT ACCESS POLICYが必要で、そうでない場合は行がエクスポートされません。
Oracle Data Pumpにより、データベース間でデータとメタデータを高速で移動できます。
内容は次のとおりです。
完全なデータベース・エクスポートおよびインポート操作を実行するときに、LBACSYSスキーマにあるOracle Label Securityのメタデータを含めることができます。
ソース・データベースは、Oracle Database 11gリリース2 (11.2.0.3)以上に対応しますが、ターゲット・データベースはOracle Database 12cリリース1 (12.1)以上である必要があります。
Oracle Data Pumpインポート・ユーティリティ、impdpは、ポリシー、ラベル、ユーザー認証、スキーマおよび表ポリシーの強制を含むLabel Securityメタデータを自動的にインポートします。インポート操作を開始する前に、ターゲット・データベースに対してOracle Label Securityを登録し、有効にする必要があります。
Oracle Label SecurityでOracle Data Pumpインポート・ユーティリティ・ファンクションを使用できます。
内容は次のとおりです。
関連項目:
『Oracle Databaseユーティリティ』
Oracle Label Securityでimpdpを使用できます。
Oracle Label Securityでimpdpを使用するには、インポート・データベースを準備し、インポート・ユーザーが適切な認可を持っているかどうかを確認する必要があります。
エクスポート・ファイル内のデータとラベルの挿入に必要なラベルに対してインポート操作を実行するための認可を受ける必要があります。
次の要件を満たさない場合、インポート時にエラーが発生します。
表またはスキーマをそれに対するLabel Securityポリシーとともにインポートするには、SA_POLICY_ADMINパッケージに対する実行権限が必要です。
すべての行を確実にインポートできるように、インポート対象となるデータを持つすべてのポリシーについてpolicy_DBAロールを持つ必要があります。各スキーマまたは表のインポート後は、インポートされたオブジェクトにエクスポート・データベースからのポリシーが再適用されます。
次のように、エクスポートされたすべての行を書き込めるようにする必要もあります。
要件2:
FULL権限、またはインポート・ファイルに含まれるすべてのラベルを書き込める十分な認可をユーザーに付与できます。
表にユーザー定義のラベル付けファンクションを適用できます。
関連項目:
policy_DBAロールの詳細は、「Oracle Label Security管理者の責任」を参照してください
インポート時のラベル定義には、エクスポート・ファイルで使用されているポリシー・ラベルをすべて含める必要があります。
DBA_SA_LABELSデータ・ディクショナリ・ビューには、データ・ラベルがリストされます。エクスポート・データベース内でビューDBA_SA_LEVELS、DBA_SA_COMPARTMENTS、DBA_SA_GROUPSを使用すると、インポート・データベース内でポリシーごとにラベル・コンポーネントとラベルを再作成する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コマンドを使用して集中管理されるため、動的ラベル生成は許可されません。「Oracle Internet Directoryを使用したLabel Security用コマンドライン・ツール」を参照してください。
Oracle Label Securityがディレクトリ対応の場合、TO_DATA_LABELファンクションは使用できず、使用するとエラー・メッセージが生成されます。
表12-1に、SQL*LoaderでOracle Label Securityのデータをロードする際に使用できるバリエーションを示します。
表12-1 SQL*LoaderへのOracle Label Security入力の選択肢
| データの書式 | 結果の説明 |
|---|---|
|
非表示列がデータのタグ値とともにデータ・ファイルから直接ロードされます。 |
|
文字ラベルとそのタグ値間の変換に使用されるデータ |
|
|
|
入力 |
たとえば、次のようにデータを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構文については、『Oracle Database SQL言語リファレンス』を参照してください。
アプリケーション表に対してANALYZEを実行すると、アプリケーションのSQLパフォーマンスが改善されます。
ポリシーのラベル列で適切なタイプの索引を作成すると、保護されている表に対してユーザーが発行する問合せのパフォーマンスが改善されます。
特定のスキーマ内でデータベース表にOracle Label Securityポリシーを適用している場合は、様々なラベルの数をデータ量と比較する必要があります。この情報に基づいて、ポリシーのラベル列で作成する索引のタイプを決定できます。
ポリシー・ラベル列のデータのカーディナリティ(つまり、行数に対するラベル数の割合)が低い場合は、ビットマップ索引の作成を考慮してください。
ポリシー・ラベル列のデータのカーディナリティが高い場合は、Bツリー索引の作成を考慮してください。
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列で索引を作成できます。
より複雑な問合せを考えます(この場合も、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列に基づいてコンポジット索引を作成し、アプリケーションのパフォーマンスを改善できます。
最適なパフォーマンスを得るために、ラベル・タグに値を割り当てる方針を作成できます。
通常、最も適切な方法は、機密性レベルの高いラベルほど大きい数値を割り当てることです。
これは、一般に、比較的低レベルでデータを表示できるユーザーが多い一方、多数のレベルのデータを高レベルで表示できるユーザーは少ないためです。
また、READ_CONTROLを設定すると、Oracle Label Securityでは、BETWEEN句を使用して問合せの処理対象となる行を制限する述語が生成されます。次の例のように、機密性の高いラベルのラベル・タグの方が機密性の低いラベルよりも上位でない場合、問合せでは大量の行セットが検査される可能性があります。これはパフォーマンスに影響します。
表12-2に、次のように割り当てられるラベル・タグのセットを示します。
表12-2 ラベル・タグのパフォーマンスの例: 適切な値
| ラベル | ラベル・タグ |
|---|---|
|
|
|
|
|
|
|
|
最大の認可が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;
問合せではユーザーの認証に基づいてデータのサブセットのみが検査されるため、パフォーマンスが改善されます。ユーザーがアクセスを認可されていない行を処理するのは無意味です。
表12-3に、タグ値が次のように割り当てられた場合に不要な作業がどのように実行されるかを示します。
表12-3 ラベル・タグのパフォーマンスの例: 不適切な値
| ラベル | ラベル・タグ |
|---|---|
|
|
|
|
|
|
|
|
この場合、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 Label Securityのインストール後に、追加のデータベースを作成および構成できます。
内容は次のとおりです。
Oracle Database Enterprise EditionおよびOracle Label Securityのインストール時に、初期Oracleデータベースが作成されます。
データベースの追加作成が必要な場合は、Database Configuration Assistantを使用する必要があります。また、『Oracle Database管理者ガイド』に記載されている手順に従ってデータベースを追加作成する方法もあります。
新規データベースを作成するたびに、そこにOracle Label Securityのデータ・ディクショナリ表、ビューおよびパッケージをインストールし、LBACSYSアカウントを作成する必要があります。
最初のデータベースの場合は、カスタム・インストールを選択するかどうかにかかわらず、Oracle Label Securityのインストール時にこのタスクが自動的に実行されます。カスタム・インストールを選択しない場合は、シード内のラベル・セキュリティ・スキーマでデータベースをインストールすることになります。
追加のデータベースを作成するには、最初のデータベースをカスタム・インストールとシード内のラベル・セキュリティ・スキーマのどちらでインストールしたかに応じて、ラベル・セキュリティの構成に様々なプロセスがあります。
最初にカスタム・インストールを選択し、ラベル・セキュリティをインストールしなかった場合は、この項で説明するいずれかのプロセスを使用してラベル・セキュリティをインストールおよび構成できます。
Oracle Label Securityのアップグレードおよびダウングレードの管理方法に注意する必要があります。
内容は次のとおりです。
Oracleには、アップグレードおよびダウングレード操作を実行する事前処理スクリプトが用意されています。
安全確保のため、アップグレードまたはダウングレード事前処理スクリプトを実行する前に、監査レコードをバックアップすることをお薦めします。これを行うには、『Oracle Databaseセキュリティ・ガイド』の説明に従って、監査証跡をアーカイブします。
実行する前に、事前処理スクリプトは、すべての監査レコードをコピーするのに十分な領域が監査表領域にあることをチェックし、領域が十分でない場合は処理せずに終了します。
OLS事前処理スクリプトの実行中も、データベース上でアプリケーションを継続して実行できます。
関連項目:
Oracle Label SecurityおよびOracle Database Vaultを使用しているデータベースのアップグレードの要件は、『Oracle Databaseアップグレード・ガイド』を参照してください
Oracleには、アップグレードの実行前に実行する必要がある事前処理スクリプトが用意されています。
内容は次のとおりです。
Oracle Database 12cリリース1 (12.1)より前のデータベース用のOracle Label Securityをアップグレードする必要があります。
注意:
Oracle Label SecurityまたはDatabase Vaultを使用するOracle Database 12cリリース(12.1)より前のデータベースをアップグレードする前に、olspreupgrade.sqlスクリプトを実行する必要があります。
Oracle Databaseリリース12c以降にアップグレードした後は、データベースのパッチ適用またはアップグレード時にOracle Label Security事前処理スクリプトを実行する必要はありません。
OLSアップグレード・プロセスを実行する前に、Oracle Label Security事前処理アップグレード・スクリプトolspreupgrade.sqlを実行してAUD$表の内容を処理する必要があります。OLSアップグレードでは、AUD$表が、SYSTEMスキーマからSYSスキーマに移動されます。olspreupgrade.sqlスクリプトは、この移動に必要な事前処理スクリプトです。このスクリプトでは、SYSスキーマに一時表PREUPG_AUD$が作成され、SYSTEM.AUD$レコードがSYS.PREUPG_AUD$に移動されます。移動されたレコードは、DBA_AUDIT_TRAILビューで参照できなくなりますが、アップグレードが完了するまではSYS.PREUPG_AUD$表に直接アクセスすることで表示できます。アップグレードの完了後に、SYS.PREUPG_AUD$表が完全に削除され、すべての監査レコードはDBA_AUDIT_TRAILビューを通じて表示できます。
アップグレード前にOracle Label Security事前処理スクリプトを実行できます。
注意:
Oracle Label Security事前処理スクリプトでエラーがレポートされた場合、Oracle Label Securityコンポーネントのアップグレード・ステータスはINVALIDとマークされます。この状況が発生した場合は、エラーを修正してからアップグレード・プロセスを再実行する必要があります。Oracle Databaseのアップグレード・プロセスの再実行の詳細は、『Oracle Databaseアップグレード・ガイド』を参照してください。
Oracleには、ダウングレード前に実行する必要がある事前処理スクリプトが用意されています。
内容は次のとおりです。
Oracle Label SecurityまたはOracle Database Vaultを使用するOracle Database 12cリリース1 (12.1)以降のデータベースからダウングレードできます。
そのためには、OLS事前処理スクリプトolspredowngrade.sqlを実行して、AUD$表の内容を処理する必要があります。OLSダウングレード・スクリプトは、AUD$表をSYSスキーマからSYSTEMスキーマに移動します。olspredowngrade.sqlスクリプトは、この移動の前処理に必要な処理スクリプトです。このスクリプトでは、SYSTEMスキーマに一時表PREDWG_AUD$が作成され、SYS.AUD$レコードがSYSTEM.PREDWG_AUD$に移動されます。移動されたレコードは、DBA_AUDIT_TRAILビューで参照できなくなりますが、ダウングレードが完了するまではSYSTEM.PREDWG_AUD$表に直接アクセスすることで表示できます。ダウングレードが完了すると、SYSTEM.PREDWG_AUD$表は完全に削除されます。この時点で、すべての監査レコードは、DBA_AUDIT_TRAILデータ・ディクショナリ・ビューで表示できます。