データをマスクするフィールド・プロシージャーを作成するためのガイドライン

フィールド・プロシージャーを使用して、データのデコード時に特定のユーザーまたは環境に対してデータをマスクすることができます。データをマスクするフィールド・プロシージャーは、データが破損しないようにするために特殊な状態を処理するようにコーディングする必要があります。

データをマスクするフィールド・プロシージャーでは、以下の特殊な状態を処理する必要があります。
  • フィールド・デコード
    • マスキングは、フィールド・デコードでのみ実行する必要があります。フィールド・エンコードで実行してはなりません。フィールド・エンコードでマスキングが実行された場合、マスク・データが表に保管され、実際の値が失われます。
    • 一部の場合では、システム・コードでデータを内部的にコピーする必要があります (このような場合、データはユーザーに返されません)。例えば、一部の場合では、RGZPFM、ALTER TABLE、および CRTDUPOBJ でデータを内部的にコピーする必要があります。 同様に、トリガーに内部的に渡されるデータをマスクしてはなりません。これらの操作中には、データの読み取り時にフィールド・デコードが行われ、データの書き込み時にフィールド・エンコードが行われます。このような場合にフィールド・デコード中にマスキングが実行されると、マスク・データが書き込まれ、実際のデータが失われます。

      破損しないようにするには、フィールド・プロシージャーに対する 9 番目のパラメーターで、これがマスキングを実行してはならないシステム操作であるのかどうかを指示します。フィールド・デコード時にこのパラメーターを検査するようにフィールド・プロシージャーを作成することが重要であり、このパラメーターにより、マスキングを実行してはならないことが指示されている場合には、フィールド・プロシージャーは、ユーザーや環境に関係なく、マスクしてはなりません。

  • フィールド・エンコード
    • ネイティブの更新および挿入操作では、フィールド・プロシージャーは、マスク・データがフィールド・プロシージャーに渡されたときにそれを識別し、特殊な処置を実行できる必要があります。例えば、クレジット・カード番号列をマスクするようにフィールド・プロシージャーを作成することが考えられます。同じユーザーに、READ および UPDATE 操作を実行する RPG アプリケーションを介して表を読み取る権限および更新する権限があることがあります。READ が実行されると、ユーザーが表示できないようにクレジット・カード番号がマスクされますが、ユーザーが UPDATE を実行すると、マスク・データが UPDATE 操作でデータベースに渡され、フィールド・プロシージャーが呼び出されてデータがエンコードされます。渡された値がマスクされていることをフィールド・プロシージャーが認識していない場合、マスク・データはエンコードされて表に保管され、行内の元の値は、エンコードされたマスク・データで破損してしまいます。
      破損しないようにするために、フィールド・プロシージャーは、フィールド・エンコード時にデータがマスクされていることを認識する必要があります。データをエンコードする代わりに、フィールド・プロシージャーは、7 番目のパラメーターで警告 SQLSTATE 値の「09501」を返す必要があります。
      • UPDATE 操作では、「09501」は、列の現行値を使用する必要があることを Db2® に指示します。
      • INSERT 操作では、「09501」は、関連付けられた列値でデフォルト値を使用する必要があることを Db2 に指示します。
