プライマリ・コンテンツに移動
Oracle® Label Security管理者ガイド
12cリリース1 (12.1)
E56367-02
目次へ移動
目次
索引へ移動
索引

前
次

9 トラステッド・ストアド・プログラム・ユニットの管理および使用

トラステッド・ストアド・プログラム・ユニットを使用して、システム・セキュリティを強化できます。

内容は次のとおりです。

トラステッド・ストアド・プログラム・ユニットについて

Oracle Databaseストアド・プロシージャ、ファンクションおよびパッケージは、コンパイルされた形式でデータベースに格納されているPL/SQL文のセットです。

ファンクションとプロシージャの唯一の違いは、ファンクションは値を戻すのに対して、プロシージャは値を戻さないことです。トラステッド・ストアド・プログラム・ユニットは、Oracle Databaseの他のストアド・プログラム・ユニットと同様で、基礎となるロジックは同じです。

パッケージは、使用するカーソルおよび変数とともにユニットとして格納されるプロシージャとファンクションのセットです。パッケージは、パッケージ仕様部とパッケージ本体という2つの部分で構成されています。パッケージ仕様部では、パッケージに含まれるパブリック・プロシージャ、ファンクションおよび変数の外部定義を宣言します。パッケージ本体には、プロシージャとファンクションの実際のテキストと、プライベートなプロシージャおよび変数が含まれています。

トラステッド・ストアド・プログラム・ユニットは、1つ以上のOracle Label Security権限を付与されたストアド・プロシージャ、ファンクションまたはパッケージです。通常、トラステッド・ストアド・プログラム・ユニットは、ユーザーが権限を付与されている操作を制御された方法で実行したり、複数のラベルのデータを更新できるようにするために使用されます。これは、ユーザーに対して認可の範囲を超えるデータへのアクセスを許可する場合に最適なアプローチです。

トラステッド・ストアド・プログラム・ユニットは、権限の使用に対するファイングレイン・コントロールを提供します。多数のユーザーに潜在的に権限を付与できますが、アプリケーションについて設定したセキュリティ・ポリシーに違反する可能性があるため、権限の付与には細心の注意を払う必要があります。ユーザーに権限を割り当てるのではなく、権限を必要とするアプリケーション操作を識別し、それをトラステッド・プログラム・ユニットとして実装できます。このようなストアド・プログラム・ユニットに権限を付与すると、実際にはユーザーが必要とするOracle Label Security権限を制限することになります。このアプローチは、最小限の権限の原理を採用しています。

たとえば、ラベルCONFIDENTIALを持つユーザーがSENSITIVE行へのデータの挿入を必要とする場合は、ユーザーがアクセスするトラステッド・ストアド・プログラムにWRITEUP権限を付与できます。これにより、ユーザーはトラステッド・ストアド・プログラムを使用して、CONFIDENTIALレベルでタスクを実行できます。

すべてのアクションは、ユーザーにかわってトラステッド・プログラム・ユニットにより実行されます。そのため、セキュリティ・ポリシーをモジュールに効率的にカプセル化し、それが有効かどうかを検証できます。

トラステッド・ストアド・プログラム・ユニットの動作

トラステッド・ストアド・プログラム・ユニットは、独自の権限とコール元のラベルを使用して実行されます。

このようにして、トラステッド・ストアド・プログラム・ユニットは、ユーザーのラベルで制約されている行セットに対して、権限が付与されている操作を実行できます。

Oracle Databaseシステムおよびオブジェクト権限は、ロールにバンドルすることを意図しています。ユーザーには、必要に応じてロール権限が付与されます。これに対して、Oracle Label Security権限の割当て対象となるのは、ユーザーまたはストアド・プログラム・ユニットのみです。この種のトラステッド・ストアド・プログラム・ユニットは、Oracle Label Security権限の使用を制御するという点で、ロールよりも管理しやすいメカニズムを提供します。

トラステッド・ストアド・プログラム・ユニットの例

READ権限を持つトラステッド・ストアド・プログラム・ユニットは、保護されていないすべてのデータと、このポリシーにより保護されているすべてのデータを読み取ることができます。

たとえば、購買予測レポートの作成を担当するユーザーを考えます。このユーザーは、すべての発注金額の集計操作を実行する必要があります。これは、そのユーザーのラベルで個々の発注書へのアクセスが認可されているかどうかには関係ありません。この例で集計プロシージャを作成する構文は、次のとおりです。

CREATE FUNCTION sum_purchases RETURN NUMBER IS
  psum NUMBER;
BEGIN
  SELECT SUM(amount) INTO psum
  FROM purchase_orders;
RETURN psum;
END sum_purchases;

これにより、プログラム・ユニットは、エンド・ユーザーが収集できない情報を収集し、集計により使用可能にできます。

SUM_PURCHASESを実行するには、ユーザーにこのプロシージャに対する標準Oracle Database EXECUTEオブジェクト権限が付与されている必要があります。

トラステッド・ストアド・プログラム・ユニットの作成およびコンパイル

Oracle Label Securityで使用するために、トラステッド・ストアド・プログラム・ユニットを作成およびコンパイルできます。

