3.5 データ・リダクション・ポリシーの条件を定義する式の使用

DBMS_REDACT.ADD_POLICYまたはDBMS_REDACT.ALTER_POLICYプロシージャのexpressionパラメータは、これらのポリシーが適用される条件を設定します。

3.5.1 データ・リダクション・ポリシーでの式の使用について

DBMS_REDACT.ADD_POLICYおよびDBMS_REDACT.ALTER_POLICYexpressionパラメータに、リダクションを有効化するためにTRUEに評価される必要があるブール式を定義します。

expressionパラメータで定義される式は、Oracle Data Redactionポリシーのデフォルトの式です。データ・リダクション・ポリシーによってリダクションされることになっている列に対して名前付きポリシー式を適用した場合、名前付きポリシー式がデータ・リダクション・ポリシーで定義された式よりも優先されます。この式パラメータに1=1が指定されている場合(これはTRUEに評価されるポリシー式です)、問合せ元ユーザーがリダクション・ポリシーから除外されていなければ、リダクションが実行されるようになります。この条件を使用すると、リダクションされる列からのフェッチ操作の間のCPU時間が短縮されます。ポリシー式を評価する必要性を回避することで、データ・リダクション・ポリシーによって保護されている列からのフェッチのパフォーマンスが向上します。

他のOracle Database機能を使用する式を作成できます。たとえば、ユーザーの環境(ファンクションSYS_CONTEXTおよびXS_SYS_CONTEXTを使用)、文字列ファンクション、Oracle Label Securityのラベル優位ファンクション、またはOracle Application Expressファンクションに基づく式を作成できます。

式を記述する場合は次のガイドラインに従ってください。

  • 使用できる演算子は、ANDORINNOT IN=!=<><>>=<=のみです。

  • リダクションの際に式はTRUEに評価される必要があるので、NULLと比較する場合には注意が必要です。SQLでは、値NULLは定義されていないため、NULLと比較すると、FALSEを返す傾向があります。

  • expressionパラメータでユーザー作成ファンクションを使用することはできません。

  • ユーザーSYSおよびEXEMPT REDACTION POLICYシステムまたはスキーマ権限を持つユーザーでは、すべてのデータ・リダクション・ポリシーがバイパスされるため、問合せの結果はリダクションされないことに注意してください。データ・リダクション・ポリシーからユーザーを除外する場合、特定の権限(DBAロールなど)を持つユーザーおよびOracle Data Pumpによる除外への影響に注意する必要があります。

3.5.2 データ・リダクション式でサポートされているファンクション

特定のタイプのデータを返すファンクション(SYS_CONTEXTネームスペースなど)を使用する式を作成できます。

3.5.2.1 ネームスペース・ファンクションを使用した式

データ・リダクション式で、ネームスペース・ファンクションSYS_CONTEXTおよびXS_SYS_CONTEXTを使用できます。

表3-3 ネームスペース・ファンクションを使用した式

ネームスペース・ファンクション 説明

SYS_CONTEXT

ネームスペースに関連した値を返します。次のネームスペース・ファンクションが有効です。

  • USERENV (デフォルトのネームスペース)、SESSION_USERCLIENT_IDENTIFIERなどの値を含みます。

  • SYS_SESSION_ROLES、各ロールの属性を含みます。

  • XS$SESSION、ユーザー・セッションの属性を含みます。

  • ユーザー定義のネームスペース、ただしこれらはポリシー式が作成される前にDBA_CONTEXTカタログ・ビューに存在している必要があります。

XS_SYS_CONTEXT

SYS_CONTEXTと同様ですが、Oracle Real Application Security環境用に設計されています。

XS_SYS_CONTEXTは、SYS_CONTEXTがサポートしているのと同じネームスペースをサポートします。

3.5.2.2 SUBSTRファンクションを使用した式

データ・リダクション式では、指定した文字列の部分を返す(文字1–3など)SUBSTRファンクションを使用できます。最初のパラメータは定数文字列か、SYS_CONTEXTファンクションまたはXS_SYS_CONTEXTファンクションへのコールである必要があります。

表3-4 SUBSTR文字列ファンクションを使用した式

SUBSTR文字列ファンクション 説明

SUBSTR

character positionから始まる、substring_lengthの文字長の入力char値の一部を返します。SUBSTRは、入力文字セットによって定義された文字を使用して、長さを計算します。

SUBSTRB

入力値の指定された部分をバイトで返します

SUBSTRC

入力値の指定された部分をUnicodeの完全文字で返します

SUBSTR2

入力値の指定された部分をUCS2コード・ポイントで返します

SUBSTR4

入力値の指定された部分をUCS4コード・ポイントで返します

3.5.2.3 文字列の長さファンクションを使用した式

