~オラクルDB担当エンジニア直伝~

ユージ&ギョータの実践データベース講座

Oracle Database 12cを使ってみよう

第6回 セキュリティ (データ・リダクション)

Oracle Databaseには、様々暗号化の機能や、データベース管理者の権限まで制限する非常に強力なアクセス制限など、数多くのそして強力な機能が実装されていて、非常に高いセキュリティを実現しているデータベースです。

Oracle Database 12c Release1でもセキュリティ機能は大きく強化されていて、オンラインでデータにマスクをかける機能や、使用されていない権限を分析する機能などの新機能が追加されています。さらに既にある監査機能についてもアーキテクチャを強化し、オンライン処理に影響を与えず高いパフォーマンスで監査を取ることが可能になっています。

ここでは、オンラインで機密データにマスクをかけるデータ・リダクション機能と、権限分析機能について実際に試してみましょう。

データ・リダクションは、Oracle Database 12cの新機能ですが、Oracle Database 11g Release 2でも11.2.0.4から導入され、使用する機会も多い機能だと思います。第6回では、まずデータ・リダクションを試してみます。

本ガイドに記載している内容は、Oracle Database 12c Release 1の機能評価を手早く行うことを目的としています。システムおよびパッケージの開発や実行環境で使用する際には、関連ドキュメントを参照の上、実施してください。

また、本ガイドは単に情報として提供されるものであり、内容に誤りがないことの保障や弊社サポート部門へのお問い合わせはできませんのでご理解ください。

1. データ・リダクションとは

データ・リダクションは、データベースにアクセスするユーザーやロールに応じて、機密データが格納されている特定の列について、オンラインでリアルタイムにマスク(リダクション)する機能です。

例えば、クレジットカードなど機密データは、業務オペレータ担当者やアプリケーションの開発者などは見る必要がありません。そのような場合に、機密データにマスクをして見えなくします。同時に、データ責任者などデータを確認する必要がある人にはマスクせずに見せることができます。このようにユーザーやアプリケーションに応じて、オンラインでリアルタイムにマスクをかけられます。

データ・リダクションは、データベースの設定のみで機密データのマスクを行えます。アプリケーションの変更などは不要なため、非常に導入しやすいセキュリティ機能です。また、データベース側で一貫したポリシーでマスクをかけるため、様々なアプリケーションに一貫したデータのセキュリティを適用できます。SQL*Plusでの接続などでもデータがマスクされるため、非常に強力です。

2. データ・リダクションの使い方

データ・リダクションは、表やビューに対してリダクション・ポリシーを設定して使います。ポリシーの中で、どんな条件の時に、どの表のどの列について、どんなマスクをするのかを指定します。

例えば、「”特定のユーザー/ロールの接続”について、”従業員表の電話番号の列”のデータについて、”下4桁の数字”を”****”でマスク」というようなポリシーを作成して、設定します。

3. 事前準備(サンプル・スキーマの作成)

ここでは、前回までのマルチテナント・アーキテクチャで使用したデータベースを使用します。

3.1 データベースの準備

もし、まだデータベースをインストールしていない場合は、ここからOracle Database 12cをダウンロードし、 次にこちらのインストール・ガイド (PDF)にそってインストールとデータベース作成まで行って下さい。

今回は、サンプル・スキーマを使用します。マルチテナント・アーキテクチャの環境では事前に用意されているサンプル・スキーマ用のプラガブル・データベースをプラグして、サンプル・スキーマのPDBを作成します。

後ろの付録「プラガブル・データベースによるサンプル・スキーマの作成」でサンプル・スキーマの作成方法について説明していますので、この説明にそってサンプル・スキーマのPDB(PDB_SAMPLE)を作成してください。

3.2 SQL Developer準備

また、今回もクライアントとしてSQL Developerを使用します。SQL Developerをインストールしていない場合は、ここから最新版(4.0.1)をダウンロードしてインストールしてください。

3.3 サンプル・スキーマの準備

