Oracleの行レベルのセキュリティは、ユーザーのセッション資格情報またはユーザーコンテキストによって制御できますか?これが私が探しているものを説明するための例です:
私たちのデータベースには、給与など、企業の機密情報が多数含まれています。人事管理者は検索結果に給与を表示できるはずですが、施設管理スタッフは同じ検索パラメーターを使用していても表示できません。欠点は、アプリにはデータベースユーザーが1人しかなく、すべてのリクエストがアプリを通過するため、データベースユーザーのIDを確認するだけのセキュリティを設定できないことです。たとえば、ユーザーコンテキストとして情報を渡す必要があります。
違いが生じる場合は、Oracle Access Manager/WebLogicへの移行を検討しています。
ドキュメント から:
Oracleデータベースサーバーは、事前定義された属性へのアクセスを提供する組み込みのアプリケーションコンテキスト名前空間(USERENV)を提供します。これらの属性はセッションプリミティブであり、データベースがユーザーセッションに関してキャプチャする情報です。例には、ユーザー名、ユーザーが接続したIPアドレス、およびユーザー接続が中間層を介してプロキシされる場合のプロキシユーザー名が含まれます。
事前定義された属性は、アクセス制御に役立ちます。たとえば、OCIまたはシックJDBCを介して軽量ユーザーセッションを作成する3層アプリケーションは、USERENVのPROXY_USER属性にアクセスできます。
そうです、中間層がプロキシユーザー名を正しく処理している場合はそうです。
アプリはユーザーを認識しているので、人事管理者に対して別の方法で検索を実行させることはできますか?
データベース側でのアクセスを防止する必要がある場合は、 ロールを有効にする のパッケージを呼び出すことができますが、ユーザーがHR管理者である場合にのみ呼び出すことができます。
アプリケーションロール(セキュアアプリケーションロール)は、許可されたPL/SQLパッケージを使用するアプリケーションによってのみ有効にできます。アプリケーション開発者は、アプリケーション内にパスワードを埋め込んで役割を保護する必要はありません。代わりに、アプリケーションロールを作成し、そのロールを有効にすることを許可されているPL/SQLパッケージを指定できます。
許可されたPL/SQLパッケージによって有効化されるロールを作成するには、CREATE ROLESQL文でIDENTIFIEDUSINGpackage_name句を使用します。
接続で設定された属性(= osユーザー名/プロキシユーザー/ IPアドレス...)のみに依存するという考えは、アプリケーションのパフォーマンスに非常に悪い影響を与える可能性があります。アクセス権限/ロール/ビジネス情報/ ...に関する情報を保持するための構造がかなり複雑な場合があります。非表示の列/行を決定するために必要であり、データベースへの各「ビジネス」呼び出しの前にクエリを実行する必要はありません。
ユーザーのログイン時にこのようなアプリケーションセッション情報を取得し、それをある種のアプリケーションコンテキストの中間層に保存してから、各「ビジネス」呼び出しの前にこのコンテキストをDBに渡すことをお勧めします。
このようなコンテキスト情報を保持するには 独自のアプリケーションコンテキストを作成します DBで、コンテキストを設定するためにDBにPL/SQLパッケージを実装します。
コンテキスト情報に基づいて「列の非表示」を実装するには、 仮想プライベートデータベース ドキュメントをお読みください。 SYS_CONTEXT
関数を使用して、DB内のどこからでもこのアプリケーションコンテキスト情報にアクセスできます。