データ・リダクション式では、文字列の長さを返すファンクションを使用できます。

Oracle Databaseは、これらの演算子の各々への引数が、定数文字列であるか、SYS_CONTEXTファンクションまたはXS_SYS_CONTEXTファンクションへのコールであるかについても確認します。

表3-5 文字列ファンクションを使用した式

文字列ファンクション 説明

LENGTH

入力char値の長さを返します。LENGTHは、入力文字セットによって定義された文字を使用して、長さを算出します。

LENGTHB

入力値の長さをバイトで返します

LENGTHC

入力値の長さをUnicodeの完全文字で返します

LENGTH2

入力値の長さをUCS2コード・ポイントで返します

LENGTH4

入力値の長さをUCS4コード・ポイントで返します

3.5.2.4 Oracle Application Expressファンクションを使用した式

データ・リダクション式で、Oracle Application Expressファンクションを使用できます。

表3-6 Oracle Application Expressファンクション

Oracle Application Expressファンクション 説明

V

アイテムのセッション・ステートを返します。APEX_UTIL.GET_SESSION_STATEファンクションのラッパーです

NV

数値項目の数値を返します。APEX_UTIL.GET_NUMERIC_SESSION_STATEファンクションのラッパーです

3.5.2.5 Oracle Label Securityファンクションを使用した式

Oracle Label Securityファンクションをデータ・リダクション式とともに使用できます。

表3-7 Oracle Label Securityファンクション

Oracle Label Securityファンクション 説明

LBACSYS.OLS_LABEL_DOMINATES

Oracle Label Securityポリシーのセッション・ラベルが別のOLSラベルに優位であるか同位であるかを確認します

OLS_DOMINATES*、DOMINATES*およびS_DOM*

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します。

Oracle Database 12.1より前のリリースで使用されていたDOMINATESおよびS_DOMは、そのリリースで非推奨になりました。かわりにOLS_DOMINATESまたはOLS_DOMファンクションを使用してください。

OLS_DOM*

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します

DOM*

1つのOLSラベルが2つ目のOLSラベルより優位であるか確認します

OLS_STRICTLY_DOMINATES*

1つのOLSラベルが2つ目のOLSラベルより優位であり、同位ではないかを確認します

STRICTLY_DOMINATES*

1つのOLSラベルが2つ目のOLSラベルより優位であり、同位ではないかを確認します

SA_UTL.DOMINATES*

1つのOLSラベルが2つ目のOLSラベルに優位であるか、または特定のOLSポリシーのセッション・ラベルがOLSラベルに優位であるかを確認します

SA_UTL.CHECK_READ

ユーザーがポリシーで保護されている行を読み取ることができるかどうかをチェックします

SA_UTL.NUMERIC_LABEL

現行のセッションOLSラベルを返します

CHAR_TO_LABEL

文字列をOLSラベル・タグに変換します

SA_SESSION.LABEL

指定したOLSポリシーに関連付けられているラベルを返します

* Oracle Data Redactionが、それらのパラメータが定数であるか、ファンクションSA_UTL.NUMERIC_LABELCHAR_TO_LABELSA_SESSION.LABELのいずれかのみのコールでありこれらのファンクションへの引数が定数であることを確認します。

3.5.3 ユーザー環境に基づくリダクション・ポリシーの適用