今回はサンプル・スキーマに含まれるHR(Human Resource)スキーマを使用します。SQL DeveloperでPDB_SAMPLEへ接続できることを確認します。 まずは、SQL Developer起動し、PDB_SAMPLへsysユーザーでの接続を作成します。

SQL Developer左上部の「接続」から、  アイコンをクリックします。

次にPDB_SAMPLEへの接続情報を入力し、「テスト」ボタンで接続を確認し、「接続」ボタンをクリックして、PDB_SAMPLEへの接続を作成します。PDB管理ユーザーの権限をまだ設定していないため、ここではデータベースを作成した時のsysユーザーを指定しています。

  • 接続名:PDB_SAMPLE
  • ユーザー名:sys
  • パスワード:<データベース作成時に指定したsysユーザーのパスワード>
  • 接続タイプ:基本
  • ロール:SYSDBA
  • ホスト名:<データベースが稼働しているホスト>
  • ポート:1521
  • サービス名:PDB_SAMPLE

接続を作成すると、以下のようにPDB_SAMPLEへの接続が表示されます。

サンプル・スキーマは作成された段階では、アカウントがロックされていて、接続できません。そのため、今回使用するHRユーザーのアカウントをアンロックします。

PDB_SAMPLEの接続を展開し、「他のユーザー」からHRユーザーを右クリックします。 表示されたドロップダウン・メニューより「ユーザーの編集」を選択します。

「ユーザーの編集」画面で、「新規パスワード」と「パスワードの確認」に任意のパスワードを入力します。また、「パスワードが期限切れです」と「アカウントがロックされています」のチェック・ボックスを外します。

次に「適用」をクリックし、「閉じる」をクリックしてユーザーの編集を終了します。

次に、HRスキーマの表を参照するためのユーザー(OE_VIEWER)を作成します。 データ・リダクション機能を使用して、データがマスクされて表示されることを、このユーザーを使用して確認します。

PDB_SAMPLEの接続を展開し、「他のユーザー」で右クリックします。表示されるドロップダウン・メニューから「ユーザーの作成」を選択します。

「ユーザーの作成」画面では、以下を入力します。

  • 「ユーザー」タブ
    • ユーザー名: HR_VIEWER
    • 新規パスワード:<任意のパスワード>
    • パスワードの確認:<新規パスワードと同様>
    • デフォルト表領域:USERSを選択
    • 一時表領域:TEMPを選択
  • 「付与されたロール」タブ
    • CONNECT、RESOURCE を選択

入力後、「適用」をクリックし、適用完了後に「閉じる」をクリックして終了します。

3.4 SQL DeveloperのHRおよびHR_VIEWER接続の準備

データを参照するユーザー、HRとHR_VIEWERユーザーの接続をSQL Developerに事前に作成しておきます。

まず、HRユーザーの接続を作成します。SQL Developerの接続から、   アイコンをクリックして、「データベース接続の作成/選択」で以下のように入力して作成します。

  • 接続名:HR
  • ユーザー名:HR
  • パスワード:<HRユーザーのアンロック時に指定したパスワード>
  • 接続タイプ:基本
  • ロール:デフォルト
  • ホスト名:<データベースが稼働しているホスト>
  • ポート:1521
  • サービス名:PDB_SAMPLE

同様に、HR_VIEWERユーザーでの接続も作成します。

  • 接続名:HR_VIEWER
  • ユーザー名:HR_VIEWER
  • パスワード:<HR_VIEWERユーザーの作成時に指定したパスワード>
  • 接続タイプ:基本
  • ロール:デフォルト
  • ホスト名:<データベースが稼働しているホスト>
  • ポート:1521
  • サービス名:PDB_SAMPLE

接続の作成完了後、以下のようにHRとHR_VIEWERの接続が表示されていることを確認してください。

3.5 HR_VIEWERユーザーのHRの表に対する読取り権限の準備

HR_VIEWERはHRスキーマの表をマスクして表示するためのユーザーです。そのため、まずはHRスキーマへの読取り権限が必要になります。

今回はHRスキーマのEMPLOYEES表についてマスクをかけます。そのためHR_VIEWERユーザーがEMPLYEES表を検索できるように権限を設定します。