照会の考慮事項: データをマスクするフィールド・プロシージャーがある表の列を参照する照会には、以下のいくつかの考慮事項が適用されます。
  • 最適化プログラムが照会を実装する方法に応じて、同じ照会が、ユーザーごとまたは環境ごとに異なる行および値を返すことがあります。 これは、最適化プログラムが比較を実行するため、または照会内の式を評価するためにデータをデコードする必要がある場合に生じます。あるユーザーに対してマスキングが実行されるが、別のユーザーに対しては実行されない場合、デコード操作の結果は非常に異なるものになるため、この 2 人のユーザーに対して結果の行および値も非常に異なるものになることがあります。
    例えば、フィールド・プロシージャーが、ユーザー・プロファイル MAIN に対してマスキングなしでデータを返し (デコードし)、ユーザー・プロファイル QUSER に対してマスキングありでデータを返す (デコードする) ものとします。アプリケーションに、以下の照会が含まれているものとします。
    SELECT * FROM orders WHERE cardnum = '112233'
    デフォルトでは、最適化プログラムは、検索条件を (論理的に) 以下のように実装しようとします。
    WHERE cardnum = FieldProc ENCODE('112233')
    Db2 が定数「112233」のエンコードされたバージョンを、orders 表に保管されている CARDNUM 値のエンコードされたバージョンと比較できるため、これは最適な実装です。最適化プログラムが比較を実行するためにデータをデコードしなかったため、照会は、MAIN ユーザー・プロファイルと QUSER ユーザー・プロファイルに対して同じ行を返します。唯一の違いは、QUSER には、CARDNUM 列の結果行にマスク値が表示されることです。

    フィールド・プロシージャー列を参照する照会の実装は、QAQQINI FIELDPROC_ENCODED_COMPARISON オプションで制御できます。 このオプションのデフォルト値は *ALLOW_EQUAL です。このオプションにより、最適化プログラムは、エンコードされた値を使用して比較を実装できます。

    前の例で、FIELDPROC_ENCODED_COMPARISON オプションを *NONE に変更した場合、照会は 2 人のユーザーに対して異なる行を返します。値が *NONE の場合、以下のように、等価比較は Db2 によって内部的に実装されます。
    WHERE FieldProc DECODE(cardnum)='112233'
    この場合、Db2 は、元の定数「112233」と比較するために、表内のすべての行で CARDNUM 値をデコードする必要があります。つまり、MAIN ユーザー・プロファイルの比較では、デコードおよびマスク解除されたカード番号値 (112233、332211 など) を「112233」と比較します。MAIN ユーザー・プロファイルには、指定されたカード番号 (112233) に関連付けられた注文が検出されます。 しかし、照会では、QUSER ユーザー・プロファイルに対しては行が返されません。 これは、QUSER の比較では、カード番号のマスク値 (****33、****11、など) を定数「112233」と比較しているからです。

    QAQQINI FIELDPROC_ENCODED_COMPARISON オプションがフィールド・プロシージャーにどのように影響するかについて詳しくは、Information Center のトピック『データベース・パフォーマンスおよび Query 最適化』を参照してください。

  • マテリアライズ照会表の REFRESH は、QAQQINI FIELDPROC_ENCODED_COMPARISON オプションの影響を受けます。マテリアライズ照会表が、マスクするフィールド・プロシージャーが含まれた列を参照している場合、マスク解除したデータを表示できるユーザーによって、MQT の REFRESH を発行する必要があります。そうしないと、MQT での結果が全ユーザーに対して正しくなくなります。
  • CREATE TABLE LIKE、CREATE TABLE AS、DECLARE GLOBAL TEMPORARY TABLE LIKE、または DECLARE GLOBAL TEMPORARY TABLE AS は、QAQQINI FIELDPROC_ENCODED_COMPARISON オプションの影響を受けます。マスク解除されたデータを表示できないユーザーによってステートメントが発行された場合、結果の表に、マスク・データが含まれます。
  • OPNQRYF および Query/400® は、QAQQINI FIELDPROC_ENCODED_COMPARISON オプションの影響を受けません。最適化プログラムは常に、値をデコードして処理します (FIELDPROC_ENCODED_COMPARISON オプションが *NONE の場合と同様)。
  • DDS 作成論理ファイルの選択/除外も、QAQQINI FIELDPROC_ENCODED_COMPARISON オプションの影響を受けません。論理ファイルは、値をデコードして処理されます (FIELDPROC_ENCODED_COMPARISON オプションが *NONE の場合と同様)。
ベスト・プラクティス: データをマスクするフィールド・プロシージャーがある場合には、以下の 2 つの QAQQINI オプションを使用することを強くお勧めします。
FIELDPROC_ENCODED_COMPARISON
FIELDPROC_ENCODED_COMPARISON のデフォルト・オプションは *ALLOW_EQUAL であり、これはデータをマスクしないフィールド・プロシージャーに対して非常に適切に機能します。 ただし、データをマスクするフィールド・プロシージャーを使用する場合には、*NONE が非常にセキュアな推奨オプションです。
CACHE_RESULTS
CACHE_RESULTS のデフォルト・オプションは *SYSTEM です。多くの場合、このオプションは適切に機能します。ただし、データをマスクするフィールド・プロシージャーを使用する場合には、CACHE_RESULTS には *JOB を指定する必要があります。
これらの 2 つのオプションは、データをマスクするフィールド・プロシージャーの動作に影響する可能性があるため、以下のように、許可されたユーザーのみが 新規または別の QAQQINI オプションを指定できるようにすることも重要になります。
  • CHGQRYA コマンド

    許可されたユーザーのみが CHGQRYA コマンドを実行できることを確認します。デフォルトでは、ジョブ制御 (*JOBCTL) 特殊権限または QIBM_DB_SQLADM 関数使用権のあるユーザーに対してのみ、CHGQRYA コマンドは許可されます。

  • QUSRSYS/QAQQINI ファイル

    許可されたユーザーのみが QUSRSYS/QAQQINI ファイルを作成でき、また既にこのファイルが存在する場合に更新できることを確認します。デフォルトでは、 *PUBLIC は QUSRSYS に対する *USE 権限を備えていますが、これは、新規 QUSRSYS.QAQQINI ファイルを作成するのには十分な権限ではありません。