12 トラステッド・ストアド・プログラム・ユニットの管理および使用
トラステッド・ストアド・プログラム・ユニットを使用して、システム・セキュリティを強化できます。
- トラステッド・ストアド・プログラム・ユニットについて
Oracle Databaseストアド・プロシージャ、ファンクションおよびパッケージは、コンパイルされた形式でデータベースに格納されているPL/SQL文のセットです。 - トラステッド・ストアド・プログラム・ユニットの動作
トラステッド・ストアド・プログラム・ユニットは、独自の権限とコール元のラベルを使用して実行されます。 - 例: トラステッド・ストアド・プログラム・ユニット
READ
権限を持つトラステッド・ストアド・プログラム・ユニットは、保護されていないすべてのデータと、このポリシーにより保護されているすべてのデータを読み取ることができます。 - トラステッド・ストアド・プログラム・ユニットの作成およびコンパイル
トラステッド・ストアド・プログラム・ユニットをOracle Label Securityで使用できるように作成およびコンパイルできます。 - ラベル情報を設定して戻す動作
SA_UTL
パッケージには、数値ラベル値を使用してセッション・セキュリティ属性の現在の値に関する情報を戻すファンクションがあります。
12.1 トラステッド・ストアド・プログラム・ユニットについて
Oracle Databaseストアド・プロシージャ、ファンクションおよびパッケージは、コンパイルされた形式でデータベースに格納されているPL/SQL文のセットです。
ファンクションとプロシージャの唯一の違いは、ファンクションは値を戻すのに対して、プロシージャは値を戻さないことです。トラステッド・ストアド・プログラム・ユニットは、Oracle Databaseの他のストアド・プログラム・ユニットと同様で、基礎となるロジックは同じです。
パッケージは、使用するカーソルおよび変数とともにユニットとして格納されるプロシージャとファンクションのセットです。パッケージは、パッケージ仕様部とパッケージ本体という2つの部分で構成されています。パッケージ仕様部では、パッケージに含まれるパブリック・プロシージャ、ファンクションおよび変数の外部定義を宣言します。パッケージ本体には、プロシージャとファンクションの実際のテキストと、プライベートなプロシージャおよび変数が含まれています。
トラステッド・ストアド・プログラム・ユニットは、1つ以上のOracle Label Security権限を付与されたストアド・プロシージャ、ファンクションまたはパッケージです。通常、トラステッド・ストアド・プログラム・ユニットは、ユーザーが権限を付与されている操作を制御された方法で実行したり、複数のラベルのデータを更新できるようにするために使用されます。これは、ユーザーに対して認可の範囲を超えるデータへのアクセスを許可する場合に最適なアプローチです。
トラステッド・ストアド・プログラム・ユニットは、権限の使用に対するファイングレイン・コントロールを提供します。多数のユーザーに潜在的に権限を付与できますが、アプリケーションについて設定したセキュリティ・ポリシーに違反する可能性があるため、権限の付与には細心の注意を払う必要があります。ユーザーに権限を割り当てるのではなく、権限を必要とするアプリケーション操作を識別し、それをトラステッド・プログラム・ユニットとして実装できます。このようなストアド・プログラム・ユニットに権限を付与すると、実際にはユーザーが必要とするOracle Label Security権限を制限することになります。このアプローチは、最小限の権限の原理を採用しています。
たとえば、ラベルCONFIDENTIAL
を持つユーザーがSENSITIVE
行へのデータの挿入を必要とする場合は、ユーザーがアクセスするトラステッド・ストアド・プログラムにWRITEUP
権限を付与できます。これにより、ユーザーはトラステッド・ストアド・プログラムを使用して、CONFIDENTIAL
レベルでタスクを実行できます。
すべてのアクションは、ユーザーにかわってトラステッド・プログラム・ユニットにより実行されます。そのため、セキュリティ・ポリシーをモジュールに効率的にカプセル化し、それが有効かどうかを検証できます。
12.2 トラステッド・ストアド・プログラム・ユニットの動作
トラステッド・ストアド・プログラム・ユニットは、独自の権限とコール元のラベルを使用して実行されます。
このようにして、トラステッド・ストアド・プログラム・ユニットは、ユーザーのラベルで制約されている行セットに対して権限付き操作を実行できます。
Oracle Databaseシステムおよびオブジェクト権限は、ロールにバンドルすることを意図しています。ユーザーには、必要に応じてロール権限が付与されます。これに対して、Oracle Label Security権限の割当て対象となるのは、ユーザーまたはストアド・プログラム・ユニットのみです。この種のトラステッド・ストアド・プログラム・ユニットは、Oracle Label Security権限の使用を制御するという点で、ロールよりも管理しやすいメカニズムを提供します。
12.3 例: トラステッド・ストアド・プログラム・ユニット
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
オブジェクト権限が付与されている必要があります。
関連項目
12.4 トラステッド・ストアド・プログラム・ユニットの作成およびコンパイル
トラステッド・ストアド・プログラム・ユニットをOracle Label Securityで使用できるように作成およびコンパイルできます。
- トラステッド・ストアド・プログラム・ユニットの作成
トラステッド・ストアド・プログラム・ユニットを作成する方法は、標準のプロシージャ、ファンクションまたはパッケージを作成する方法と同じです。 - トラステッド・ストアド・プログラム・ユニットの権限
Oracle Label Security管理者は、ストアド・プログラム・ユニットに権限を付与する前に、ストアド・プログラム・ユニット・コードが正しいかどうかを確認できます。 - トラステッド・ストアド・プログラム・ユニットの再コンパイル
トラステッド・ストアド・プログラム・ユニットの再コンパイルを自動的に行うか手動で(ALTER
PROCEDURE
を使用して)行うかは、Oracle Label Security権限には影響しません。 - トラステッド・ストアド・プログラム・ユニットの再作成
トラステッド・ストアド・プログラム・ユニットに対してCREATE
またはREPLACE
操作を実行すると、Oracle Label Security権限が取り消されます。 - トラステッド・ストアド・プログラム・ユニットの実行
Oracle Label Securityでは、(表およびスキーマへのアクセスに関する)プロシージャ・コールのすべての標準Oracle Databaseコントロールはまだ有効です。
12.4.1 トラステッド・ストアド・プログラム・ユニットの作成
トラステッド・ストアド・プログラム・ユニットを作成する方法は、標準のプロシージャ、ファンクションまたはパッケージを作成する方法と同じです。
これを行うには、CREATE
PROCEDURE
、CREATE
FUNCTION
またはCREATE
PACKAGE
およびCREATE
PACKAGE
BODY
文を使用できます。
プログラム・ユニットは、Oracle Label Security権限を付与するとトラステッド・プログラム・ユニットになります。
12.4.2 トラステッド・ストアド・プログラム・ユニットの権限
Oracle Label Security管理者は、ストアド・プログラム・ユニットに権限を付与する前に、ストアド・プログラム・ユニット・コードが正しいかどうかを確認できます。
通常、開発者などの別のユーザーがストアド・プログラム・ユニットを作成します。トラステッド・ストアド・プログラム・ユニットが再作成または置換されると、Oracle Label Securityによってその権限が削除されます。Oracle Label Security管理者はコードを再検証し、権限を再び付与する必要があります。
Oracle Label Security管理者は、プログラム・ユニットに権限を付与する前に、プログラム・ユニット・コードを慎重に確認して評価する必要があります。たとえば、トラステッド・パッケージ内のプロシージャが、権限付きのデータベース操作を実行してパッケージのパブリック変数の結果またはステータス情報を書き込むことがないようにする必要があります。これにより、サイトのOracle Label Securityポリシーに違反が発生しないことが確実になります。
12.4.3 トラステッド・ストアド・プログラム・ユニットの再コンパイル
トラステッド・ストアド・プログラム・ユニットの再コンパイルを自動的に行うか手動で(ALTER
PROCEDURE
を使用して)行うかは、Oracle Label Security権限には影響しません。
ただし、再コンパイル後はプログラム・ユニットに対するEXECUTE
権限を再び付与する必要があります。
12.4.4 トラステッド・ストアド・プログラム・ユニットの再作成
トラステッド・ストアド・プログラム・ユニットに対してCREATE
またはREPLACE
操作を実行すると、Oracle Label Security権限が取り消されます。
これにより、プロシージャでOracle Label Security権限が誤用される可能性が限定されます。
Oracle Label Security権限が削除されても、プロシージャ、ファンクションまたはパッケージは引き続き実行できることに注意してください。
プロシージャ、ファンクションまたはパッケージを再作成する場合は、そのテキストを慎重に検討する必要があります。再作成後のプログラム・ユニットがサイトのOracle Label Securityポリシーに違反しないことが確実であれば、必要な権限を再び付与できます。
トラステッド・ストアド・プログラム・ユニットを頻繁に置換する必要のある開発環境(本番システムの最初の数か月など)では、必要に応じて適切なOracle Label Security権限を付与できるようにスクリプトを作成することをお薦めします。
12.4.5 トラステッド・ストアド・プログラム・ユニットの実行
Oracle Label Securityでは、(表およびスキーマへのアクセスに関する)プロシージャ・コールのすべての標準Oracle Databaseコントロールはまだ有効です。
Oracle Label Securityは、行へのアクセスを制御することで、これらのセキュリティ・メカニズムを補完します。
トラステッド・ストアド・プログラム・ユニットの実行時に有効なポリシー権限は、コール側ユーザーの権限とプログラム・ユニットの権限との共用部分です。トラステッド・ストアド・プログラム・ユニットが別のトラステッド・プログラム・ユニットまたは非トラステッド・プログラム・ユニットをコールすると、コールされたプログラム・ユニットはコール側のプログラム・ユニットと同じ権限で実行されます。
非トラステッド・ストアド・プログラム・ユニットとトラステッド・ストアド・プログラム・ユニットが連なって実行される場合、最初のトラステッド・プログラム・ユニットによって、それ以降の順序でコールされるプログラム・ユニット全体の権限が決まります。次の順序を考えてみます。
- プロシージャA (非トラステッド)
WRITEUP
を持つプロシージャBWRITEDOWN
を持つプロシージャC- プロシージャD (非トラステッド)
プロシージャBは順序内の最初のトラステッド・プロシージャのため、プロシージャB、CおよびDはすべてWRITEUP
権限で実行されます。順序が終了すると、プロシージャBに関する権限は後続のプロシージャには無効になります。
ノート:
トラステッド・プログラム・ユニットに発生した未処理例外は、Oracle Label Securityにより捕捉されます。これは、ユーザーにエラー・メッセージが表示されない場合があることを意味します。このため、権限を付与する前に、常にすべてのプログラム・ユニットを細部に至るまでテストし、デバッグする必要があります。