2020年12月3日木曜日

Autonomous DatabaseのAPEXでReal Application Securityを試してみる

 Autonomous Database上のOracle APEXにて、Real Application SecurityのHRデモを動かしてみました。HRデモのマニュアルの説明はこちらです。実施した作業を書き残しておきます。マニュアルではSQLを実行することで、RASによる保護を確認していますが、この確認をOracle APEXのアプリケーションで行うことが目標です。

Always FreeのAutonomous Transaction Processingと、デモのステージングのためにAlways FreeのComputeインスタンスをひとつ作っています。

以下の手順の説明では、ATPのデータベース名APEXRASとします。実際に作業をなぞるときは、適当にデータベース名は置き換えてください。また、Oracle APEXのワークスペースとしてRASDEVが作成済みとします。Always FreeのComputeインスタンスは、Oracle Linux 7.9で作成済みとします。

サンプル・スキーマの入手

RASのHRデモは、Oracle Databaseのサンプル・スキーマに含まれるHRのスキーマの存在を前提にしています。ですので、ADBにサンプル・スキーマをインストールする必要があります。まず、サンプル・スキーマのスクリプトを入手します。

サンプル・スキーマのスクリプトは、こちらにあります。

https://github.com/oracle/db-sample-schemas

インストール手順の詳細はGitHubのページを参照して頂くとして、ここでは実際に行なった作業について記載します。Computeインスタンスは作成直後の状態を想定しています。

Computeインスタンスにユーザーopcで接続し、GitHubからクローンします。最初にgitをインストールします。

[opc@rasstage ~]$ sudo yum install git

gitがインストールされます。サンプル・スキーマのインストール手順(2.1 Clone this repository)にあるように、gitコマンドを実行し、リポジトリをクローンします。

[opc@rasstage ~]$ cd $HOME

[opc@rasstage ~]$ git clone https://github.com/oracle/db-sample-schemas.git

Cloning into 'db-sample-schemas'...

remote: Enumerating objects: 37, done.

remote: Counting objects: 100% (37/37), done.

remote: Compressing objects: 100% (28/28), done.

remote: Total 556 (delta 11), reused 23 (delta 9), pack-reused 519

Receiving objects: 100% (556/556), 35.58 MiB | 4.55 MiB/s, done.

Resolving deltas: 100% (285/285), done.

[opc@rasstage ~]$ 

サンプル・スキーマを構成するスクリプトに含まれている固定のパスを、環境に合わせて更新します。(2.3 Change all embeded paths to match your working directory)

[opc@rasstage ~]$ cd db-sample-schemas/

[opc@rasstage db-sample-schemas]$ ls

CONTRIBUTING.md  bus_intelligence  info_exchange  mkunplug.sql   sales_history

LICENSE.md       customer_orders   mk_dir.sql     mkverify.sql   shipping

README.md        drop_sch.sql      mkplug.sql     order_entry

README.txt       human_resources   mksample.sql   product_media

[opc@rasstage db-sample-schemas]$ pwd

/home/opc/db-sample-schemas

[opc@rasstage db-sample-schemas]$ perl -p -i.bak -e 's#__SUB__CWD__#'$(pwd)'#g' *.sql */*.sql */*.dat 

[opc@rasstage db-sample-schemas]$

サンプル・スキーマを作成するスクリプトの入手については完了です。

sqlplusの入手

次にsqlplusが提供されているパッケージを探します。

[opc@rasstage db-sample-schemas]$ cd $HOME

[opc@rasstage ~]$ yum search sqlplus

読み込んだプラグイン:langpacks, ulninfo

============================= N/S matched: sqlplus =============================

oracle-instantclient12.2-sqlplus.x86_64 : SQL*Plus for Instant Client.

oracle-instantclient18.3-sqlplus.x86_64 : SQL*Plus for Instant Client.


  Name and summary matches only, use "search all" for everything.

[opc@rasstage ~]$ 

この記事を書いている時点では、oracle-instantclient18.3-sqlplus.x86_64がインストールできる最新のパッケージのようです。こちらをインストールします。

[opc@rasstage ~]$ sudo yum install oracle-instantclient18.3-sqlplus


oracle-instantclient18.3のsqlplusは/usr/lib/oracle/18.3/client64/bin以下に置かれていました。sqlplusで使用される共有ライブラリは/usr/lib/oracle/18.3/client64/lib以下に置かれていたので、sqlplusを起動するために環境変数PATHLD_LIBRARH_PATHの設定を行います。

