※ 本記事は、Richard Evansによる”Using Data Redaction in Oracle Database 23ai“を翻訳したものです。
Oracle Database 23.6では、Data Redactionの更新により、機密データを保護し、コンプライアンス要件を満たすための堅牢な新しいオプションが提供されます。次に、新機能の概要と、そのいくつかの詳細を示します:
- 拡張ビューのサポート: ビューのターゲット・リスト内の列をリダクションします(CREATE VIEWとインライン・ビューの両方を含む)。
- 仮想列のベース列のリダクション・ポリシー: 仮想列のベース列をリダクションします。
- SET演算子を使用したインライン・ビューのサポート: データ・リダクション・ポリシーを持つ列には、共通表式(WITH句)、OUTER JOINおよびCOUNTやMAXなどの集計関数を使用します。
- DISTINCT、GROUP BYおよびORDER BYに対する拡張問合せのサポート: リダクションされた列に対する式をGROUP BYとSELECTリストの両方に含める問合せが完全にサポートされるようになりました。
Oracleサンプル・スキーマを使用した例を含む新機能の詳細を次に示します。フォローする場合は、Oracleサンプル・スキーマ、販売履歴(SH)をインストールする必要があります。最新のコピーはここにあります。それ以外の場合は、コマンドおよび出力を読み取って、Oracle Database 23.6のOracle Data Redactionの改善点を理解できます。
読取り専用ユーザーを作成し、SHスキーマ・オブジェクトに対する適切な権限を付与します。
| create user sh_reader identified by Oracle123; grant create session to sh_reader; grant read any table on schema sh to sh_reader; |
まず、列を指定せずにデータ・リダクション・ポリシーを作成します。このポリシーに基づいて、リダクションする列を追加し、特定の列に異なるリダクション式を指定することもできます。このデフォルト・ポリシーは、SHデータベース・ユーザーを除くすべてのユーザーの値を常にリダクションします。
| BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'SH', object_name => 'CUSTOMERS', policy_name => 'REDACT_SENSITIVE_DATA', expression => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''SH''' ); END; / |
拡張ビューのサポート
データベース・ビューは、データ・セキュリティ、データ抽象化、データ集計またはデータ変換の形式として、データ・アクセスを簡略化するために頻繁に使用されます。このリリースでは、CREATE VIEWとインライン・ビューの両方を含む、リダクションされた列の式をビューのターゲット・リストに含めることができるようになりました。たとえば、CUSTOMER_VIEWという顧客データの簡易ビューを作成します。このビューは、姓と名、および資材ステータスを、レポート・ツールで理解できる形式に変換します。
| CREATE OR REPLACE VIEW sh.customer_view AS SELECT cust_id, UPPER(cust_first_name) AS FIRST_NAME, UPPER(cust_last_name) AS LAST_NAME, CASE WHEN cust_marital_status IS NULL OR TRIM(cust_marital_status) = '' THEN 'UNKNOWN' ELSE UPPER(cust_marital_status) END AS marital_status, cust_gender AS GENDER, cust_email AS EMAIL, cust_postal_code AS POSTAL_CODE, cust_credit_limit AS CREDIT_LIMIT FROM sh.customers; |
ベース表のCUST_MARITAL_STATUS列にリダクション・ポリシーを適用します:
| BEGIN DBMS_REDACT.ALTER_POLICY ( object_schema => 'SH', object_name => 'CUSTOMERS', policy_name => 'REDACT_SENSITIVE_DATA', column_name => 'CUST_MARITAL_STATUS', action => DBMS_REDACT.ADD_COLUMN, function_type => DBMS_REDACT.FULL); END; / |
次に、SH_VIEWERとして接続し、CUSTOMER_VIEWを問い合せます:
| SELECT CUST_ID, FIRST_NAME, LAST_NAME, EMAIL, MARITAL_STATUS FROM sh.customer_view WHERE cust_id IN (101, 103, 176, 201); |
以前のリリースでは、EXEMPT REDACTION POLICY権限が付与されていなければ、次のエラー・メッセージが表示されます:
| ORA-28094: SQL construct not supported by data redaction |
Oracle Database 23.6では、MARITAL_STATUS列がリダクションされた状態で返されるデータが表示されます。
| SELECT CUST_ID, FIRST_NAME, LAST_NAME, EMAIL, MARITAL_STATUS FROM sh.customer_view WHERE cust_id IN (101, 103, 176, 201); |
| CUST_ID FIRST_NAME LAST_NAME EMAIL MARITAL_STATUS |
| ---------- --------------- --------------- -------------------------------------- -------------- |
| 101 LOU FITZ lou.fitz@company2.example.com |
| 103 AILEEN NEWKIRK aileen.newkirk@company2.example.com |
| 176 CARIN LIGHTFOOT carin.lightfoot@company2.example.com |
| 201 ALYSSA CLIPP alyssa.clipp@company2.example.com |
デモンストレーションしたように、このビューは、FIRST_NAME列およびLAST_NAME列に変換を適用し、基礎となるデータに対するリダクション・ポリシーを維持しながら、婚姻区分列形式を変更します。これにより、ユーザーはVIEまたは表と同じ方法でデータを表示できます。
仮想列のベース列のリダクション・ポリシー
ユーザーに個々の列の問合せを依頼するかわりに、複数の列を1つの仮想列に結合できます。たとえば、問合せ結果に顧客の郵便番号を含めなくても、この列は仮想列FULL_ADDRESSに含まれます。以前は、CUST_POSTAL_CODE列にリダクション・ポリシーを適用できませんでした。23.6 では、次の例があります。次の仮想列の作成を実行して、CUST_STREET_ADDRESS、CUST_CITY、CUST_STATE_PROVINCEおよびCUST_POSTAL_CODEをFULL_ADDRESSに結合します。
| ALTER TABLE sh.customers ADD (full_address AS (cust_street_address || ', ' || cust_city || ', ' || cust_state_province || ' ' || cust_postal_code)); |
| BEGIN DBMS_REDACT.ALTER_POLICY( object_schema => 'SH', object_name => 'CUSTOMERS', column_name => 'CUST_POSTAL_CODE', policy_name => 'REDACT_SENSITIVE_DATA', function_type => DBMS_REDACT.FULL ); END; / |
以前のリリースでは、仮想列の一部である列にリダクション・ポリシーを適用できませんでした。次のエラー・メッセージが表示されます:
| ORA-28073: The column "CUST_POSTAL_CODE" has an unsupported data type or attribute. |
また、以前のリリースでは、リダクション・ポリシーを設定した後に仮想列を追加しようとすると、次のようなエラーが表示されます:
| ORA-28083: A redacted column was referenced in a virtual column expression. |
23.6 では、リダクション・ポリシーをCUST_POSTAL_CODE列に適用でき、SH_READERに次のような結果が表示されるようになりました:
| SELECT cust_id, cust_last_name, full_address FROM sh.customers WHERE cust_id IN (101, 103, 176, 201); |
| CUST_ID CUST_LAST_NAME FULL_ADDRESS ---------- -------------- ------------ 101 FITZ 103 NEWKIRK 176 LIGHTFOOT 201 CLIPP |
ノート: このリリースでは、ベース列のみに仮想列自体にリダクション・ポリシーを適用することはできません。
REDACTION_COLUMNSビューを問い合せると、19cの列が2つ、23.6の列が2つ表示されます。
| COLUMN column_name FORMAT a25 COLUMN function_type FORMAT a25 SELECT column_name, function_type FROM REDACTION_COLUMNS WHERE OBJECT_OWNER = 'SH' AND OBJECT_NAME = 'CUSTOMERS'; |
| COLUMN_NAME FUNCTION_TYPE -------------------- ----------------- CUST_MARTIAL_STATUS FULL REDACTION CUST_POSTAL_CODE FULL REDACTION |
SET演算子を使用したインライン・ビューのサポート
ビジネス・アナリストは、貴社の顧客の与信限度額データを保護するよう依頼しました。ビジネス・アナリストは、給与データを公開せずに、平均与信限度額を上回る顧客数と下回る顧客数を識別する必要があります。そのためには、共通表式(WITH句)、OUTER JOINおよびCOUNTやMAXなどの集計関数を含む複雑な問合せをアナリストが記述する必要があります。Oracle Data Redaction 23.6でこれを実行できます!
この演習では、ビジネス・アナリストがCUST_POSTAL_CODE列を参照できる必要があります。データ・リダクション・ポリシーからその列を削除し、CUST_CREDIT_LIMIT列を完全リダクション列として追加します。
| BEGIN DBMS_REDACT.ALTER_POLICY ( object_schema => 'SH', object_name => 'CUSTOMERS', policy_name => 'REDACT_SENSITIVE_DATA', column_name => 'CUST_POSTAL_CODE', action => DBMS_REDACT.DROP_COLUMN); END; / BEGIN DBMS_REDACT.ALTER_POLICY ( object_schema => 'SH', object_name => 'CUSTOMERS', policy_name => 'REDACT_SENSITIVE_DATA', column_name => 'CUST_CREDIT_LIMIT', action => DBMS_REDACT.ADD_COLUMN, function_type => DBMS_REDACT.FULL); END; / |
次の問合せでは、郵便番号別に顧客をグループ化し、与信限度額を上回る顧客数と下回る顧客数を表示する表が作成され、出力に最高、最低または平均与信限度額のデータは提供されません。
| COLUMN cust_postal_code HEADING 'Postal|Code' COLUMN total_customer_count HEADING 'Total|Customer|Count' COLUMN num_customers_below_avg HEADING 'Num Customers|Below Avg' COLUMN num_customers_above_avg HEADING 'Num Customers|Above Avg' COLUMN highest_credit_limit HEADING 'Highest|Credit Limit' COLUMN lowest_credit_limit HEADING 'Lowest|Credit Limit' COLUMN average_credit_limit HEADING 'Average|Credit Limit' WITH avg_credit_limits AS ( SELECT cust_postal_code, AVG(cust_credit_limit) AS avg_credit_limit FROM sh.customers WHERE cust_postal_code IN ('55787', '63736', '38082') AND cust_credit_limit IS NOT NULL GROUP BY cust_postal_code ) SELECT c.cust_postal_code, COUNT(*) AS total_customer_count, COUNT(CASE WHEN c.cust_credit_limit < acl.avg_credit_limit THEN 1 END) AS num_customers_below_avg, COUNT(CASE WHEN c.cust_credit_limit > acl.avg_credit_limit THEN 1 END) AS num_customers_above_avg, MAX(c.cust_credit_limit) AS highest_credit_limit, ROUND(MIN(c.cust_credit_limit), 0) AS lowest_credit_limit, ROUND(AVG(c.cust_credit_limit), 0) AS average_credit_limit FROM sh.customers c JOIN avg_credit_limits acl ON c.cust_postal_code = acl.cust_postal_code WHERE c.cust_postal_code IN ('55787', '63736', '38082') GROUP BY c.cust_postal_code ORDER BY c.cust_postal_code; |
SHは与信限度額のデータを見ることができます。
| Total Postal Customer Num Customers Num Customers Highest Lowest Average Code Count Below Avg Above Avg Credit Limit Credit Limit Credit Limit ---------- ---------- ------------- ------------- ------------ ------------ ------------ 38082 695 359 336 15000 1500 5947 55787 612 301 311 15000 1500 6223 63736 637 334 303 15000 1500 5830 |
SH_READERは与信限度額データを表示しません。
| Total Postal Customer Num Customers Num Customers Highest Lowest Average Code Count Below Avg Above Avg Credit Limit Credit Limit Credit Limit ---------- ---------- ------------- ------------- ------------ ------------ ------------ 38082 695 359 336 0 0 0 55787 612 301 311 0 0 0 63736 637 334 303 0 0 0 |
表示する必要がある列の平均が表示されますが、未リダクションの与信限度額データは表示されません。Data Redactionは非定型SQLのWHERE句に制限を設けないため、問合せ対象の列にデータ・リダクション・ポリシーがあり、リダクションされた値のみが表示されている場合でも、WHERE句を反復的に使用して実際のデータを見分けることができます。ただし、上記のような分析レポートが用意されている場合は、クエリを書き直したり、レポート・ツールを更新することなく、機密データが公開されるリスクを軽減できます。
DISTINCT、GROUP BYおよびORDER BYに対する拡張問合せのサポート
ほとんどの分析問合せまたは拡張問合せは、DISTINCT句、GROUP BY句およびORDER BY句のサポートに依存します。リダクションされた列に対する式をGROUP BYとSELECTリストの両方に含める問合せが完全にサポートされるようになりました。さらに、SELECT DISTINCT句およびORDER BY句を使用する問合せにリダクションされた列を含めることができるため、問合せ機能を損なうことなく機密データを保護できます。
分析タイプの問合せで機密データをリダクションする方法のデモンストレーションを行います。この問合せは、リダクションされた列から個別値を選択し、ソート時にデータのプライバシを維持して順序付けします。
| COLUMN cust_postal_code HEADING 'Postal|Code' COLUMN total_credit_limit HEADING 'Total|Credit' SELECT cust_postal_code, SUM(cust_credit_limit) AS TOTAL_CREDIT_LIMIT FROM sh.customers GROUP BY cust_postal_code ORDER BY total_credit_limit DESC FETCH FIRST 10 ROWS ONLY; ; |
このリリース前では、次のようなエラーが表示されます:
| ORA-28094: SQL construct not supported by data redaction |
しかし、23.6では、各部門の給与の合計でソートされたデータを表示できます。
| COLUMN cust_postal_code HEADING 'Postal|Code' COLUMN total_credit_limit HEADING 'Total|Credit' SELECT cust_postal_code, SUM(cust_credit_limit) AS total_credit_limit FROM sh.customers GROUP BY cust_postal_code ORDER BY total_credit_limit DESC FETCH FIRST 10 ROWS ONLY; |
SHは与信限度額のデータを見ることができます。
| Postal Total Code Credit ---------- ---------- 38082 4133000 78558 3904500 55787 3808500 48346 3741000 63736 3713500 45704 3680500 69776 3647500 67843 3606500 72860 3277500 80841 3262500 10 rows selected. |
SH_READERは与信限度額データを表示しません。
| Postal Total Code Credit ---------- ---------- 38082 0 78558 0 55787 0 48346 0 63736 0 45704 0 69776 0 67843 0 72860 0 80841 0 10 rows selected. |
SHスキーマを元の構成にリストアします。
ビュー、データ・リダクション・ポリシーおよび仮想列の削除をクリーンアップするには、次のSQLを実行します:
| DROP VIEW sh.customer_view; BEGIN DBMS_REDACT.DROP_POLICY( object_schema => 'SH', object_name => 'CUSTOMERS', policy_name => 'REDACT_SENSITIVE_DATA' ); END; / ALTER TABLE sh.customers DROP COLUMN full_address; |
Oracle Data Redactionに対するこれらの更新により、データベース管理者および開発者向けの強力な新しいツールが提供されるため、機密データが業界標準に準拠し、安全であることが保証されます。これらの機能をデータ管理戦略に統合することで、Oracleデータベースのセキュリティと機能の両方を強化できます。
Oracle LiveLabsでは、Oracle Autonomous Database 23aiでOracle Data Redactionを無料で試すことができます。