セッション・ユーザー名またはクライアント識別子などユーザーの環境に基づいて、データ・リダクション・ポリシーを適用できます。

  • DBMS_REDACT.ADD_POLICY expressionパラメータでSYS_CONTEXTファンクションのUSERENV名前空間を使用して、ユーザー環境に基づいてポリシーを適用します。
    たとえば、セッション・ユーザー名psmithにのみポリシーを適用するには、次のようにします。
    expression  => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''PSMITH'''

3.5.4 データベース・ロールに基づくリダクション・ポリシーの適用

データベース・ロールに基づいてデータ・リダクション・ポリシーを適用できます。

SYS_CONTEXTファンクションのSYS_SESSION_ROLES名前空間を使用して、ユーザー・ロールに基づいてポリシーを適用します。

この名前空間には、各ロールの属性が含まれます。指定されたロールが、問合せを行ったアプリケーション・ユーザーに対して有効化されている場合、属性の値はTRUEで、ロールが有効化されていない場合、属性の値はFALSEです。式がTRUEの場合は、リダクションされたデータがユーザーに返されます。式がFALSEの場合は、実際のデータがユーザーに返されます。

たとえば、スーパーバイザのみに実際のデータの表示を許可するとします。次の例では、DBMS_REDACT.ADD_POLICY expressionパラメータを使用してポリシーを設定し、supervisorロールが有効化されているアプリケーション・ユーザーには実際のデータを表示し、他のすべてのアプリケーション・ユーザーにはデータをリダクションする方法を示します。
expression  => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''SUPERVISOR'') = ''FALSE'''
expressionパラメータで複数のロールを指定できます。次の例では、SUPERVISORCLERKおよびTEMP_WORKERロールの存在をチェックします。実際のデータは、SUPERVISORロールがあるユーザーに表示されます。CLERKまたはTEMP_WORKERロールがあるユーザーには、リダクションされたデータが表示されます。
expression => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''SUPERVISOR'') = ''FALSE'' 
OR SYS_CONTEXT(''SYS_SESSION_ROLES'',''CLERK'') = ''TRUE'' 
OR SYS_CONTEXT(''SYS_SESSION_ROLES'',''TEMP_WORKER'') = ''TRUE'''

定義者権限で実行される名前付きPL/SQLブロックでは、すべてのロールは使用禁止になっています。プロシージャおよびファンクションは、デフォルトでは、定義者権限を使用して作成されます。SYS_SESSION_ROLESを使用するポリシー式が有効になるようにする場合は、実行者権限となるプロシージャまたはファンクションを作成して、有効化されているロールが実際に使用されるようにします。または、コード・ベースのアクセス制御を使用してロールをプログラム・ユニット(ファンクション、パッケージまたはプロシージャ)に付与し、そのプログラム・ユニットに、そのロールを定義者権限または実行者権限のどちらかで使用できるようにします。詳細は、Oracle Databaseセキュリティ・ガイド定義者権限および実行者権限のセキュリティの管理を参照してください。

3.5.5 Application Expressセッション・ステートに基づくリダクション・ポリシーの適用

Oracle Application Express (APEX)セッション・ステートに基づいて、データ・リダクション・ポリシーを適用できます。

  • DBMS_REDACT.ADD_POLICY expressionパラメータで、次に示すパブリックApplication Express APIのいずれかを使用して、Oracle Application Expressのセッション・ステートに基づいてポリシーを適用します。
    • VAPEX_UTIL.GET_SESSION_STATEファンクションのシノニムです。
    • NVAPEX_UTIL.GET_NUMERIC_SESSION_STATEファンクションのシノニムです。

    問合せをするユーザーがAPEXアプリケーションのコンテキスト内にいないとき(問合せがAPEXフレームワーク外、たとえばSQL*Plusから直接発行されたとき)にリダクションを発生させる場合は、次の例に示すようにIS NULL句を使用します。

    たとえば、問合せがAPEXフレームワーク外から発行されるときにDBMS_REDACT.ADD_POLICY expressionパラメータを設定するには、次のようにIS NULL句を使用します。

    expression => 'V(''APP_USER'') != ''mavis@example.com'' or V(''APP_USER'') is null'

    たとえば、これらのようなファンクションを使用することにより、APEXアプリケーションのセッション・ステートに格納されているジョブまたは権限ロールに基づいてデータをリダクションできます。

3.5.6 Oracle Label Securityラベル優位に基づくリダクション・ポリシーの適用

Oracle Label Securityラベルの優位性に基づきデータ・リダクション・ポリシーを適用する条件を設定できます。

  • パブリック・スタンドアロン・ファンクションOLS_LABEL_DOMINATESを使用して、セッション・ラベルの優位性を確認します。
    このファンクションは、指定したpolicy_name値のセッション・ラベルがlabelパラメータで指定したラベルよりも優位または同位の場合、1 (TRUE)を戻します。それ以外の場合は0 (FALSE)を戻します。
    たとえば、ポリシーhr_ols_polのセッション・ラベルがラベルhsよりも優位でも同位でもない場合のみデータ・リダクション・ポリシーを適用するには、次のように指定します。
    expression  => 'OLS_LABEL_DOMINATES (''hr_ols_pol'',''hs'') = 0'

3.5.7 すべてのユーザーへのリダクション・ポリシーの適用

フィルタリングを使用しなければ、コンテキストに関係なくポリシーを任意のユーザーに適用できます。

ただし、ユーザーSYS、およびEXEMPT REDACTION POLICYシステムまたはスキーマ権限を持つユーザーは常にOracle Data Redactionポリシーから免除されることに注意してください。
  • SYS以外のユーザーまたはEXEMPT REDACTION POLICY権限が付与されていないユーザーにポリシーを適用するには、TRUEに評価されるDBMS_REDACT.ADD_POLICY expressionパラメータを記述します。
    例:
    expression  => '1=1'

    前述のポリシー式がある場合は、Oracle Databaseによってリダクションが実行されますが、ポリシー式は評価されません。その結果、ターゲット列からのフェッチのパフォーマンスが向上します。