Oracle Data Redactionポリシーでは、表の列タイプおよび使用するリダクションのタイプに応じて、列でデータをどのようにリダクションするかを定義します。
内容は次のとおりです。
Oracle Data Redactionポリシーでは、表またはビューでリダクションが発生する条件を定義します。
データ・リダクション・ポリシーには、次のような特徴があります。
データ・リダクション・ポリシーは、実行するリダクションの種類、リダクションの出現方法およびリダクションを実行するタイミングを定義します。Oracle Databaseは、実行時に、データがアプリケーションに戻される直前にリダクションを実行します。
データ・リダクション・ポリシーでは、値の完全なリダクション、部分的なリダクション、ランダムなリダクションが可能です。さらに、テスト環境でポリシーをテストする場合には、データをまったくリダクションしないようにデータ・リダクション・ポリシーを定義することもできます。
データ・リダクション・ポリシーは、ポリシー式がTRUE
またはFALSE
のどちらを返すかに基づいて、異なるアプリケーション・ユーザーにリダクションされたデータまたは実際のデータのいずれかの表示を許可するポリシー式で定義できます。ポリシー式の評価のブール結果がTRUE
であると、リダクションが実行されます。セキュリティ上の理由から、ポリシー式で使用できる関数および演算子は、SYS_CONTEXT
などの少数に限定されています。ユーザー作成関数は使用できません。ポリシー式では、SYS_SESSION_ROLES
名前空間とSYS_CONTEXT
関数を組み合せて使用し、有効なロールを確認できます。
表10-1に、DBMS_REDACT
パッケージのプロシージャを示します。
表10-1 DBMS_REDACTプロシージャ
プロシージャ | 説明 |
---|---|
|
データ・リダクション・ポリシーを表またはビューに追加します |
|
データ・リダクション・ポリシーを変更します |
|
指定されたデータ型の完全にリダクションされた値をグローバルに更新します。データベース・インスタンスを再起動すると、更新された値を使用できます。 |
|
データ・リダクション・ポリシーを有効化します |
|
データ・リダクション・ポリシーを無効化します |
|
データ・リダクション・ポリシーを削除します |
関連項目:
DBMS_REDACT
PL/SQLパッケージの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
Oracle Enterprise Manager Cloud Controlを使用してOracle Data Redactionのポリシーと形式を作成して管理する方法の詳細は、「Oracle Enterprise ManagerでのOracle Data Redactionの使用」を参照してください。
データ・リダクションには高機密データの保護が伴うため、信頼できるユーザーのみがOracle Data Redactionポリシーを作成する必要があります。
リダクション・ポリシーを作成するには、DBMS_REDACT
PL/SQLパッケージに対するEXECUTE
権限が必要です。ユーザーに付与された権限を確認するには、DBA_SYS_PRIVS
データ・ディクショナリ・ビューに問い合せます。
ポリシーで保護される基礎となる表やビューにアクセスする場合、権限は一切必要ありません。
Oracle Data Redactionポリシーを作成する前に、サイトのニーズに最も適したデータ・リダクション・ポリシーを計画する必要があります。
DBMS_REDACT
PL/SQLパッケージに対するEXECUTE
権限が付与されていることを確認してください。
リダクションする表またはビューの列のデータ型を決定します。
この列がOracle Virtual Private Database (VPD) 行フィルタ処理条件で使用されていないことを確認してください。つまり、VPDポリシー関数によって生成されるVPD述語の一部であってはなりません。
実行するリダクションのタイプ(完全、ランダム、部分、正規表現またはなし)を決定します。
データ・リダクション・ポリシーを適用するユーザーを決定します。
この情報に基づいて、DBMS_REDACT.ADD_POLICY
プロシージャを使用てデータ・リダクション・ポリシーを作成します。
複数列のリダクションの説明に従って、追加の列をリダクションするようにポリシーを構成します。
データ・リダクション・ポリシーは、作成後、自動的に有効化され、データをリダクションできるようになります。
データ・リダクション・ポリシーを作成するには、DBMS_REDACT.ADD_POLICY
プロシージャを使用する必要があります。
DBMS_REDACT.ADD_POLICY
プロシージャの完全な構文は次のとおりです。
DBMS_REDACT.ADD_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2 := NULL, policy_name IN VARCHAR2, policy_description IN VARCHAR2 := NULL, column_name IN VARCHAR2 := NULL, column_description IN VARCHAR2 := NULL, function_type IN BINARY_INTEGER := DBMS_REDACT.FULL, function_parameters IN VARCHAR2 := NULL, expression IN VARCHAR2, enable IN BOOLEAN := TRUE, regexp_pattern IN VARCHAR2 := NULL, regexp_replace_string IN VARCHAR2 := NULL, regexp_position IN BINARY_INTEGER :=1, regexp_occurrence IN BINARY_INTEGER :=0, regexp_match_parameter IN VARCHAR2 := NULL);
ここでは次のように指定します。
object_schema
: データ・リダクション・ポリシーを適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULL
を入力)する場合、Oracle Databaseは現在のユーザー名を使用します。ここでの「現在のユーザー」の意味は、DBMS_REDACT.ADD_POLICY
プロシージャを呼び出す場所によって変わる場合があることに注意してください。
たとえば、ユーザーmpike
は、ユーザーfbrown
に、mpike
のスキーマ内のmpike.protect_data
という名前の定義者権限のPL/SQLパッケージに対するEXECUTE
権限を付与すると仮定します。このパッケージ内から、mpike
は、protect_cust_data
と呼ばれるプロシージャをコード化し、これにより、DBMS_REDACT.ADD_POLICY
が呼び出されます。ユーザーmpike
は、object_schema
パラメータをNULL
に設定しました。
fbrown
がmpike.protect_data
パッケージのprotect_cust_data
プロシージャを呼び出すと、Oracle Databaseは、fbrown
のスキーマのcust_data
オブジェクトではなく、mpike
スキーマのオブジェクトcust_data
の周りにデータ・リダクション・ポリシーを定義しようとします。
object_name
: データ・リダクション・ポリシーが適用する表またはビューの名前を指定します。
policy_name
: 作成するポリシーの名前を指定します。この名前は、データベース・インスタンス内で必ず一意である必要があります。REDACTION_POLICIES
データ・ディクショナリ・ビューのPOLICY_NAME
列を問い合せることで、既存のデータ・リダクション・ポリシーのリストを検索できます。
policy_description
: ポリシーの目的についての簡単な説明を指定します。
column_name
: データをリダクションする必要がある列を指定します。次の点に注意してください。
データ・リダクション・ポリシーを複数の列に適用できます。データ・リダクション・ポリシーを複数の列に適用する場合、DBMS_REDACT.ADD_POLICY
を使用してポリシーを作成した後、DBMS_REDACT.ALTER_POLICY
プロシージャを必要な回数実行して、必要な残りの列それぞれをポリシーに追加します。Oracle Data Redactionポリシーの変更を参照してください。
表またはビューに定義できるポリシーは1つだけです。ただし、表に新しいビューを作成できるため、2つ目のリダクション・ポリシーをこの新しいビューに定義することで、この新しいビューに対して問合せを発行するときに、異なる方法で列をリダクションできます。指定された列のリダクション方法を決める際、Oracle Databaseは、ビュー・チェーンの最初のビューのポリシーを使用します。
列を指定しない場合(たとえば、NULLを入力)、いずれの列もポリシーによるリダクションは行われません。これにより、ユーザー自身のポリシーを作成して配置できるようになるため、後で準備ができたときに列の仕様を追加することができます。
Oracle Virtual Private Database (VPD)の行フィルタ処理条件で現在使用されている列は使用しないでください。つまり、列は、VPDポリシー関数によって生成されるVPD述語の一部にすることはできません。(VPDでデータ・リダクションを使用する方法の詳細は、Oracle Data RedactionとOracle Virtual Private Databaseを参照してください。)
仮想列にデータ・リダクション・ポリシーを定義することはできません。また、任意の仮想列のSQL式に関連する列にデータ・リダクション・ポリシーを定義することもできません。
column_description
: リダクションする列の簡単な説明を指定します。
function_type
: リダクションのタイプを設定するファンクションを指定します。詳細は、次の各項を参照してください。
function_type
パラメータを省略する場合、デフォルトのリダクションfunction_type
設定は、DBMS_REDACT.FULL
です。
function_parameters
: 部分リダクションのために列のリダクションをどのように表示するかを指定します。部分リダクション・ポリシーを作成する構文を参照してください。
expression
: ポリシーの適用方法を決定するブール型SQL式を指定します。リダクションは、ポリシー式がTRUE
と評価された場合にのみ実行されます。データ・リダクション・ポリシーの条件を定義する式の使用を参照してください。
enable
: TRUE
に設定すると、作成時にポリシーが有効になります。FALSE
に設定すると、無効化されたポリシーとしてポリシーを作成します。デフォルトはTRUE
です。ポリシーを作成した後、そのポリシーを無効化または有効化できます。次の項を参照してください。
regexp_pattern
、regexp_replace_string
、regexp_position
、regexp_position
、regexp_occurrence
、regexp_match_parameter
: 正規表現を使用してデータを完全に、または部分的にリダクションできます。実際のデータにregexp_patternに一致するものがない場合は完全リダクションが実行されるので、
regexp_pattern
を指定するときは注意してください。列のすべての値が、使用している正規表現のセマンティクスに一致しているか確認します。詳細は、正規表現ベースのリダクション・ポリシーを作成する構文を参照してください。
DBMS_REDACT.ADD_POLICY
プロシージャのexpression
パラメータには、ポリシーが適用される条件を指定します。
内容は次のとおりです。
DBMS_REDACT.ADD_POLICY
およびDBMS_REDACT.ALTER_POLICY
のexpression
パラメータには、リダクションを有効化するためにTRUE
に評価される必要があるブール式を定義します。
この式は次のいずれかのファンクションに基づいている必要があります。
指定された名前領域を使用するSYS_CONTEXT
。SYS_CONTEXT
のデフォルトの名前空間は、SESSION_USER
およびCLIENT_IDENTIFIER
などの値を含むUSERENV
です。(この関数の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。)使用できるもう一つの名前空間は、各ロールの属性を含むSYS_SESSION_ROLES
名前空間です。
次のOracle Application Expressファンクション:
APEX_UTIL.GET_SESSION_STATE
ファンクションのラッパーであるV
NV
、APEX_UTIL.GET_NUMERIC_SESSION_STATE
関数のラッパーです。
これらのAPEX_UTIL
パッケージ・ファンクションの詳細は、『Oracle Application Express APIリファレンス』を参照してください。
『Oracle Label Security管理者ガイド』で説明されている、OLS_LABEL_DOMINATESファンクションは、
LBACSYS.OLS_LABEL_DOMINATES
ファンクションのラッパーです。
式を記述する場合は次のガイドラインに従ってください。
使用できる演算子は、=
、!=
、>
、<
、>=
、<=
のみです。
リダクションの際に式はTRUE
に評価される必要があるので、NULL
と比較する場合には注意が必要です。SQLでは、値NULL
は定義されていないため、NULL
と比較すると、FALSE
を返す傾向があります。
expression
パラメータでユーザー作成ファンクションを使用することはできません。
ユーザーSYS
およびEXEMPT REDACTION POLICY
権限を持つユーザーでは、すべてのデータ・リダクション・ポリシーがバイパスされるため、問合せの結果はリダクションされないことに注意してください。データ・リダクション・ポリシーから除外されるユーザーの詳細は、次の項を参照してください。
セッション・ユーザー名またはクライアント識別子などユーザーの環境に基づいて、データ・リダクション・ポリシーを適用できます。
DBMS_REDACT.ADD_POLICY
expression
パラメータでSYS_CONTEXT
ファンクションのUSERENV
名前空間を使用して、ユーザー環境に基づいてポリシーを適用します。
たとえば、セッション・ユーザー名psmith
にのみポリシーを適用するには、次のようにします。
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''PSMITH'''
関連項目:
SYS_CONTEXT
ファンクションで使用できるネームスペースの詳細は、Oracle Database SQL言語リファレンスを参照してください。
DBA
ロールなどのデータベース・ロールに基づいて、データ・リダクション・ポリシーを適用できます。
SYS_CONTEXT
ファンクションのSYS_SESSION_ROLES
名前空間を使用して、ユーザー・ロールに基づいてポリシーを適用します。
この名前空間には、各ロールの属性が含まれます。指定されたロールが、問合せを行ったアプリケーション・ユーザーに対して有効化されている場合、属性の値はTRUE
で、ロールが有効化されていない場合、属性の値はFALSE
です。
たとえば、スーパーバイザのみに実際のデータの表示を許可するとします。次の例では、DBMS_REDACT.ADD_POLICY
expression
パラメータを使用してポリシーを設定し、supervisor
ロールが有効化されているアプリケーション・ユーザーには実際のデータを表示し、他のすべてのアプリケーション・ユーザーにはデータをリダクションする方法を示します。
expression => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''SUPERVISOR'') = ''FALSE'''
Oracle Label Securityラベルの優位性に基づきデータ・リダクション・ポリシーを適用する条件を設定できます。
注意:
この機能は、Oracle Database 12cリリース1 (12.1.0.2)以降で使用可能です。
パブリック・スタンドアロン・ファンクションOLS_LABEL_DOMINATES
を使用して、セッション・ラベルの優位性を確認します。このファンクションは、指定したpolicy_name
値のセッション・ラベルがlabel
パラメータで指定したラベルよりも優位または同位の場合、1
(TRUE
)を戻します。それ以外の場合は0
(FALSE
)を戻します。
たとえば、ポリシーhr_ols_pol
のセッション・ラベルがラベルhs
よりも優位でも同位でもない場合のみデータ・リダクション・ポリシーを適用するには、次のように指定します。
expression => 'OLS_LABEL_DOMINATES (''hr_ols_pol'',''hs'') = 0'
Oracle Application Express (APEX)セッション・ステートに基づいて、データ・リダクション・ポリシーを適用できます。
DBMS_REDACT.ADD_POLICY
expression
パラメータで、次に示すパブリックApplication Express APIのいずれかを使用して、Oracle Application Expressのセッション・ステートに基づいてポリシーを適用します。
V
、APEX_UTIL.GET_SESSION_STATE
ファンクションのシノニムです。
NV
、 APEX_UTIL.GET_NUMERIC_SESSION_STATE
ファンクションのシノニムです。
たとえば、G_JOB
というアプリケーション項目の値がCLERK
となったときにリダクションを発生させるようにDBMS_REDACT.ADD_POLICY
のexpression
パラメータを設定するには次のようにします。
expression => 'V(''APP_USER'') != ''mavis@example.com'' or V(''APP_USER'') is null'
たとえば、これらのようなファンクションを使用することにより、APEXアプリケーションのセッション・ステートに格納されているジョブまたは権限ロールに基づいてデータをリダクションできます。
問合せユーザーがAPEXアプリケーションのコンテキストにないとき(問合せがAPEXフレームワーク外、たとえばSQL*Plusから直接発行されたとき)にリダクションを発生させる場合は、次のようにIS NULL
句を使用します。このポリシー式を使用すると、mavis
というユーザーの問合せがAPEXアプリケーション内部から発行された場合にのみ、このユーザーに実際のデータが表示されます。それ以外の場合、問合せ結果はリダクションされます。
関連項目:
Oracle Application Express APIリファレンス
フィルタリングを使用しなければ、コンテキストに関係なくポリシーを任意のユーザーに適用できます。
ただし、ユーザーSYS
およびEXEMPT REDACTION POLICY
権限を持つユーザーは常にOracle Data Redactionポリシーから除外されることに注意してください。
SYS
以外のユーザーまたはEXEMPT REDACTION POLICY
権限が付与されていないユーザーにポリシーを適用するには、TRUE
に評価されるDBMS_REDACT.ADD_POLICY
expression
パラメータを記述します。
例:
expression => '1=1'
完全リダクション・ポリシーを作成して、データ列のすべての内容をリダクションできます。また、必要に応じて、デフォルトの完全リダクション値を変更できます。
内容は次のとおりです。
完全データ・リダクション・ポリシーでは、データ列のすべての内容がリダクションされます。
内容は次のとおりです。
列のすべてのデータをリダクションするリダクション・ポリシーを設定するには、function_type
パラメータをDBMS_REDACT.FULL
に設定する必要があります。
デフォルトでは、NUMBER
データ型の列はゼロ(0
)に置き換えられ、文字データ型の列は空白1つに置き換えられます(
)。DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES
プロシージャを使用することにより、このデフォルトを変更できます。
関連項目:
デフォルトの完全リダクション値を変更する場合には、デフォルトの完全データ・リダクション値の変更を参照してください。
DBMS_REDACT.ADD_POLICY
プロシージャでは、完全リダクション・ポリシーを作成できます。
完全データ・リダクション・ポリシーを作成する場合のDBMS_REDACT.ADD_POLICY
フィールドは次のとおりです。
DBMS_REDACT.ADD_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, column_name IN VARCHAR2 := NULL, policy_name IN VARCHAR2, function_type IN BINARY_INTEGER := NULL, expression IN VARCHAR2, enable IN BOOLEAN := TRUE);
ここでは次のように指定します。
object_schema
、object_name
、column_name
、policy_name
、expression
、enable
: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」の項を参照してください。
function_type
: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.FULL
と入力します。
function_type
パラメータを省略する場合、デフォルトのリダクションfunction_type
設定は、DBMS_REDACT.FULL
です。
列のデータ型は、使用が許可されているfunction_type
設定を決定することに注意してください。データ型に基づいた完全、部分およびランダム・リダクションの比較を参照してください。
DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、完全リダクション・ポリシーを作成できます。
例10-1に、HR.EMPLOYEES
表のCOMMISSION_PCT
列にすべての値の完全なリダクションを使用する方法を示します。式パラメータは、EXEMPT REDACTION POLICY
システム権限が付与されているユーザーは除き、表の問合せを行った任意のユーザーにポリシーを適用します。(EXEMPT REDACTION POLICY
システム権限の詳細は、Oracle Data Redactionポリシーからのユーザーの除外を参照してください。)
例10-1 完全データ・リダクション・ポリシー
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'hr', object_name => 'employees', column_name => 'commission_pct', policy_name => 'redact_com_pct', function_type => DBMS_REDACT.FULL, expression => '1=1'); END; /
問合せおよびリダクションされた結果:
SELECT COMMISSION_PCT FROM HR.EMPLOYEES; COMMISSION_PCT -------------- 0 0 0
DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、文字値を完全にリダクションするポリシーを作成できます。
例10-2では、mavis.cust_info
表のuser_id
列のユーザーIDを完全にリダクションする方法を示しています。user_id
列は、VARCHAR2
データ型です。出力は空白の文字列です。expression
設定により、MGR
ロールのあるユーザーは、ユーザーIDを表示できます。
例10-2 完全にリダクションされた文字値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'user_id', policy_name => 'redact_cust_user_ids', function_type => DBMS_REDACT.FULL, expression => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''MGR'') = ''FALSE'''); END; /
問合せおよびリダクションされた結果:
SELECT user_id FROM mavis.cust_info; USER_ID ------------ 0 0 0
DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES
プロシージャを使用すると、デフォルトの完全データ・リダクション値を変更できます。
内容は次のとおりです。
完全データ・リダクション・ポリシーで表示されるデフォルトの値を変更できます。
Oracle DatabaseがNUMBER
データ型の列に完全リダクション(DBMS_REDACT.FULL
)を実行する場合、デフォルトでは0
がリダクションされた値です。これを他の値(たとえば、7
)に変更する場合、DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES
プロシージャを実行すると、この値を変更できます。この変更は、現在のデータベース・インスタンスのすべてのデータ・リダクション・ポリシーに適用されます。値を有効にするには、変更した後に、データベースを再起動する必要があります。現在の値を検索するには、REDACTION_VALUES_FOR_TYPE_FULL
データ・ディクショナリ・ビューを問い合せます。
この変更は、完全なデータ・リダクションを使用するデータベースのすべてのデータ・リダクション・ポリシーに影響することに注意してください。デフォルトの完全データ・リダクション値を変更する前に、既存の完全データ・リダクション・ポリシーにこの変更が及ぼす影響を確認してください。
DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES
プロシージャでは、サポートされている標準のOracle Databaseデータ型を使用できます。
構文は次のとおりです。
DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES ( number_val IN NUMBER NULL, binfloat_val IN BINARY_FLOAT NULL, bindouble_val IN BINARY_DOUBLE NULL, char_val IN CHAR NULL, varchar_val IN VARCHAR2 NULL, nchar_val IN NCHAR NULL, nvarchar_val IN NVARCHAR2 NULL, date_val IN DATE NULL, ts_val IN TIMESTAMP NULL, tswtz_val IN TIMESTAMP WITH TIME ZONE NULL, blob_val IN BLOB NULL, clob_val IN CLOB NULL, nclob_val IN NCLOB NULL);
ここでは次のように指定します。
number_val
は、NUMBER
データ型の列のデフォルトの値を変更します。
binfloat_val
は、BINARY_FLOAT
データ型の列のデフォルトの値を変更します。
bindouble_val
は、BINARY_DOUBLE
データ型の列のデフォルトの値を変更します。
char_val
は、CHAR
データ型の列のデフォルトの値を変更します。
varchar_val
は、VARCHAR2
データ型の列のデフォルトの値を変更します。
nchar_val
は、NCHAR
データ型の列のデフォルトの値を変更します。
nvarchar_val
は、NVARCHAR2
データ型の列のデフォルトの値を変更します。
date_val
は、DATE
データ型の列のデフォルトの値を変更します。
ts_val
は、TIMESTAMP
データ型の列のデフォルトの値を変更します。
tswtz_val
は、TIMESTAMP WITH TIME ZONE
データ型の列のデフォルトの値を変更します。
blob_val
は、BLOB
データ型の列のデフォルトの値を変更します。
clob_val
は、CLOB
データ型の列のデフォルトの値を変更します。
nclob
は、NCLOB
データ型の列のデフォルトの値を変更します。
デフォルトの完全データ・リダクション値を変更するには、DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES
プロシージャを使用します。
SYSDBA
管理権限を持つユーザーSYS
としてデータベース・インスタンスにログインします。
変更する値を確認します。
たとえば、NUMBER
データ型を使用する列の現在の値を確認します。
SELECT NUMBER_VALUE FROM REDACTION_VALUES_FOR_TYPE_FULL; NUMBER_VALUE ------------ 0
DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES
プロシージャを実行して値を変更します。
例:
EXEC DBMS_REDACT.UPDATE_FULL_REDACTION_VALUES (number_val => 7);
データベース・インスタンスを再起動します。
例:
SHUTDOWN IMMEDIATE STARTUP
部分データ・リダクションでは、様々な種類のデータ型についてデータの一部をリダクションできます。
内容は次のとおりです。
データの部分リダクションでは、ID番号の最初の5桁など、データの一部のみがリダクションされます。
たとえば、クレジット・カードの番号の大半(最後の4桁以外)をアスタリスク(*)でリダクションできます。文字、数値または日時のデータ型を使用する列に対してポリシーを作成できます。文字データ型のリダクションを行うポリシーには、固定文字リダクション形式を使用できます。Enterprise Manager for Oracle Database 12.1.0.7プラグインがシステムにデプロイされている場合は、カスタム・リダクション形式を作成して保存することもできます。
注意:
以前のリリースでは、「形式」のかわりに「ショートカット」という用語が使用されていました。
DBMS_REDACT.ADD_POLICY
文では、アプリケーションに戻されるデータの特定の部分をリダクションするポリシーを作成できます。
部分リダクション・ポリシーを作成する場合の DBMS_REDACT.ADD_POLICY
フィールドは次のとおりです。
DBMS_REDACT.ADD_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, column_name IN VARCHAR2 := NULL, policy_name IN VARCHAR2, function_type IN BINARY_INTEGER := NULL, function_parameters IN VARCHAR2 := NULL, expression IN VARCHAR2, enable IN BOOLEAN := TRUE);
ここでは次のように指定します。
object_schema
、object_name
、column_name
、policy_name
、expression
、enable
: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」の項を参照してください
function_type
: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.PARTIAL
と入力します。
function_parameters
: ここで設定するパラメータは、column_name
パラメータに指定された列のデータ型によって異なります。詳細は次の項を参照してください。
DBMS_REDACT.ADD_POLICY
function_parameters
パラメータを使用することにより、固定文字形式を使用できるようになります。
内容は次のとおりです。
Oracle Data Redactionには、固定文字を使用するポリシーを構成するための、特別な事前定義形式が用意されています。
表10-2では、 DBMS_REDACT.ADD_POLICY
function_parameters
パラメータ形式について説明します。これは、通常リダクションされることが多い社会保障番号、郵便番号およびクレジット・カード(列でVARCHAR2
またはNUMBER
データ型のいずれかが使用される)に対して使用できます。
表10-2 部分固定文字リダクションの形式
形式 | 説明 |
---|---|
|
列が |
|
列が |
|
列が |
|
列が |
|
列が |
|
列が |
|
列が |
|
列が |
|
|
|
すべての日付を |
|
最後の4桁は表示したまま、16桁のクレジット・カード番号をリダクションします。たとえば、 |
関連項目:
その他のDBMS_REDACT.ADD_POLICY
パラメータの詳細は、「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」を参照してください。
DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、固定文字形式を使用する部分リダクション・ポリシーを作成できます。
例10-3 では、VARCHAR2
データ型の列にある社会保障番号をREDACT_US_SSN_F5
形式によってリダクションする方法について説明します。
例10-3 部分的にリダクションされた文字値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'ssn', policy_name => 'redact_cust_ssns3', function_type => DBMS_REDACT.PARTIAL, function_parameters => DBMS_REDACT.REDACT_US_SSN_F5, expression => '1=1', policy_description => 'Partially redacts 1st 5 digits in SS numbers', column_description => 'ssn contains Social Security numbers'); END; /
問合せおよびリダクションされた結果:
SELECT ssn FROM mavis.cust_info; SSN ------- XXX-XX-4320 XXX-XX-4323 XXX-XX-4325 XXX-XX-4329
DBMS_REDACT.ADD_POLICY
function_parameters
パラメータを使用することにより、文字データ型をリダクションできるようになります。
内容は次のとおりです。
Oracle Data Redactionには、文字データ型を使用するポリシーを構成するための、特別な設定が用意されています。
DBMS_REDACT.ADD_POLICY
のfunction_parameters
パラメータを設定して文字データ型の部分リダクションを定義するときは、次の順序で次の設定の値を入力します。各値はカンマで区切ります。
注意:
部分リダクションには、固定幅の文字セットを使用する必要があることに注意してください。つまり、リダクションされる各文字は、バイト長が等しい別の文字に置換される必要があります。可変長の文字セット(たとえば、UTF-8)を使用する場合、正規表現ベースのリダクションを使用する必要があります。詳細は、正規表現ベースのリダクション・ポリシーを作成する構文を参照してください。
設定は次のとおりです。
入力形式: データが現在どのようにフォーマットされているかを指定します。クレジット・カード番号の全桁など、リダクションされる可能性のある各文字にV
を入力します。クレジット・カード番号のハイフンまたは空白のような書式化文字を使用して書式化する場合、F
を入力します。各文字に、対応するV
またはF
値があるか確認します。(入力形式の値は大/小文字を区別しません。)
出力形式: 表示されるデータを書式化する方法を定義します。リダクションされる可能性のある各文字にV
を入力します。入力形式の各文字F
をハイフンなど表示される文字に使用する文字に置換します。(出力形式の値は大/小文字を区別しません。)
マスク文字: リダクションに使用する文字を指定します。アスタリスク(*)など、リダクションに使用する単一の文字を入力します。
開始する数字位置: リダクションで開始するV
の数字位置を指定します。
終了する数字位置: リダクションで終了するV
の数字位置を指定します。終了する位置の値を決めるときは、F
の位置を含めないでください。
たとえば、次の設定は、クレジット・カード番号5105 1051 0510 5100
の最初の12桁のV
をリダクションし、F
の位置(空白)をハイフンに置換することでクレジット・カード番号で通常使用されるスタイルに書式化し、その結果****-****-****-4320
と表示されます。
function_parameters => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,*,1,12',
関連項目:
その他のDBMS_REDACT.ADD_POLICY
パラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。
DBMS_REDACT.ADD_POLICY
PL/SQLプロシージャにより、文字データ型を使用する部分リダクション・ポリシーを作成できます。
例10-4には、VARCHAR2
データ型の列にある社会保障番号をリダクションする方法と、社会保障番号に含まれているハイフンを保持する方法を示します。
例10-4 部分的にリダクションされた文字値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'ssn', policy_name => 'redact_cust_ssns2', function_type => DBMS_REDACT.PARTIAL, function_parameters => 'VVVFVVFVVVV,VVV-VV-VVVV,*,1,5', expression => '1=1', policy_description => 'Partially redacts Social Security numbers', column_description => 'ssn contains character Social Security numbers'); END; /
問合せおよびリダクションされた結果:
SELECT ssn FROM mavis.cust_info; SSN ----------- ***-**-4320 ***-**-4323 ***-**-4325 ***-**-4329
DBMS_REDACT.ADD_POLICY
function_parameters
パラメータを使用することにより、数値データ型をリダクションできるようになります。
内容は次のとおりです。
数値データ型の値を設定する場合、マスク文字、開始する数字位置および終了する数字位置を指定する必要があります。
数値データ型の部分リダクションの場合、DBMS_REDACT.ADD_POLICY
function_parameters
パラメータについて、次の設定項目の値を記載されている順番に入力できます。
マスク文字: 表示する文字を指定します。0から9までの数値を入力します。
開始する数字位置: 最初の数字に1
を指定するなど、リダクションで開始するの数字位置を指定します。
終了する数字位置: リダクションで終了する数字位置を指定します。
たとえば、次の設定は、社会保障番号987654321
の最初の5桁をリダクションし、その結果、999994321
と表示されます。
function_parameters => '9,1,5',
関連項目:
その他のDBMS_REDACT.ADD_POLICY
パラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。
DBMS_REDACT.ADD_POLICY
プロシージャにより、数値データ型を使用する部分リダクション・ポリシーを作成できます。
例10-5では、mavis.cust_info
表の一連の社会保障番号を、ログインした任意のアプリケーション・ユーザーに対して部分リダクションする方法を示しています。(そのため、expression
パラメータはTRUE
と評価されます。)
このタイプのリダクションが役立つのは、文字列ではなく書式設定された数値をアプリケーションが想定している場合です。このシナリオでは、社会保障番号はデータ型NUMBER
の列にあります。つまり、ssn
列に含まれるのは数字のみで、ハイフンまたは空白など他の文字は含まれせん。
例10-5 部分的にリダクションされたデータ・リダクションの数値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'ssn', policy_name => 'redact_cust_ssns1', function_type => DBMS_REDACT.PARTIAL, function_parameters => '7,1,5', expression => '1=1', policy_description => 'Partially redacts Social Security numbers', column_description => 'ssn contains numeric Social Security numbers'); END; /
問合せおよびリダクションされた結果:
SELECT ssn FROM mavis.cust_info; SSN --------- 777774320 777774323 777774325 777774329
DBMS_REDACT.ADD_POLICY
function_parameters
パラメータを使用することにより、日時データ型をリダクションできるようになります。
内容は次のとおりです。
Oracle Data Redactionには、日時データ型を構成するための特別な設定が用意されています。
日時データ型の部分リダクションの場合、次のDBMS_REDACT.ADD_POLICY
function_parameters
パラメータ設定項目の値を入力します。
値は次に示す順序で入力します。
m: 月をリダクションします。月の名前でリダクションするには、1
から12
を小文字のm
に追加します。たとえば、m5
は、MAY
と表示されます。リダクションを省略するには、大文字のM
を入力します。
d: 月の日をリダクションします。月の日でリダクションするには、1
から31
を小文字のd
に追加します。たとえば、d7
は、07
と表示されます。月の日よりも大きい数値(たとえば、2月に31
を入力)を入力すると、その月の最終日(たとえば、28
)が表示されます。リダクションを省略するには、大文字のD
を入力します。
y: 年をリダクションします。年でリダクションするには、1
から9999
を小文字のy
に追加します。たとえば、y1984
は、84
と表示されます。リダクションを省略するには、大文字のY
を入力します。
h: 時間をリダクションします。時間でリダクションするには、0
から23
を小文字のh
に追加します。たとえば、h20
は、20
と表示されます。リダクションを省略するには、大文字のH
を入力します。
m: 分をリダクションします。分でリダクションするには、0
から59
を小文字のm
に追加します。たとえば、m30
は、30
と表示されます。リダクションを省略するには、大文字のM
を入力します。
s: 秒をリダクションします。秒でリダクションするには、0
から59
を小文字のs
に追加します。たとえば、s45
は、45
と表示されます。リダクションを省略するには、大文字のS
を入力します。
関連項目:
その他のDBMS_REDACT.ADD_POLICY
パラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。
DBMS_REDACT.ADD_POLICY
プロシージャにより、日時データ型を使用する部分リダクション・ポリシーを作成できます。
例10-6では、日付を部分的にリダクションする方法を示しています。この例では顧客の誕生年をリダクションし、それを13
に置き換え、残りの値はそのまま保持します。
例10-6 日時値を使用した部分リダクションによるデータ・リダクション
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'mavis',
object_name => 'cust_info',
column_name => 'birth_date',
policy_name => 'redact_cust_bdate',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => 'mdy2013HMS
',
expression => '1=1',
policy_description => 'Replaces birth year with 2013',
column_description => 'birth_date contains customer's birthdate');
END;
/
問合せおよびリダクションされた結果:
SELECT birth_date FROM mavis.cust_info; BIRTH_DATE 07-DEC-13 09.45.40.000000 AM 12-OCT-13 04.23.29.000000 AM
正規表現ベースのリダクション・ポリシーでは、検索置換モデルに基づいてデータをリダクションできます。
内容は次のとおりです。
正規表現ベースのリダクションでは、リダクションするデータのパターンを検索できます。
たとえば、正規表現を使用して、文字の長さが変化する可能性のある電子メール・アドレスをリダクションできます。これは、文字データのみで使用するように設計されています。検索および置換操作に形式を使用することも、カスタム・パターン形式を作成することもできます。
列内の値のサブセットのリダクションに正規表現は使用できません。REGEXP_REPLACE_STRING
の設定を有効にするには、REGEXP_PATTERN (正規表現パターン)がすべての
値に一致する必要があり、REGEXP_REPLACE_STRING
が値を変更する必要があります。
REGEXP_PATTERN
が一致しない行では、データ・リダクションはDBMS_REDACT.FULL
リダクションを実行します。これにより、一致しない行の実際のデータの表示から、正規表現が列内の値のすべてに一致しない原因となるREGEXP_PATTERN
での誤りのリスクが軽減されます。
さらに、正規表現の置換操作中に、REGEXP_REPLACE_STRING
設定の結果として発生する値への変更がない場合、データ・リダクションはDBMS_REDACT.FULL
リダクションを実行します。
DBMS_REDACT.ADD_POLICY
プロシージャのregexp_*
パラメータによって、正規表現ベースのリダクション・ポリシーを作成できます。
正規表現ベース完全データ・リダクション・ポリシーを作成する場合のDBMS_REDACT.ADD_POLICY
フィールドは次のとおりです。
DBMS_REDACT.ADD_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, column_name IN VARCHAR2 := NULL, policy_name IN VARCHAR2, function_type IN BINARY_INTEGER := NULL, expression IN VARCHAR2, enable IN BOOLEAN := TRUE, regexp_pattern IN VARCHAR2 := NULL, regexp_replace_string IN VARCHAR2 := NULL, regexp_position IN BINARY_INTEGER := 1, regexp_occurrence IN BINARY_INTEGER := 0, regexp_match_parameter IN VARCHAR2 := NULL);
ここでは次のように指定します。
object_schema
、object_name
、column_name
、policy_name
、expression
、enable
: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」の項を参照してください。
function_type
: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.REGEXP
と入力します。
次の点に注意してください。
function_type
パラメータをDBMS_REDACT.REGEXP
に設定すると、function_parameters
パラメータを省略します。
正規表現(regexp_pattern
、regexp_replace
、regexp_position
、regexp_occurrence
およびregexp_match_parameter
)を、pattern
、replace
、position
、occurrence
およびmatch_parameter
引数をREGEXP_REPLACE
SQLファンクションに指定するときとほぼ同じ方法で指定します。REGEXP_REPLACE
SQLファンクションの詳細は、Oracle Database SQL言語リファレンスを参照してください。
regexp_pattern
: 一致する必要のあるデータの検索パターンを説明します。一致が見つかった場合、Oracle Databaseは、regexp_replace_string
設定で指定されたとおりにデータを置換します。詳細は、次の各項を参照してください。
regexp_replace_string
: データのリダクション方法を指定します。詳細は、次の各項を参照してください。
regexp_position
: 文字列検索の開始位置を指定します。入力する値は、Oracle Databaseが検索を開始するcolumn_name
データの文字を示す正の整数です。デフォルトは、1
またはRE_BEGINNING
形式で、Oracle Databaseがcolumn_name
データの最初の文字で検索を開始することを意味します。
regexp_occurrence
: 検索および置換操作の実行方法を指定します。入力する値は、置換操作の回数を示す正の整数です。
0
またはRE_ALL
形式を指定する場合、Oracle Databaseは、一致したすべてのものを置換します。
RE_FIRST
形式を指定する場合、Oracle Databaseは、最初に一致したものを置換します。
正の整数n
を指定すると、Oracle Databaseは、n
番目の一致を置換します。
出現が1より大きい場合、1番目のパターンが検出された後に続く1文字目から、2番目(以降)の出現を検索します。
regexp_match_parameter
: ファンクションが持つデフォルトの照合動作を変更できるテキスト・リテラルを指定します。このパラメータの動作は、REGEXP_REPLACE
SQLファンクションのこのファンクションの動作と同じです。詳細は、Oracle Database SQL言語リファレンスを参照してください。
大文字と小文字を区別せずに検索をフィルタするには、RE_MATCH_CASE_INSENSITIVE
形式を指定します。
DBMS_REDACT.ADD_POLICY
プロシージャ内のregexp_pattern
パラメータとregexp_replace_string
パラメータの両方に対して形式を使用できます。
内容は次のとおりです。
正規表現の形式によって、クレジット・カード番号の数を置換する場合などによく使用される表現を表します。
表10-3では、DBMS_REDACT.ADD_POLICY
プロシージャ内のregexp_pattern
パラメータで使用できる形式について説明します。
表10-3 regexp_patternパラメータの形式
形式 | 説明 |
---|---|
|
任意の桁を検索します。識別されたパターンを、 regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_X, この設定によって、一致した任意の桁が 次の設定では、一致した任意の桁が regexp_replace_string => DBMS_REDACT.RE_REDACT_WITH_SINGLE_1, |
|
先頭6桁および末尾4桁を持つ任意のクレジット・カードの中央の桁を検索します。識別されたパターンを、 この形式で使用する適切な |
|
任意の米国の電話番号を検索します。識別されたパターンを、 この形式で使用する必要のある適切な |
|
任意の電子メール・アドレスを検索します。識別されたパターンを、 この形式で使用できる適切な
|
|
任意のIPアドレスを検索します。識別されたパターンを、 この形式で使用する必要のある適切な |
表10-4では、DBMS_REDACT.ADD_POLICY
プロシージャ内のregexp_replace_string
パラメータで使用できる形式について説明します。
表10-4 regexp_replace_stringパラメータの形式
形式 | 説明 |
---|---|
|
実際のデータの各文字を単一の文字 |
|
|
|
クレジット・カード番号の中央の桁を、 |
|
米国の電話番号の最後の7桁を、 |
|
電子メール・アドレスを、 |
|
電子メール・ドメイン名を、 |
|
IPアドレスの最後の3桁を、 |
関連項目:
その他のDBMS_REDACT.ADD_POLICY
パラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。
DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、形式を使用した正規表現リダクション・ポリシーを作成できます。
例10-7では、正規表現形式を使用してクレジット・カード番号をリダクションする方法を示しています。
例10-7 正規表現データ・リダクション文字値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'cc_num', policy_name => 'redact_cust_cc_nums', function_type => DBMS_REDACT.REGEXP, function_parameters => NULL, expression => '1=1', regexp_pattern => DBMS_REDACT.RE_PATTERN_CC_L6_T4, regexp_replace_string => DBMS_REDACT.RE_REDACT_CC_MIDDLE_DIGITS, regexp_position => DBMS_REDACT.RE_BEGINNING, regexp_occurrence => DBMS_REDACT.RE_FIRST, regexp_match_parameter => DBMS_REDACT.RE_MATCH_CASE_INSENSITIVE, policy_description => 'Regular expressions to redact credit card numbers', column_description => 'cc_num contains customer credit card numbers'); END; /
問合せおよびリダクションされた結果:
SELECT cc_num FROM mavis.cust_info; CC_NUM ------- 401288XXXXXX1881 411111XXXXXX1111 555555XXXXXX1111 511111XXXXXX1118
Oracle Data Redactionには、正規表現を使用するポリシーを構成するための、特別な設定が用意されています。
カスタム正規表現リダクション・ポリシーを作成するには、DBMS_REDACT.ADD_POLICY
プロシージャで次のパラメータを使用します。
regexp_pattern
: このパターンは通常テキスト・リテラルであり、データ型はCHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
のいずれかになります。パターンには、 512バイトまで入力できます。regexp_pattern
パラメータの正規表現を記述する方法の詳細は、『Oracle Database SQL言語リファレンス』にあるREGEXP_REPLACE
SQL関数のpattern
引数の説明を参照してください(データ・リダクションがサポートする正規表現の一致は、REGEXP_REPLACE
SQL関数のものとよく似ているため)。
regexp_replace_string
: データ型はCHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
のいずれかになります。regexp_replace_string
には、最大500個の部分正規表現への後方参照を\
n
という書式で指定でき、n
は、1から9の数値です。regexp_replace_string
設定にバックスラッシュ(\)を含める場合、その前にエスケープ文字(これもバックスラッシュ)を付ける必要があります。たとえば、一致したパターンを文字どおり\2
に置換するには(それを一致したパターンで2番目に一致した部分正規表現に置換するのではない場合)、regexp_replace_string
設定に\\2
を入力します。詳細は、Oracle Database SQL言語リファレンスを参照してください。
関連項目:
その他のDBMS_REDACT.ADD_POLICY
パラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。
DBMS_REDACT.ADD_POLICY
プロシージャのregexp*パラメータによって、カスタム正規表現リダクション・ポリシーを作成できます。
例10-8では、emp_id
列データをリダクションする正規表現の使用方法を示しています。次の例では、regexp_pattern
パラメータとregexp_replace_string
パラメータが組み合されて、最初に9桁のパターンが検索されます。参照用に、それらは最初の3桁、次の2桁、最後の4桁を含む3つのグループに分割されます。その後、9桁すべてが、元のパターンで検索された3番目のグループ(最後の4桁)と連結されたXXXXX
に置換されます。
問合せおよびリダクションされた結果:
SELECT emp_id FROM mavis.cust_info; EMP_ID ------------ XXXXX1234 XXXXX5678
例10-8 正規表現を使用した部分的にリダクションされたデータ・リダクション
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'emp_id', policy_name => 'redact_cust_ids', function_type => DBMS_REDACT.REGEXP, expression => '1=1', regexp_pattern => '(\d\d\d)(\d\d)(\d\d\d\d)', regexp_replace_string => 'XXXXX\3', regexp_position => 1, regexp_occurrence => 0, regexp_match_parameter => 'i', policy_description => 'Redacts customer IDs using regular expression', column_description => 'emp_id contains employee ID numbers'); END; /
ランダム・リダクション・ポリシーは、リダクションされたデータをランダムに生成した値(Ukjsl32[[]]]s
など)で表します。
内容は次のとおりです。
ランダム・リダクション・ポリシーでは、問合せを行ったアプリケーション・ユーザーに対し、列のデータ型に基づいてランダムに生成された値によるリダクション済のデータが表示されます。
LOB列がサポートされていないことに注意してください。
ランダム・リダクション・ポリシーを作成する場合の DBMS_REDACT.ADD_POLICY
フィールドは次のとおりです。
DBMS_REDACT.ADD_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, column_name IN VARCHAR2 := NULL, policy_name IN VARCHAR2, function_type IN BINARY_INTEGER := NULL, expression IN VARCHAR2, enable IN BOOLEAN := TRUE);
ここでは次のように指定します。
object_schema
、object_name
、column_name
、policy_name
、expression
、enable
: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」の項を参照してください。
function_type
: リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.RANDOM
と入力します。
function_type
パラメータを省略する場合、デフォルトのリダクションfunction_type
設定は、DBMS_REDACT.FULL
です。
列のデータ型は、使用が許可されているfunction_type
設定を決定することに注意してください。データ型に基づいた完全、部分およびランダム・リダクションの比較を参照してください。
DBMS_REDACT.ADD_POLICY PL/SQLプロシージャを使用して、ランダム・リダクション・ポリシーを作成できます。
例10-9では、ランダム値の生成方法を示しています。SELECT
文を実行するたびに、出力は異なります。
例10-9 ランダムにリダクションされたデータ・リダクションの値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'login_username', policy_name => 'redact_cust_rand_username', function_type => DBMS_REDACT.RANDOM, expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''APP_USER'''); END; /
問合せおよびリダクションされた結果:
SELECT login_username FROM mavis.cust_info; LOGIN_USERNAME -------------- N[CG{\pTVcK
リダクション・タイプNoneを指定するオプションを使用して、リダクション・ポリシーの内部動作をテストできます。
リダクション・タイプNoneは、ポリシーが定義された表に対する問合せの結果に影響を与えません。このオプションを使用して、リダクション・ポリシー定義を本番環境に適用する前にテストできます。LOB列がサポートされていないことに注意してください。
リダクションを使用しないポリシーを作成する場合の DBMS_REDACT.ADD_POLICY
フィールドは次のとおりです。
DBMS_REDACT.ADD_POLICY ( object_schema IN VARCHAR2 := NULL, object_name IN VARCHAR2, column_name IN VARCHAR2 := NULL, policy_name IN VARCHAR2, function_type IN BINARY_INTEGER := NULL, expression IN VARCHAR2, enable IN BOOLEAN := TRUE);
ここでは次のように指定します。
object_schema
、object_name
、column_name
、policy_name
、expression
、enable
: 「DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文」の項を参照してください。
function_type
: データ・リダクションのタイプの設定に使用するファンクションを指定します。DBMS_REDACT.NONE
と入力します。
function_type
パラメータを省略する場合、デフォルトのリダクションfunction_type
設定は、DBMS_REDACT.FULL
です。
DBMS_REDACT.ADD_POLICY
プロシージャによって、リダクションを実行しないポリシーを作成できます。
例10-10では、表示されている値のいずれもリダクションしないデータ・リダクション・ポリシーの生成方法を示しています。
例10-10 リダクションされないデータ・リダクション値
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'mavis', object_name => 'cust_info', column_name => 'user_name', policy_name => 'redact_cust_no_vals', function_type => DBMS_REDACT.NONE, expression => '1=1'); END; /
問合せおよびリダクションされた結果:
SELECT user_name FROM mavis.cust_info; USER_NAME ---------- IDA NEAU
アクセスしたデータにOracle Data Redactionポリシーを適用しないように、ユーザーを除外することができます。
そのためには、そのユーザーにEXEMPT REDACTION POLICY
システム権限を付与する必要があります。この権限は信頼できるユーザーにのみ付与してください。
また、この権限を付与されているユーザーに加え、ユーザーSYS
も、すべてのデータ・リダクション・ポリシーから除外されます。データ・リダクション・ポリシーを作成するユーザーは、そのユーザーがユーザーSYS
であるか、またはEXEMPT REDACTION POLICY
システム権限が付与されている場合を除き、デフォルトでは、データ・リダクション・ポリシーから除外されません。
次の点に注意してください。
表に対するINSERT
権限があるユーザーは、データ・リダクション・ポリシーがテーブルに存在するかどうかにかかわらず、リダクションされた列に値を挿入できます。データ・リダクションは、ユーザーが発行したSQL SELECT
文(つまり、問合せ)のみに影響し、ユーザーが発行するその他のSQL(INSERT
、UPDATE
またはDELETE
文など)には影響しません。(この例の例外は、次の箇条書きを参照してください。)
選択されている列(ソース列)のいずれかがデータ・リダクション・ポリシーで保護されている場合、ユーザーは、EXEMPT REDACTION POLICY
システム権限が付与されていないかぎり、CREATE TABLE AS SELECT
を実行できません(同様に、ソースがリダクションされた列である場合、DML操作も実行できません)。
EXEMPT REDACTION POLICY
システム権限は、DBA
ロールに含まれますが、この権限は、DBA
ロールが付与された場合のWITH ADMIN OPTION
には含まれないので、明示的にユーザーに付与される必要があります。DBA
ロールには、EXEMPT REDACTION POLICY
システム権限が付与されるEXP_FULL_DATABASE
ロールが含まれるため、DBA
ロールが付与されたユーザーはリダクション・ポリシーから除外されます。
関連項目:
Oracle Data Pumpの権限によるEXEMPT REDACTION POLICY
システム権限への影響の詳細は、Oracle Data RedactionのためのOracle Data Pumpセキュリティ・モデルを参照してください。
DBMS_REDACT.ALTER_POLICY
プロシージャでは、Oracle Data Redactionポリシーを変更できます。
内容は次のとおりです。
DBMS_REDACT.ALTER_POLICY
プロシージャは、データ・リダクション・ポリシーを変更します。
ポリシーがすでに有効化されている場合は、最初に無効化する必要はなく、またポリシーを変更した後でもポリシーは有効化された状態が維持されます。
REDACTION_POLICIES
データ・ディクショナリ・ビューのPOLICY_NAME
列を問い合せて、既存のデータ・リダクション・ポリシーの名前を検索したり、REDACTION_COLUMNS
ビューを問い合せて、ポリシー内に指定された列、関数およびパラメータに関する情報を検索できます。完全データ・リダクションを使用するポリシーを現在の値から検索するには、REDACTION_VALUES_FOR_TYPE_FULL
データ・ディクショナリ・ビューを問い合せます。
action
パラメータは、実行する変更の型を指定します。このプロシージャを実行するときは、少なくともobject_name
およびpolicy_name
パラメータを含める必要があります。
DBMS_REDACT.ALTER_POLICY
プロシージャの構文を使用して、すべてのタイプのデータ・リダクション・ポリシーを変更できます。
DBMS_REDACT.ALTER_POLICY
プロシージャの構文は次のとおりです。
DBMS_REDACT.ALTER_POLICY (
object_schema IN VARCHAR2 := NULL,
object_name IN VARCHAR2 := NULL,
policy_name IN VARCHAR2,
action IN BINARY_INTEGER := DBMS_REDACT.ADD_COLUMN,
column_name IN VARCHAR2 := NULL,
function_type IN BINARY_INTEGER := DBMS_REDACT.FULL,
function_parameters IN VARCHAR2 := NULL,
expression IN VARCHAR2 := NULL,
regexp_pattern IN VARCHAR2 := NULL,
regexp_replace_string IN VARCHAR2 := NULL,
regexp_position IN BINARY_INTEGER := NULL,
regexp_occurrence IN BINARY_INTEGER := NULL,
regexp_match_parameter IN VARCHAR2 := NULL,
policy_description IN VARCHAR2 := NULL,
column_description IN VARCHAR2 := NULL);
ここでは次のように指定します。
action
: 次のいずれかの値を1つ選択し、使用するアクションの種類を定義します。
DBMS_REDACT.MODIFY_COLUMN
(column_name
の値を変更する場合)
DBMS_REDACT.ADD_COLUMN
((ポリシーですでに保護されている列に加えて)リダクションのために新しい列を追加する場合)この設定はaction
パラメータのデフォルトです。
DBMS_REDACT.DROP_COLUMN
(列からリダクションを削除する場合)。
DBMS_REDACT.MODIFY_EXPRESSION
(expression
の値を変更する場合)各ポリシーに指定できるポリシー式は1つのみです。つまり、ポリシー式を変更する際は、既存のポリシー式を新しいポリシー式で置換します。
DBMS_REDACT.SET_POLICY_DESCRIPTION
(ポリシーの説明を変更する場合)
DBMS_REDACT.SET_COLUMN_DESCRIPTION
(列の説明を変更する場合)
関連項目:
残りのパラメータの詳細は、DBMS_REDACT.ADD_POLICYプロシージャの一般的な構文を参照してください。
DBMS_REDACT.ALTER_POLICYプロシージャには、列の追加や変更などの様々な操作を実行できるパラメータが用意されています。
表10-5は、これらのパラメータの組合せを示しています。
表10-5 様々なDBMS_REDACT.ALTER_POLICYの操作に必要なパラメータ
変更内容 | 設定パラメータ |
---|---|
列の追加または変更 |
|
ポリシー式の変更 |
|
ポリシーの説明の変更 |
|
列の説明の変更 |
|
列の削除 |
|
列ごとに独自のリダクション設定を使用して、表またはビューの複数の列をリダクションできます。
この項の演習は、データ・リダクション・ポリシーを変更して、複数の列をリダクションする方法を示しています。また、ポリシーのexpression
設定を変更する方法も示しています。これを実行するには、各段階でDBMS_REDACT.ALTER_POLICY
プロシージャを実行する必要があります。
ユーザーの作成およびそれらのユーザーへの権限の付与を行う権限を持つユーザーとして接続します。
例:
CONNECT sec_admin
Enter password: password
次のユーザーを作成します。
GRANT CREATE SESSION TO dr_admin IDENTIFIED BY password; GRANT CREATE SESSION TO sales_rep IDENTIFIED BY password; GRANT CREATE SESSION TO support_rep IDENTIFIED BY password;
ユーザーdr_admin
に、DBMS_REDACT
PL/SQLパッケージに対するEXECUTE
を付与します。
GRANT EXECUTE ON DBMS_REDACT TO dr_admin;
ユーザーOE
として接続します。
CONNECT OE
Enter password: password
顧客のクレジット・カード情報を含む表を作成し移入します。
CREATE TABLE cust_order_info( first_name varchar2(20), last_name varchar2(20), address varchar2(30), city varchar2(30), state varchar2(3), zip varchar2(5), cc_num varchar(19), cc_exp varchar2(7)); INSERT INTO cust_order_info VALUES ('Jane','Dough','39 Mockingbird Lane', 'San Francisco', 'CA', 94114, '5105 1051 0510 5100', '10/2018'); INSERT INTO cust_order_info VALUES ('Mary','Hightower','2319 Maple Street', 'Sonoma', 'CA', 95476, '5111 1111 1111 1118', '03/2019'); INSERT INTO cust_order_info VALUES ('Herbert','Donahue','292 Winsome Way', 'San Francisco', 'CA', 94117, '5454 5454 5454 5454', '08/2018');
sales_rep
およびsupport_rep
に、表cust_order_info
に対するSELECT
権限を付与します。GRANT SELECT ON cust_order_info TO sales_rep, support_rep;
ユーザーdr_admin
として接続します。
CONNECT dr_admin
Enter password: password
クレジット・カード番号をリダクションするポリシーを作成し、有効にします。
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'oe', object_name => 'cust_order_info', column_name => 'cc_num', policy_name => 'redact_cust_cc_info', function_type => DBMS_REDACT.REGEXP, function_parameters => NULL, expression => '1=1', regexp_pattern => DBMS_REDACT.RE_PATTERN_CCN, regexp_replace_string => DBMS_REDACT.RE_REDACT_CCN, regexp_position => NULL, regexp_occurrence => NULL, regexp_match_parameter => NULL, policy_description => 'Partially redacts credit card info', column_description => 'cc_num_number lists credit card numbers'); END; /
BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'oe', object_name => 'cust_order_info', policy_name => 'redact_cust_cc_info', action => DBMS_REDACT.ADD_COLUMN, column_name => 'cc_exp', function_type => DBMS_REDACT.RANDOM, expression => '1-1'); END; /
ユーザーsales_rep
がリダクション済の値を表示し、ユーザーsupport_rep
が実際のデータを表示する条件を使用するよう、再度ポリシーを変更します。
BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'oe', object_name => 'cust_order_info', policy_name => 'redact_cust_cc_info', action => DBMS_REDACT.MODIFY_EXPRESSION, expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SALES_REP'''); END; /
ポリシーをテストするために、2人のユーザーに表cust_order_info
を問い合せさせます。
CONNECT suport_rep
Enter password: password
SELECT cc_num, cc_exp FROM OE.cust_order_info;
CC_NUM CC_EXP
------------------- -------
5105 1051 0510 5100 10/2018
5111 1111 1111 1118 03/2019
5454 5454 5454 5454 08/2018
ユーザーsupport_rep
は実際のデータを表示できます。
CONNECT sales_rep
Enter password: password
SELECT cc_num, cc_exp FROM OE.cust_order_info;
CC_NUM CC_EXP
---------------- -------
************5100 lST=033
************1119 OZA.w4C
************5454 B(9+;O1
実際のデータは、ユーザーsales_rep
を使用してリダクションされます。
support_rep
のみがリダクション済データを表示でき、sales_rep
は表示できないようにする条件を含めるよう、cust_order_info
を変更します。
CONNECT dr_admin
Enter password: password
BEGIN
DBMS_REDACT.ALTER_POLICY(
object_schema => 'oe',
object_name => 'cust_order_info',
policy_name => 'redact_cust_cc_info',
action => DBMS_REDACT.MODIFY_EXPRESSION,
expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''SUPPORT_REP''');
END;
/
ユーザーに再度ポリシーをテストさせます。
CONNECT support_rep
Enter password: password
SELECT cc_num, cc_exp FROM OE.cust_order_info;
CC_NUM CC_EXP
---------------- -------
************5100 1^XMF~`
************1119 qz+9=#S
************5454 *KCaUkm
これで実際のデータがリダクションされるため、ユーザーsupport_rep
はこのデータを表示できなくなります。
CONNECT sales_rep
Enter password: password
SELECT cc_num, cc_exp FROM OE.cust_order_info;
CC_NUM CC_EXP
------------------- -------
5105 1051 0510 5100 10/2018
5111 1111 1111 1118 03/2019
5454 5454 5454 5454 08/2018
これでユーザーsales_rep
は実際のデータを表示できます。
このチュートリアルのコンポーネントが不要になった場合、次のようにしてそれらを削除できます。
CONNECT dr_admin Enter password: password BEGIN DBMS_REDACT.DROP_POLICY ( object_schema => 'oe', object_name => 'cust_order_info', policy_name => 'redact_cust_cc_info'); END; / CONNECT sec_admin Enter password: password DROP USER dr_admin; DROP USER sales_rep; DROP USER support_rep; CONNECT OE Enter password: password DROP TABLE cust_order_info;
1つの表またはビューで、様々なリダクション・タイプを使用して様々なデータ型の列をリダクションできます。
リダクションする最初の列に対するポリシーを作成します。
DBMS_REDACT.ALTER_POLICY
プロシージャを使用して、ポリシーに次の列を追加します。
必要に応じて、action
、column_name
、function_type
およびfunction_parameters
パラメータ(またはregexp_
で始まるパラメータ)を設定して、新しい列に対するリダクションを定義しますが、object_schema
、object_name
、policy_name
またはexpression
パラメータは変更しないでください。リダクションされた各列には、それを作成するために使用したのと同じリダクション・パラメータが引き続き使用されます。
DBMS_REDACT.ALTER_POLICY
プロシージャによって、複数の列をリダクションできます。
例10-11では、既存のデータ・リダクション・ポリシーに列を追加する方法を示しています。この例のaction
パラメータは、DBMS_REDACT.ADD_COLUMN
を使用して新しい列を追加する必要があることを定義しています。新しい列の名前であるcard_num
は、column_name
パラメータによって設定されます。
例10-11 データ・リダクション・ポリシーへの列の追加
BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'mavis', object_name => 'cust_info', policy_name => 'redact_cust_user_ids', action => DBMS_REDACT.ADD_COLUMN, column_name => 'card_num', function_type => DBMS_REDACT.FULL, function_parameters => '', expression => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''ADM'') = ''TRUE'''); END; /
作成したOracle Data Redactionポリシーは、必要に応じて無効化することも再度有効化することもできます。
内容は次のとおりです。
DBMS_REDACT.DISABLE_POLICY
プロシージャは、Oracle Data Redactionポリシーを無効化します。
REDACTION_POLICIES
ビューのPOLICY_NAME
およびENABLE
列を問い合せると、既存のデータ・リダクション・ポリシーの名前およびそれらが有効化されているかがわかります。ただし、ポリシーが存在している場合は、元のポリシーが無効化されていても表またはビューに他のポリシーを作成することはできません。つまり、同じ表の列に別のポリシーを作成する場合、最初のポリシーを削除してから新しいポリシーを作成して使用する必要があります。
データ・リダクション・ポリシーを無効化するには、次の構文を使用してDBMS_REDACT.DISABLE_POLICY
プロシージャを実行します。
DBMS_REDACT.DISABLE_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2);
ここでは次のように指定します。
object_schema
: データ・リダクション・ポリシーを適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULL
を入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。
object_name
: データ・リダクション・ポリシーに使用する表またはビューの名前を指定します。
policy_name
: 無効化するポリシーの名前を指定します。
例10-12では、データ・リダクション・ポリシーを無効化する方法を示しています。
例10-12 データ・リダクション・ポリシーの無効化
BEGIN DBMS_REDACT.DISABLE_POLICY ( object_schema => 'mavis', object_name => 'cust_info', policy_name => 'redact_cust_user_ids'); END; /
DBMS_REDACT.ENABLE_POLICY
プロシージャは、Oracle Data Redactionポリシーを有効化します。
新しいポリシーを作成した直後に有効化する必要はありません。作成プロセスによって処理されます。既存のデータ・リダクション・ポリシーの名前およびそれらが有効化されているかを確認するには、REDACTION_POLICIES
ビューのPOLICY_NAME
およびENABLE
列を問い合せます。ポリシーを有効にするプロシージャを実行すると、ポリシーはすぐに有効になります。
データ・リダクション・ポリシーを有効化するには、次の構文を使用してDBMS_REDACT.ENABLE_POLICY
プロシージャを実行します。
DBMS_REDACT.ENABLE_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2);
ここでは次のように指定します。
object_schema
: データ・リダクション・ポリシーを適用するオブジェクトのスキーマを指定します。この設定を省略(またはNULL
を入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。
object_name
: データ・リダクション・ポリシーに使用する表またはビューの名前を指定します。
policy_name
: 有効化するポリシーの名前を指定します。
例10-13では、データ・リダクション・ポリシーを有効化する方法を示しています。
例10-13 データ・リダクション・ポリシーの有効化
BEGIN DBMS_REDACT.ENABLE_POLICY ( object_schema => 'mavis', object_name => 'cust_info', policy_name => 'redact_cust_user_ids'); END; /
DBMS_REDACT.DROP_POLICYプロシージャ
は、Oracle Data Redactionポリシーを削除します。
Oracle Data Redactionポリシーは、有効であっても無効であっても削除できます。REDACTION_POLICIES
ビューのPOLICY_NAME
列を問い合せて、既存のデータ・リダクション・ポリシーの名前を確認できます。Oracle Data Redactionポリシーに関連付けられた表またはビューを削除すると、ポリシーは自動的に削除されます。ベスト・プラクティスは、まずポリシーを削除し、その後、表またはビューを削除することです。詳細は、ごみ箱が有効になっている場合のOracle Data Redactionポリシーの削除を参照してください。
データ・リダクション・ポリシーを削除するには、DBMS_REDACT.DROP_POLICY
プロシージャを実行します。
次の構文を使用します。
DBMS_REDACT.DROP_POLICY ( object_schema IN VARCHAR2 DEFAULT NULL, object_name IN VARCHAR2, policy_name IN VARCHAR2);
ここでは次のように指定します。
object_schema
: データ・リダクション・ポリシーが適用されるオブジェクトのスキーマを指定します。この設定を省略(またはNULL
を入力)する場合、Oracle Databaseは現在のスキーマ名を使用します。
object_name
: データ・リダクション・ポリシーに使用する表またはビューの名前を指定します。
policy_name
: 削除するポリシーの名前を指定します。
DBMS_REDACT.DROP_POLICY
プロシージャを実行した後、削除はすぐに有効になります。
例10-14では、データ・リダクション・ポリシーを削除する方法を示しています。
例10-14 データ・リダクション・ポリシーの削除
BEGIN DBMS_REDACT.DROP_POLICY ( object_schema => 'mavis', object_name => 'cust_info', policy_name => 'redact_cust_user_ids'); END; /
SQL式を使用して、Oracle Data Redactionポリシーが定義された列に基づくレポートを作成できます。
SQL式に使用される値はリダクションされます。このリダクションはSQL式が評価される前に実行され、レポートに表示される結果の値は、リダクションされたSQL式の結果全体ではなく、リダクションされた値に対して評価されたSQL式の最終結果になります。
HR.EMPLOYEES
表に対して次のようなデータ・リダクション・ポリシーを作成します。
このポリシーにより9
という数値を持つSALARY
列の最初の4桁の値およびCOMMISSION_PCT
列の最初の1桁の値が9
に置換されます。
BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'HR', object_name => 'EMPLOYEES', column_name => 'SALARY', column_description => 'emp_sal_comm shows employee salary and commission', policy_name => 'redact_emp_sal_comm', policy_description => 'Partially redacts the emp_sal_comm column', function_type => DBMS_REDACT.PARTIAL, function_parameters => '9,1,4', expression => '1=1'); END; / BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'redact_emp_sal_comm', action => DBMS_REDACT.ADD_COLUMN, column_name => 'COMMISSION_PCT', function_type => DBMS_REDACT.PARTIAL, function_parameters => '9,1,1', expression => '1=1'); END; /
HR
スキーマにログインして、次のレポートを実行します。
このレポートでは、SQL式(SALARY + COMMISSION_PCT)
を使用して、従業員の給料と歩合を組み合せます。
SELECT (SALARY + COMMISSION_PCT) total_emp_compensation FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 80; TOTAL_EMP_COMPENSATION ---------------------- 9999.9 9999.95 99990.95 ...
レポートには、連結などのSQL式を使用します。
例:
SELECT 'Employee ID ' || EMPLOYEE_ID || ' has a salary of ' || SALARY || ' and a commission of ' || COMMISSION_PCT || '.' detailed_emp_compensation FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 80 ORDER BY EMPLOYEE_ID; DETAILED_EMP_COMPENSATION ------------------------------------------------------------- Employee ID 150 has a salary of 99990 and a commission of .9. Employee ID 151 has a salary of 9999 and a commission of .95. Employee ID 152 has a salary of 9999 and a commission of .95. ...
redact_emp_sal_comm
データ・リダクション・ポリシーを作成したユーザーを接続し、次の文を実行してポリシーを削除します。
BEGIN DBMS_REDACT.DROP_POLICY ( object_schema => 'HR', object_name => 'EMPLOYEES', policy_name => 'redact_emp_sal_comm'); END; /
Oracle Databaseには、データ・リダクション・ポリシーに関する情報をリストするデータ・ディクショナリ・ビューが用意されています。
これらのビューを問い合せる前に、SELECT_CATALOG_ROLE
ロールを付与する必要があります。
表10-6に、データ・リダクションのデータ・ディクショナリ・ビューを示します。
表10-6 データ・リダクション・ビュー
ビュー | 説明 |
---|---|
|
データベースのリダクションされたすべての列を示し、列が存在する表またはビューの所有者、オブジェクト名、列名、リダクション機能のタイプ、リダクション機能に対するパラメータ(該当する場合)およびリダクション・ポリシーの説明の情報を提供します。ポリシー式が作成されている場合、デフォルトのオブジェクト全体にわたるポリシー式のSQL式を表示します。 |
|
既存のポリシー式の名前およびそれらのSQL式を表示します |
|
データベースのすべてのデータ・リダクション・ポリシーを示します。これには、オブジェクトの所有者、オブジェクト名、ポリシー名、ポリシー式およびポリシーが有効かどうかに関する情報と、データ・リダクション・ポリシーの説明が含まれます。 |
|
完全リダクションを使用するデータ・リダクション・ポリシーの現在のリダクション値を表示します。 |