[opc@rasstage ~]$ export PATH=/usr/lib/oracle/18.3/client64/bin:$PATH

[opc@rasstage ~]$ export LD_LIBRARY_PATH=/usr/lib/oracle/18.3/client64/lib

[opc@rasstage ~]$ sqlplus /nolog


SQL*Plus: Release 18.0.0.0.0 - Production on Thu Dec 3 02:55:25 2020

Version 18.3.0.0.0


Copyright (c) 1982, 2018, Oracle.  All rights reserved.


SQL> exit

[opc@rasstage ~]$ 


sqlplusの起動ができることを確認して、exitします。

ADBへの接続情報とウォレットの配置


Autonomous Databaseのサービス・コンソールから管理を開き、クライアント資格証明(ウォレット)のダウンロードを行います。


パスワードの入力を求められます。今回利用する範囲では、パスワードは使わないので思い出せないパスワードでも大丈夫です。パスワードを設定してダウンロードします。


ダウンロードしたウォレットは、wallet_データベース名.zipとなります。今回の作業では、wallet_APEXRAS.zipです。

ダウンロードしたウォレットをComputeインスタンスへアップロードします。ユーザーopcのホーム・ディレクトリに置くことにします。

アップロードしたウォレットを展開します。ウォレット名がwallet_APEXRAS.zipであることを前提として、以下のコマンドを実行します。ホーム・ディレクトリ以下にnetwork/adminディレクトリを作成し、そこにウォレットを展開します。

[opc@rasstage ~]$ cd $HOME

[opc@rasstage ~]$ ls

db-sample-schemas  wallet_APEXRAS.zip

[opc@rasstage ~]$ mkdir -p network/admin

[opc@rasstage ~]$ unzip -d network/admin wallet_APEXRAS.zip 

Archive:  wallet_APEXRAS.zip

  inflating: network/admin/README    

  inflating: network/admin/cwallet.sso  

  inflating: network/admin/tnsnames.ora  

  inflating: network/admin/truststore.jks  

  inflating: network/admin/ojdbc.properties  

  inflating: network/admin/sqlnet.ora  

  inflating: network/admin/ewallet.p12  

  inflating: network/admin/keystore.jks  

[opc@rasstage ~]$ 


展開したtnsnames.oraに、Autonomous Databaseへの接続情報が含まれています。リソースの使用はほとんどありませんし、Always FreeのインスタンスなのでLOWのサービスに繋ぎます。データベースへの接続に使用する接続文字列は、データベース名_low、今回はapexras_lowになります。

環境変数ORACLE_HOMEを$HOME、TWO_TASKをapexras_lowに設定し、sqlplusを使ってデータベースに接続します。接続ユーザーはadminを使います。パスワードはADBのインスタンスを作成する際に設定した管理パスワードを指定します。

[opc@rasstage ~]$ export ORACLE_HOME=$HOME

[opc@rasstage ~]$ export TWO_TASK=apexras_low