HRの接続を展開し、「表」からEMPLYEES表を右クリックします。ドロップダウン・メニューより「権限付与」を選択します。

「ユーザー/ロール」にHR_VIEWERを指定し、SELCT権限を指定して、「適用」をクリックします。

これで、HR_VIEWERユーザーからHRのEMPLOYEES表を参照できるようになりました。

ここまでで、事前準備(サンプル・スキーマの作成)が完了です。
次は、準備した環境を使用して、データ・リダクションの設定を行います。

4. データ・リダクションの設定

データ・リダクションのリダクション・ポリシーの設定を行います。マスクは以下の4つの方法で行えます。

  • 完全: 列内のデータを全てブランクまたは0詰め
  • 部分: 列データの一部を’*’や’9’などで上書き
  • 正規表現: カード番号やEメールなどパターンに沿ってデータを生成
    (正規表現を用いてパターンを設定可能)
  • ランダム: 列内のデータを全てランダムに生成

今回は、HRスキーマのEMPLOYEES表のSALARY列を完全リダクションでマスクします。また、PHONE_NUMBER列について、下4桁を正規表現リダクションで’****’にマスクします。

4.1 HR_VIEWERによる事前データ確認
リダクションを行う前に、HR_VIEWERユーザーからHRのEMPLOYEES表のデータが全て参照できることを確認しておきましょう。

SQL DeveloperのHR_VIEWERの接続で右クリックをし、「SQLワークシートを開く」を選択します。

SQL Developerの右側のビューにHR_VIEWERのタブが表示され、SQLワークシートが開きます。

では、HR_VIEWERのSQLワークシートから、HRのEMPLOYEES表をSELECTします。

SELECT * FROM hr.emplyeesと入力し、 をクリックして(またはCtrl-Enterで)SQLを実行します。

これからリダクションを設定する、PHONE_NUMBER列やSALARY列がマスクされずに表示されていることが確認できます。

4.2 SALARY列への完全リダクションの実施

それでは、最初にSALARY列の完全リダクションのポリシー作成を行います。ポリシーの作成は、DBMS_REDACT.ADD_POLICYプロシージャを使用して行います。

ポリシーの設定は、PDB_SAMPLEのSYSユーザーの接続で行います。 HR_VIEWERの時と同様に、PDB_SAMPLEの接続を右クリックし、「SQLワークシート」を選択して、SQLワークシートを開きます。

Note: 今回はsysユーザーで設定しますが、通常はポリシー設定用のアカウントを作成し、必要な権限(DBMS_REDACTプロシージャへの実行権限、SYS.REDACTION_POLICIES、SYS.REDACTION_COLUMNSビューへのSELECT権限)を付与して使用してください。

SQLワークシートから、以下のSQL文を入力して、実行してください。
(実行するSQL文を選択するか、SQL文のいずれかの行にカーソルをおいて、 INSERT PLAY ICONをクリックまたはCTRL-Enterを入力して実行します)