内容は次のとおりです。

トラステッド・ストアド・プログラム・ユニットの作成

トラステッド・ストアド・プログラム・ユニットは、標準的なプロシージャ、ファンクションまたはパッケージを作成する場合と同じ方法で作成できます。

そのために、CREATE PROCEDURECREATE FUNCTIONまたはCREATE PACKAGEおよびCREATE PACKAGE BODYの各文を使用できます。

プログラム・ユニットは、Oracle Label Security権限を付与するとトラステッド・プログラム・ユニットになります。

関連項目:

Oracle Database SQL言語リファレンス

トラステッド・ストアド・プログラム・ユニットの権限

Oracle Label Security管理者は、ストアド・プログラム・ユニット・コードが正しいかどうかを検証してから、権限を付与できます。

通常、ストアド・プログラム・ユニットは、別のユーザー(開発者など)によって作成されます。トラステッド・ストアド・プログラム・ユニットが再作成または置換されると、その権限はOracle Label Securityにより削除されます。Oracle Label Security管理者はコードを再検証し、権限を再び付与する必要があります。

Oracle Label Security管理者は、プログラム・ユニット・コードを慎重に検討し、付与される権限を評価する必要があります。たとえば、トラステッド・パッケージ内のプロシージャが、権限を付与されているデータベース操作を実行してパッケージのパブリック変数に結果またはステータス情報を書き込まないようにしてください。これにより、サイトのOracle Label Securityポリシーに違反が発生しないことが確実になります。

トラステッド・ストアド・プログラム・ユニットの再コンパイル

トラステッド・ストアド・プログラム・ユニットの再コンパイルを自動的に行うか手動で(ALTER PROCEDUREを使用して)行うかは、Oracle Label Security権限には影響しません。

ただし、再コンパイル後はプログラム・ユニットに対するEXECUTE権限を再び付与する必要があります。

トラステッド・ストアド・プログラム・ユニットの再作成

Oracle Label Security権限は、トラステッド・ストアド・プログラム・ユニットに対してCREATEまたはREPLACE操作を実行すると取り消されます。

これにより、プロシージャでOracle Label Security権限が誤用される可能性が限定されます。

Oracle Label Security権限が取り消されても、プロシージャ、ファンクションまたはパッケージは引き続き実行できることに注意してください。

プロシージャ、ファンクションまたはパッケージを再作成する場合は、そのテキストを慎重に検討する必要があります。再作成後のプログラム・ユニットがサイトのOracle Label Securityポリシーに違反しないことが確実であれば、必要な権限を再び付与できます。

トラステッド・ストアド・プログラム・ユニットを頻繁に置換する必要のある開発環境(本番システムの最初の数か月など)では、必要に応じて適切なOracle Label Security権限を付与できるようにスクリプトを作成することをお薦めします。

トラステッド・ストアド・プログラム・ユニットの実行

Oracle Label Securityでは、(表およびスキーマへのアクセスに関する)プロシージャ・コールのすべての標準Oracle Databaseコントロールはまだ有効です。

Oracle Label Securityは、行へのアクセスを制御することで、これらのセキュリティ・メカニズムを補完します。

トラステッド・ストアド・プログラム・ユニットの実行時に有効なポリシー権限は、コール側ユーザーの権限とプログラム・ユニットの権限との共用部分です。トラステッド・ストアド・プログラム・ユニットが別のトラステッド・プログラム・ユニットまたは非トラステッド・プログラム・ユニットをコールすると、コールされたプログラム・ユニットはコール側のプログラム・ユニットと同じ権限で実行されます。

非トラステッド・ストアド・プログラム・ユニットとトラステッド・ストアド・プログラム・ユニットが連なって実行される場合、最初のトラステッド・プログラム・ユニットによって、それ以降の順序でコールされるプログラム・ユニット全体の権限が決まります。次の順序を考えてみます。

  • プロシージャA (非トラステッド)
  • WRITEUP権限を持つプロシージャB
  • WRITEDOWN権限を持つプロシージャC
  • プロシージャD (非トラステッド)

プロシージャBは順序内の最初のトラステッド・プロシージャのため、プロシージャB、CおよびDはすべてWRITEUP権限で実行されます。順序が終了すると、プロシージャBに関する権限は後続のプロシージャには無効になります。

注意:

トラステッド・プログラム・ユニットに発生した未処理例外は、Oracle Label Securityにより捕捉されます。これは、ユーザーにエラー・メッセージが表示されない場合があることを意味します。このため、権限を付与する前に、常にすべてのプログラム・ユニットを細部に至るまでテストし、デバッグする必要があります。

ラベル情報を設定して戻す動作

SA_UTLパッケージには、数値ラベル値を使用してセッション・セキュリティ属性の現在の値に関する情報を戻すためのファンクションがあります。

これらのファンクションは、非トラステッド・プログラム・ユニットにも使用できますが、主としてトラステッド・ストアド・プログラム・ユニット用です。

これらはパブリック・ファンクションであり、policy_DBAロールがなくても使用できることに注意してください。また、各ファンクションには、同じラベルを文字列書式で戻すパラレルのSA_SESSIONファンクションがあります。