[opc@rasstage ~]$ sqlplus admin/**管理パスワード**


SQL*Plus: Release 18.0.0.0.0 - Production on Thu Dec 3 04:10:50 2020

Version 18.3.0.0.0


Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Last Successful login time: Thu Dec 03 2020 04:06:57 +00:00


Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.5.0.0.0


SQL> exit

Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.5.0.0.0

[opc@rasstage ~]$ 


sqlplusによるデータベースへの接続が確認できたので、サンプル・スキーマの作成を実施します。

サンプル・スキーマの作成


最初に作成済みの表領域を確認します。ユーザーadminでデータベースに接続し、次のselect文を実行します。

SQL> select tablespace_name, contents, status from dba_tablespaces;


TABLESPACE_NAME        CONTENTS      STATUS

------------------------------ --------------------- ---------

SYSTEM       PERMANENT     ONLINE

SYSAUX       PERMANENT     ONLINE

UNDOTBS1       UNDO     ONLINE

TEMP       TEMPORARY     ONLINE

DATA       PERMANENT     ONLINE

DBFS_DATA       PERMANENT     ONLINE

SAMPLESCHEMA       PERMANENT     READ ONLY

UNDO_2       UNDO     ONLINE


8 rows selected.


HRというスキーマを作成するのですが、そのHRのデフォルト表領域としては、上記よりDATA、一時表領域はTEMPが適切なようです。

HRスキーマを作成するスクリプトがあるディレクトリへ移動します。

[opc@rasstage ~]$ cd db-sample-schemas/human_resources/

[opc@rasstage human_resources]$ pwd

/home/opc/db-sample-schemas/human_resources

[opc@rasstage human_resources]$ 


実行するスクリプトはhr_main.sqlですが、スクリプト内でsysによる接続を行なっています。Autonomous Databaseはsysでは接続できないので、adminによる接続に変更します。

最初にバックアップを取っておきます。

[opc@rasstage human_resources]$ cp hr_main.sql hr_main.sql.sys


hr_mainに含まれる次の記述を

CONNECT sys/&pass_sys@&connect_string AS SYSDBA;


こちらに変更します。

CONNECT admin/&pass_sys@&connect_string


変更したスクリプトを保存します。

実行ログを保存するディレクトリを作成します。作成するディレクトリは、/home/opc/logsとします。

[opc@rasstage human_resources]$ mkdir $HOME/logs


その後にsqlplusを起動してhr_main.sqlを実行します。データベースにはユーザーadminで接続します。

[opc@rasstage human_resources]$ sqlplus admin/**管理パスワード** @hr_main.sql


SQL*Plus: Release 18.0.0.0.0 - Production on Thu Dec 3 04:47:36 2020

Version 18.3.0.0.0


Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Last Successful login time: Thu Dec 03 2020 04:43:07 +00:00


Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

Version 19.5.0.0.0



specify password for HR as parameter 1:

Enter value for 1: **HRのパスワード**


specify default tablespeace for HR as parameter 2:

Enter value for 2: DATA


specify temporary tablespace for HR as parameter 3:

Enter value for 3: TEMP


specify password for SYS as parameter 4:

Enter value for 4: **管理パスワード**


specify log path as parameter 5:

Enter value for 5: /home/opc/logs/


specify connect string as parameter 6:

Enter value for 6: apexras_low



User dropped.



User created.



User altered.



User altered.



Grant succeeded.


[中略]


PL/SQL procedure successfully completed.


SQL> 


第1引数は、スキーマHRに設定するパスワードです。データベースのユーザーなので、Autonomous Databaseでは複雑なものが要求されています。例えばよくある、hrといったパスワードは不可です。管理パスワードと同じ以下のルールに従って設定します。

パスワードは12文字から30文字とし、大文字、小文字および数字をそれぞれ1つ以上含める必要があります。パスワードに二重引用符(")文字またはユーザー名 (大文字と小文字を区別しない)を含めることはできません。

第2引数のデフォルト表領域はDATA第3引数の一時表領域はTEMP第4引数はSYSのパスワードとなっていますが、スクリプトはadminを使用するように書き換えているので、ユーザーadminのパスワードを指定します。第5引数ログを出力するディレクトリ、最後の第6引数接続文字列を指定します。

与える引数が適切であれば、スクリプトはエラーなく終了します。スクリプトによって作成された表を確認してみます。

SQL> select table_name from all_tables where owner = 'HR';


TABLE_NAME

--------------------------------------------------------------------

COUNTRIES

LOCATIONS

DEPARTMENTS

JOBS

EMPLOYEES

JOB_HISTORY

REGIONS


7 rows selected.


SQL> exit


7つの表が作成されているはずです。

同じディレクトリに存在するhr_drop.sqlをユーザーadminで実行すると、スキーマHRを含む、すべてのデータが削除されます。サンプル・スキーマの作成を再度行う必要がある場合などでは、こちらの削除スクリプトを事前に実行するのが良いでしょう。

Real Application Securityの設定


HRのサンプル・スキーマがインストールできたので、RASの設定に入ります。RASのデモで使う設定はhrdemo_setup.sqlによって行われます。マニュアルに載っているままではエラーが発生するので、ところどころ修正が必要です。

改変したhrdemo_setup.sqlこちらからダウンロードできます。Autonomous Databaseを対象に実行するため、スクリプトの実行に必要なパラメータを増やしています。

[opc@rasstage ~]$ sqlplus -s /nolog @ hrdemo_setup.sql

specify password for ADMIN as parameter 1:

Enter value for 1: **管理パスワード**


specify password for HR as parameter 2:

Enter value for 2: **HRに設定したパスワード**


specify password for daustin, smavirus and dispatcher as parameter 3:

Enter value for 3: **RASのプリンシパルに設定するパスワード**


specify connect string as parameter 4:

Enter value for 4: apexras_low



PL/SQL procedure successfully completed.



PL/SQL procedure successfully completed.


[中略]


PL/SQL procedure successfully completed.


[opc@rasstage ~]$


行なっている処理はマニュアルに説明があるので、そちらを参照して頂くとして、改変した部分は以下になります。

  1. SYSによる接続はすべてADMINに変更。AS SYSDBAは削除。
  2. HRのパスワードがhrと決め打ちになっていたのを、パラメータに変更。
  3. 接続文字列の指定がないので、CONNECT文での接続時に必ず接続文字列を指定。
  4. 元のスクリプトでsmavrisにXSCONNECTのロールを割り当てる部分がdaustinになっているので(元のスクリプトの記載ミス)、これをsmavrisへ変更。
  5. RASのプリンシパルのパスワードがwelcome1で決め打ちになっていたのを、パラメータで指定するように変更。
  6. hr_session、hr_commonのパスワードとしてwelcome1が決め打ちになっていたのを、HRのパスワードを使うように変更。
  7. sys.xs_admin_util.grant_system_privilegeの呼び出しをsys.xs_admin_cloud_util.grant_system_privilegeへ変更(Autonomous Databaseで必須の作業)
RASのプリンシパルに設定するパスワードは、データベースのスキーマのパスワードと同様に、パスワード・ポリシーを考慮する必要があります。

同様にhrdemo.sqlhrdemo_session.sqlhrdemo_clean.sqlについても、HRやRASにプリンシパルの決め打ちパスワードのパラメータ化や、接続文字列の指定についての対応をしています。

RASの設定ができたので、hrdemo.sqlを動かしてみます。以下のような結果が得られます。今回のhrdemo_setup.sqlの変更では、daustinとsmavrisには同じパスワードが設定されるようになっているので、ここの入力は同じ値になります。また、接続文字列はそれぞれの環境で異なるでしょう。

[opc@rasstage ~]$ sqlplus -s /nolog @ hrdemo.sql

specify password for daustin as parameter 1:

Enter value for 1: **daustinのパスワード**


specify password for smavris as parameter 2:

Enter value for 2: **smavrisのパスワード**


specify connect string as parameter 3:

Enter value for 3: apexras_low



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

AHUNOLD    Alexander       Hunold                     60        102 *******

BERNST     Bruce           Ernst                      60        103 *******

DAUSTIN    David           Austin                     60        103    4800

DLORENTZ   Diana           Lorentz                    60        103 *******

VPATABAL   Valli           Pataballa                  60        103 *******


5 rows selected.



0 rows updated.



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

DAUSTIN    David           Austin                     60        103    4800


1 row selected.



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

SMAVRIS    Susan           Mavris                     40        101    6500

AHUNOLD    Alexander       Hunold                     60        102    9000

BERNST     Bruce           Ernst                      60        103    6000

DAUSTIN    David           Austin                     60        103    4800

DLORENTZ   Diana           Lorentz                    60        103    4200

VPATABAL   Valli           Pataballa                  60        103    4800


6 rows selected.



  COUNT(*)

----------

       107


1 row selected.



1 row updated.



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

DAUSTIN    David           Austin                     60        102    4800


1 row selected.



1 row updated.


[opc@rasstage ~]$ 


hrdemo_session.sqlを実行してみます。hr_sessionのパスワードは、スキーマHRに設定したパスワードです。


[opc@rasstage ~]$ 
sqlplus -s /nolog @ hrdemo_session.sql 

specify password for hr_session (HR) as parameter 1:

Enter value for 1: **HRのパスワード**


specify connect string as parameter 2:

Enter value for 2: apexras_low



PL/SQL procedure successfully completed.



XS_SYS_CONTEXT('XS$SESSION','USERNAME')

--------------------------------------------------------------------------------

SMAVRIS


1 row selected.



ROLE_NAME

--------------------------------------------------------------------------------

DB_EMP

EMPLOYEE

HR_REPRESENTATIVE

XSCONNECT

XSPUBLIC

XS_CONNECT


6 rows selected.



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

SMAVRIS    Susan           Mavris                     40        101    6500

AHUNOLD    Alexander       Hunold                     60        102    9000

BERNST     Bruce           Ernst                      60        103    6000

DAUSTIN    David           Austin                     60        103    4800

DLORENTZ   Diana           Lorentz                    60        103    4200

VPATABAL   Valli           Pataballa                  60        103    4800


6 rows selected.



  COUNT(*)

----------

       107


1 row selected.



PL/SQL procedure successfully completed.



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

SMAVRIS    Susan           Mavris                     40        101    6500


1 row selected.



PL/SQL procedure successfully completed.



EMAIL      FIRST_NAME      LAST_NAME       DEPARTMENT_ID MANAGER_ID  SALARY

---------- --------------- --------------- ------------- ---------- -------

SMAVRIS    Susan           Mavris                     40        101    6500

AHUNOLD    Alexander       Hunold                     60        102    9000

BERNST     Bruce           Ernst                      60        103    6000

DAUSTIN    David           Austin                     60        103    4800

DLORENTZ   Diana           Lorentz                    60        103    4200

VPATABAL   Valli           Pataballa                  60        103    4800


6 rows selected.



  COUNT(*)

----------

       107


1 row selected.



PL/SQL procedure successfully completed.


[opc@rasstage ~]$


RASの設定が完了したので、今度はこれをOracle APEXから使用します。

APEXアプリケーションの作成


RASのHRデモで使用されるのは表EMPLOYEESなので、この表を扱う対話モード・レポートとフォームを含むアプリケーションを作成します。

最初にスキーマHRに含まれる表EMPLOYEESのSELECT権限をワークスペースのユーザーRASDEVに与えます。ユーザーADMINでデータベースに接続し、GRANT文を実行します。

SQL> grant select on hr.employees to rasdev;


Grant succeeded.


SQL> 


何も指定しない空っぽのアプリケーションの作成をします。名前RAS Sampleとします。


アプリケーションが作成できたら、対話モード・レポートのページを追加します。ページの作成を開始します。

フォームをクリックします。


フォーム付きレポートをクリックします。


レポート・タイプとして対話モード・レポートレポート・ページ名従業員一覧フォーム・ページ名従業員編集フォーム・ページ・モードモーダル・ダイアログを指定して、に進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選択し、に進みます。


データ・ソースとして、ソース・タイプSQL問合せSQLとしては

select * from hr.employees

を指定し、に進みます。


主キー列としてEMPLOYEE_IDを選択し、次に進みます。


これでページは完成なので、ページの実行を行います。サインインには、アプリケーション・ビルダーにサインインする際に利用した開発者アカウントRASDEVを使います。


実行したページでは何も表示されません。データを表示するには、セッションにRASのアプリケーション・ユーザーをアタッチする必要があります。


HRデモのセットアップでdaustinとsmavrisのアプリケーション・ユーザーが作成されています。これと同名のユーザーをワークスペースに登録します。右上の管理アイコンをクリックし表示されるメニューより、ユーザーとグループの管理を呼び出します。


ユーザーの作成を実行します。


ユーザー名電子メール・アドレス、それと、パスワードを設定します。ワークスペース管理ユーザーや開発者ユーザーの権限は与えないようにします。RASのアプリケーション・ユーザーはそれ自体パスワードの設定はありますが、Oracle APEXのアプリケーションにサインインするときは、RASのパスワードではなく、ここで設定するワークスペースのユーザーのパスワードを使います。ユーザーの作成をクリックして、作成を完了します。


daustinsmavrisの2名分の作成を行います。


作成されたユーザーはエンド・ユーザーになります。

次に、作成したアプリケーションRAS Sampleの共有コンポーネント認証スキームを開きます。デフォルトのApplication Expressアカウントが、現在(カレント)の認証スキームとして登録されています。それを編集するために開きます。


認証スキームのReal Application Securityのセクションに含まれるRASモードを無効から内部ユーザーに切り替え、変更を適用します。


内部ユーザー以外に外部ユーザーという設定があります。これはOracle APEX側でユーザーを持っていない外部認証サーバーを使う認証(例えばOAuth2による認証など)で使用します。

これでAPEXのアプリケーションにサインインしたときに、同名のアプリケーション・ユーザーがセッションにアタッチされます。

APEXアプリケーションによる保護の確認


アプリケーションRAS Sampleを実行し、daustinで対話モード・レポートを開くと以下の結果になります。


daustinにはRASのit_engineerロールが割当たっていて、そのロールではdepartment_id = 60の行のみ参照可能という制限がかけられているためです。また、自分自身のSalaryのみ参照できています。これもRASによる制限です。

daustinでサインインしている状態で、自分自身のマネージャーを103から102へ変更してみます。


編集フォームでManager Id103から102へ変更し、変更の適用をクリックします。


エラーが発生することはないので、更新がされたように見えますが、対話モード・レポートをみると値の更新は行われていません。


これもRASのポリシーで許可されていないためです。

daustinからサインアウトし、smavrisでサインインし、対話モード・レポートを開きます。


smavrisにはRASのhr_representativeロールが割当たっていて、全107ユーザーすべての情報を参照することができています。また、データの変更も可能です。先ほどと同様、daustinのManager Idを103から102へ変更してみます。


きちんと変更されることが確認できます。

HRのサンプル・スキーマの問題ですが、繰り返しデータを変更しようとすると、変更履歴の保存でエラーが発生します。

1つのエラーが発生しました

  • ORA-00001: 一意制約(HR.JHIST_EMP_ID_ST_DATE_PK)に反しています

このエラーは履歴を書き込むトリガーを無効化することで、回避できます。ADMINユーザーでデータベースに接続し、以下のコマンドを実行します。

SQL> alter trigger hr.update_job_history disable;


以上で、Autonomous DatabaseのAPEXでReal Application SecurityのHRデモを動作させることができました。

Real Application Securityについて、どういったものか評価しようにも情報が少なくて、なかなか手を付けられない、というのが実際のところかと思います。Real Application Securityは使いこなすことができれば、データ・セキュリティが大幅に強化される(アプリケーション側でどのような不具合があっても、認証されたエンドユーザーの権限を超えたデータベース操作は行えない)ので、学習する価値のある機能です。

パーシング・スキーマの追加


今回の例ではRASDEVというワークスペースからHRというスキーマの表EMPLOYEESにアクセスしています。そして、表EMPLOYEESを参照する場合はつねにHR.とスキーマの参照を付けています。スキーマHRに含まれるオブジェクトのみを扱うアプリケーションであれば、これは面倒ですし、ソースに表やビューを指定することもできません。

これは、ワークスペースRASDEVにパーシング・スキーマとしてHRを追加した後、アプリケーションのデフォルト・パーシング・スキーマをHRに変更することで対応できます。

最初にパーシング・スキーマにHRを追加します。APEXの管理サービスを呼び出します。


管理にサインインします。Autonomous Databaseでは管理サービスのパスワードは、ユーザーADMINのパスワードになります。


ワークスペースの管理を開きます。


ワークスペース・アクションワークスペースとスキーマの割当ての管理を開きます。


スキーマの追加を実行します。


既存のスキーマHRを追加するので、スキーマ既存を選びます。に進みます。


パーシング・スキーマ(今回はHR)を紐づけるワークスペースを選択します。今回の例ではRASDEVです。に進みます。


パーシング・スキーマとして紐づけるスキーマを選択します。今回の例ではHRです。に進みます。


確認画面が表示されるので、確認してスキーマの追加をクリックします。


ワークスペースRASDEVへ、スキーマHRをパーシング・スキーマとして紐付けることができました。


管理サービスでの作業が完了しました。

パーシング・スキーマの紐付けができていれば、共有コンポーネントアプリケーション定義属性(またはアプリケーション・プロパティの編集)のセキュリティに含まれるデータベース・セッション解析対象スキーマ(パーシング・スキーマ)として、追加したスキーマ(今回はHR)が選択できるようになります。

HRを選択して変更の適用を実行すると、このアプリケーションが操作するオブジェクトでスキーマが指定されていないものは、HRスキーマのオブジェクトと認識されるようになります。


外部ユーザーについて

今回は、認証スキームのReal Application SecurityのRASモードを内部ユーザーとしています。これは内部的には、DBMS_XS_SESSION.ASSIGN_USERファンクションのis_externalにFALSEを渡しています。RASモードを外部ユーザーに設定すると、is_externalがTRUEになります。

また、動的ロールおよびネームスペースはそれぞれ、enable_dynamic_roles、disable_dynamic_roles、namespacesに対応します。

外部認証を使い多数のユーザーが存在する場合、それぞれ対応するアプリケーション・ユーザーをsys.xs_principal.create_userプロシージャにて作成するのは現実的ではないので、外部ユーザーと動的ロールの使用を検討することになるでしょう。