BEGIN
  DBMS_REDACT.ADD_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'EMPLOYEES_REDACT',
    expression    => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR''',
    column_name   => 'SALARY', 
    function_type => DBMS_REDACT.FULL);
END;
/	
	

SQLが正常に実行されると、「スクリプトの出力」ビューに“無名ブロック完了”と表示されます。

このDBMS_REDACT.ADD_POLICYによる設定では、以下を指定しています。

  • OBJECT_SCHEMA: データ・リダクション・ポリシーを適用するスキーマ名を指定 今回は、HRスキーマを指定しています。
  • OBJECT_NAME: データ・リダクション・ポリシーが適用される表を指定 今回は、EMPLOYEES表を指定しています。
  • POLICY_NAME: 任意のポリシー名を指定 今回はEMPLOYEES_REDACTを指定しています。
  • EXPRESSION: リダクション(マスク)を行う条件を指定 この条件は、SYS_CONTEXT の値を使用して記述します。条件に当てはまる場合(条件がTRUEの場合)、リダクション(マスク)が実行されます。今回は、ユーザーが“HR”以外の場合に、リダクションされるように設定しています。
  • COLUMN_NAME: リダクションする列を指定 今回は、SALARY列を指定しています。
  • FUNCTION_TYPE: リダクションの種類を指定 今回は、完全リダクションを示す”DBMS_REDACT.FULL”を指定しています。

それでは、本当にマスクされているかを、HR_VIEWERユーザーから参照して確認してみましょう。

先ほどのHR_VIEWERのSQLワークシートから、同じSELECT文(SELECT * FROM HR.EMLOYEES)を実行します。

今度は、SALARY列の値が全て”0”になっているのが確認できると思います。

この様に、アプリケーション側(検索する側)を一切変更する事無く、ポリシーさえ設定すれば、リダクションが行えることが確認できたと思います。

4.3 SALARY列への正規表現リダクションの実施

次に正規表現リダクションを使用して、PHONE_NUMBER列のデータの下4桁を”****”でマスクします。

EMPLOYEES表には既にポリシーが設定してあります。そのため、今回はDBMS_REDACT.ALTER_POLICYプロシージャを使用し、既存のEMPLOYEES_REDACTポリシーにリダクションする列(PHONE_NUMBER列)を追加します。

以下のSQL文を入力して、実行してください。



BEGIN
  DBMS_REDACT.ALTER_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'EMPLOYEES_REDACT',
    action        => DBMS_REDACT.ADD_COLUMN,

    column_name   => 'PHONE_NUMBER', 
    function_type => DBMS_REDACT.REGEXP,
    regexp_pattern          => '\d{4}$',
    regexp_replace_string   => '****',
    regexp_position         => 1,
    regexp_occurrence       => DBMS_REDACT.RE_ALL);
END;
/	
	

正常に実行され、“無名ブロック完了”と表示されることを確認します。

このDBMS_REDACT.ALTER_POLICYによる設定では、以下を指定しています。

  • ACTION: ポリシー変更の項目を指定
    今回はリダクションする列を追加するので、DBMS_REDACT.ADD_COLUMNを指定しています。
  • REGEXP_PATTERN: マッチするデータの検索パターンを指定
    今回は、'¥d{4}$'で、末尾のは数字4つを示しています。
  • REGEXP_REPLACE_STRING: リダクション結果の出力文字列を指定
    今回は、'****'を指定しています。パターンに一致した数字4つを'****'に置換します。
  • REGEXP_POSITION: 検索の開始位置を指定
    今回は'1'を指定して、先頭の文字から検索を開始しています。
  • REGEXP_OCCURRENCE: パターンにマッチする回数を指定
    このパラメータは、DBMS_REDACT.RE_ALLを指定した場合は全てのマッチする文字列を置換え、正の数nを指定した場合はn個のマッチする文字列を置換えます。 今回は、DBMS_REDACT.RE_ALLを指定しています。

それでは、PHONE_NUMBER列のデータが、正しく下4桁がマスクされているかを、HR_VIEWERユーザーから確認します。

再度、HR_VIEWERのSQLワークシートから、同じSELECT文(SELECT * FROM HR.EMLOYEES)を実行します。

PHONE_NUMBER列の電話番号データの下4桁が正しく”****”でマスクされているのが確認できたと思います。

また、HRスキーマで検索した場合は、マスクされずに検索できることも確認してみましょう。

HR_VIEWERと同様にHR接続のSQLワークシートを開いて、検索(SELECT * FROM EMPLOYEES)を実行します。

マスクは、HRユーザー以外の時にかけるようにポリシーを設定しています。そのため、HRユーザーから参照すると、SALARY列やPHONE_NUMBER列のデータがマスクされずに表示されることが確認できます。

4.4リダクション設定の削除

最後に、リダクション・ポリシーを削除し、HR_VIEWERからデータがマスクされずに参照できるように戻します。

リダクション・ポリシーの削除は、DBMS_REDACT.DROP_POLICYプロシージャで行います。

以下のSQLを入力し、実行して削除を行います。



BEGIN
  DBMS_REDACT.DROP_POLICY(
    object_schema => 'HR', 
    object_name   => 'EMPLOYEES', 
    policy_name   => 'EMPLOYEES_REDACT');
END;
 /	
	

正常に実行され、“無名ブロック完了”と表示されることを確認します。

再度、HR_VIEWERのSQLワークシートから、同じSELECT文(SELECT * FROM HR.EMLOYEES)を実行します。

SALARY列とPHONE_NUMBER列のデータが、元通り全てマスクされずに表示され、リダクション・ポリシーが削除されたことが確認できます。

5. まとめ

今回はセキュリティ新機能の、データ・リダクションについて試してみました。

データ全てのマスクと、正規表現による部分的なマスクを実際に試して確認しました。他にもランダムなデータを自動生成してマスクすることもでき、非常に柔軟にマスクをかけられます。

また、データベースの設定を行うのみで、アプリケーションの変更を一切すること無く、しかもオンラインでデータにマスクがかけられることも確認できたと思います。

アプリケーションでマスクをかける場合、実装のコストがかかるだけではなく、意図しないアプリケーションやSQL*Plusなどで直接参照した場合に、データが見えてしまうことがあります。しかし、データ・リダクションの場合は、データベース側で一貫したポリシーでマスクをかけられるので、そういった危険を減らすことができます。

データ・リダクションは設定も容易で、Oracle Database 12cだけでは無く、Oracle Database 11g Release 2(11.2.0.4)でも使え、導入し易い機能です。ぜひいろいろ試してみて下さい。


 

付録:プラガブル・データベースによるサンプル・スキーマの作成

マルチテナント・アーキテクチャでは、個々のアプリケーションやテスト用のデータベース環境は、それぞれ個別のプラガブル・データベース(PDB)として作成します。 サンプル・スキーマも個別のプラガブル・データベースとして事前に用意されていて、プラグインしてサンプル・スキーマを作成します。

ただし、事前に用意されているサンプル・スキーマ用のプラガブル・データベースは、DBCA(Database Configuration Assistant)用の特殊なフォーマットになっています。そのため、DBCAを使用して作成します。

DBCAの起動

XWindowの環境で、必要な環境変数(ORACLE_HOME、PATH)を設定し、DBCAを起動します。以下はシェルにbashを使用している場合のDBCAを起動する例です。



$ export ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1
$ export PATH=$PATH:$ORACLE_HOME/bin
$ dbca	
	

DBCAを起動すると、DBCAの画面が表示されるので、「プラガブル・データベースの管理」を選択して、「次へ」をクリックします。

「プラガブル・データベースの作成」を選択して、「次へ」をクリックします。

プラガブル・データベースを作成する、コンテナ・データベースを選択し、「次へ」をクリックします。

「PDBファイルを使用してプラガブル・データベースの作成」選択し、「プラガブル・データベースのメタデータ・ファイル」の「参照」をクリックします。
DBCAのtemplatesディレクトリが表示されるので、”sampleschema.xml”を選択し、「OK」をクリックします。次に、「次へ」をクリックします。

「プラガブル・データベース名」に、任意の名前を入力し、必要に応じてPDB管理者ユーザーの作成を指定し、「次へ」をクリックします。

PDB管理ユーザーは、作成したPDBの管理を行うユーザーで、その他のPDBやCDB(コンテナ・データベース)にはアクセスできません。サンプル・スキーマを使用するユーザーが、その他のPDBやCDBへのアクセスが不要な場合は、管理ユーザーを作成します。

PDB管理ユーザーは、デフォルトでは権限は割当てられません。PDB_DBAロールが割当てられますが、このPDB_DBAロールには権限は含まれていません。必要に応じて管理に必要な最小限の権限をPDB管理ユーザーに割当てます。

プラガブル・データベースの作成が開始され、進行状況が表示されます。

正常に作成が完了すると、以下のようなメッセージが表示されるので、「OK」をクリックし、作成を終了します。

以上で、サンプル・スキーマ用のプラガブル・データベースの作成が完了です。

<< 第5回へ戻る

>> 連載トップページに戻る