※ 本記事は、Leona Dsouzaによる”How to Integrate Oracle Real Application Security with APEX on Oracle Autonomous database“を翻訳したものです。
2022年9月29日
Oracle Real Application Security(RAS)とは:
Oracle Real Application Security(RAS)は、業界で最も高度なテクノロジであり、アプリケーション・セキュリティ要件をサポートしています。これはOracle Virtual Private Database(VPD)に似ていますが、より強力でメンテナンスが容易です。データベース内のアプリケーション・アクセス制御フレームワークにより、3層および2層アプリケーションがセキュリティ要件を宣言的に定義、プロビジョニングおよび強制できます。Oracle RASでは、データベース内のアプリケーションレベルのユーザー、権限およびロールを認識し、ビジネス・オブジェクトを表すレコードの静的コレクションおよび動的コレクションへのアクセスを制御するポリシーベースの認可モデルが導入されています。
Oracle RASとOracle APEXの即時利用可能な統合により、アプリケーション・データを保護するためのカスタム開発が不要になり、エンドツーエンドのアプリケーション・セキュリティが提供されます。
Oracle RASを使用した複数層アプリケーションでのセキュリティの適用:

ユースケース:
アプリケーション・ユーザー”blake”および”king”を制限して、”hr”スキーマの下の”emp”表で部門ID 10および20に属する行のみにアクセスするとします。また、このユースケースでは、APEXを介してデータにアクセスしています。
ユースケースを実現するための大まかなステップ:
- DBロールを作成し、DBロールを保護する表に対する権限を付与します。
- RAS管理ユーザーを作成し、権限をRAS管理ユーザーに割り当てます。
- アプリケーション・ロールを作成し、そのアプリケーション・ロールにDBロールを付与します。
- アプリケーション・ユーザーを作成し、アプリケーション・ユーザーにアプリケーション・ロールを付与します。
- 管理者ユーザーとしてログインして、APEXのインスタンス・レベルでRASを有効にします。
- APEXワークスペースにログインして、各アプリケーションでRASを有効にします。
- 必要に応じてセキュリティ・クラスを作成します。
- ACLを作成し、アプリケーション・ロールをACLに関連付けます。
- データ・セキュリティ・ポリシーを作成します。
- データ・セキュリティ・ポリシーを表に適用します。
- APEXを介してアプリケーション・ユーザーとして表にアクセスします。
この例で使用される名前は次のとおりです。:
Database schema : HR
DB Table : EMP
RAS admin user : RASADM
Database Role : DB_EMP
Application Roles : DEPT10 & DEPT20
Application Users : BLAKE & KING
1. データベースADMINユーザーとして自律型データベースにログインしてDBロールを作成し、保護する表に対する権限をDBロールに付与します。
データベース・ロールDB_EMPを作成し、このロールに必要な表権限を付与します。
create role db_emp;
grant insert,update,delete,select on hr.emp to db_emp;
- RAS管理ユーザーRASADMを作成し、権限をRAS管理ユーザーに割り当てます。
create user rasadm;
password rasadm; --enter the password for RASADM
grant CREATE SESSION to rasadm;
ステップ1で作成したDBロールをRAS管理ユーザーに付与します。
grant db_emp to rasadm with admin option;
Real Application Securityは、Autonomous DatabaseとオンプレミスのOracle Databaseで同じように動作しますが、Autonomous DatabaseでReal Application Securityを使用する前に次のADMINタスクを実行する必要があります。:
Real Application Securityのユーザー/ロールを作成するには、PROVISIONシステム権限が必要です。
ADMINユーザーとして次のコマンドを実行し、この権限をデータベース・ユーザーに付与します。:
EXEC XS_ADMIN_CLOUD_UTIL.GRANT_SYSTEM_PRIVILEGE('PROVISION','RASADM');
Real Application Securityデータ・コントロールを作成するには、ADMIN_ANY_SEC_POLICY権限が必要です。
ADMINユーザーとして次のコマンドを実行して、この権限を付与します。:
EXEC XS_ADMIN_CLOUD_UTIL.GRANT_SYSTEM_PRIVILEGE('ADMIN_ANY_SEC_POLICY','RASADM');
- この例(RASADM)のRAS管理者ユーザーとしてデータベースにログインしてアプリケーション・ロールを作成し、アプリケーション・ロールにDBロールを付与します。
アプリケーション・ロールの作成:
exec sys.xs_principal.create_role(name => 'dept10', enabled => true);
exec sys.xs_principal.create_role(name => 'dept20', enabled => true);
アプリケーション・ロールへのDBロールの付与:
grant db_emp to dept10;
grant db_emp to dept20;
- アプリケーション・ユーザーを作成し、アプリケーション・ユーザーにアプリケーション・ロールを付与します。
アプリケーション・ユーザー”blake”を作成し、アプリケーション・ロール”dept10″をblakeに付与します。:
exec sys.xs_principal.create_user(name => 'blake', schema => 'hr');
exec sys.xs_principal.set_password('blake', '<PASSWORD>');
exec sys.xs_principal.grant_roles('blake', 'XSCONNECT');
exec sys.xs_principal.grant_roles('blake', 'dept10');
アプリケーション・ユーザー”king”を作成し、アプリケーション・ロール”dept20″をKingに付与します。:
exec sys.xs_principal.create_user(name => 'king', schema => 'hr');
exec sys.xs_principal.set_password('king', '<PASSWORD>');
exec sys.xs_principal.grant_roles('king', 'XSCONNECT');
exec sys.xs_principal.grant_roles('king', 'dept20');
- 管理ユーザーとしてログインして、まずAPEXのインスタンス・レベルでRASを有効にします。
ADMINユーザーとしてAPEXにログインします。

「Manage Instance」をクリックします。

「Security」をクリックします。

「Real Application Security」をクリックし、「Allow Real Application Security」オプションが「Yes」に設定されていることを確認します。デフォルトでは、このオプションは自律型データベースで「Yes」に設定されます。

- APEXワークスペースにログインしてアプリケーションのRASを有効にします。この例では、APEXのHRワークスペースにログインしています。

「App Builder」をクリックします。

RASを有効にするアプリケーションをクリックします。

「Shared Components」をクリックします。

「Authentication Schemes」をクリックします。

デフォルトのスキーム(Oracle APEX accounts)を選択します。

「Real Application Security」をクリックします。

要件に基づいて「Internal Users」または「External Users」を選択して、RASモードを有効にします。この例では、「Internal Users」を選択し、「Apply Changes」をクリックします。

- 必要に応じてセキュリティ・クラスを作成します。
列または行データを特定のユーザーにマスクする必要がある場合は、セキュリティ・クラスを使用して同じことを実現できます。このユースケースでは範囲外であるため、セキュリティ・クラスの作成をスキップしています。
- ACLを作成し、アプリケーション・ロール(dept10およびdept20)をACLに関連付けます。
ACLの作成:
declare
aces xs$ace_list := xs$ace_list();
begin
aces.extend(1);
-- DEPT10_ACL: This ACL grants dept10(application role) the privilege to view and update all
-- employees records in hr.emp table.
aces(1):= xs$ace_type(privilege_list => xs$name_list('select', 'insert',
'update', 'delete'),
principal_name => 'dept10');
sys.xs_acl.create_acl(name => 'dept10_acl',
ace_list => aces);
end;
/
declare
aces xs$ace_list := xs$ace_list();
begin
aces.extend(1);
-- DEPT20_ACL: This ACL grants dept20(application role) the privilege to view and update all
-- employees record in hr.emp table.
aces(1):= xs$ace_type(privilege_list => xs$name_list('select', 'insert',
'update', 'delete'),
principal_name => 'dept20');
sys.xs_acl.create_acl(name => 'dept20_acl',
ace_list => aces);
end;
/
- データ・セキュリティ・ポリシー”emp_ds”を作成します。
declare
realms xs$realm_constraint_list := xs$realm_constraint_list();
begin
realms.extend(1);
-- Realm #1: Only the department number10
-- blake can view the realm with deptno 10.
realms(1) := xs$realm_constraint_type(
realm => 'deptno = 10',
acl_list => xs$name_list('dept10_acl'));
sys.xs_data_security.create_policy(
name => 'emp_ds',
realm_constraint_list => realms);
end;
/
- データ・セキュリティ・ポリシーを表に適用します。
begin
sys.xs_data_security.apply_object_policy(
policy => 'emp_ds',
schema => 'hr',
object =>'emp');
end;
/
次のコマンドを使用して、同じデータ・セキュリティ・ポリシーにさらにレルムを追加できます:
これにより、deptno 20でレルムを表示できるようになります。
DECLARE
realm_cons XS$REALM_CONSTRAINT_TYPE;
BEGIN
realm_cons :=
XS$REALM_CONSTRAINT_TYPE(realm=> 'deptno = 20',
acl_list=> XS$NAME_LIST('dept20_acl'));
SYS.XS_DATA_SECURITY.APPEND_REALM_CONSTRAINTS( policy=>'emp_ds',
realm_constraint=>realm_cons);
END;
- ここで、APEXを介してアプリケーション・ユーザーとして表にアクセスします。次のステップに従って同じことを実現しました。
ワークスペースにログインします。

「Administration」をクリックし、「Manage Users and Groups」を選択します。

「Create User」をクリックします。ステップ4で作成したのと同じアプリケーション・ユーザーを作成します。

必須の詳細(ユーザー名、電子メール・アドレスおよびパスワード)を指定し、「Create User」をクリックします。このステップを繰り返してすべてのアプリケーション・ユーザーを作成します。この例では、ユーザー「blake」と「king」を作成しています。

次に、APEXでアプリケーション・ロールを作成します。ステップ3で作成したものと同じアプリケーション・ロールを作成します。
この場合は、app-builderをクリックし、アプリケーションを選択して「Shared Components」をクリックします。

「Application Access Control」をクリックします。

「Add Role」をクリックします。

ロール名および説明(オプション)を指定し、「Create Role」をクリックします。このステップを繰り返して、すべてのアプリケーション・ロールを作成します。
この例では、アプリケーション・ロールdept10およびdept20を作成しています。

同じウィンドウで下にスクロールし、「Add User Role Assignment」をクリックします。これにより、前に作成したアプリケーション・ロールがアプリケーション・ユーザーに関連付けられます。

アプリケーション・ユーザー名を指定し、ユーザーに割り当てるアプリケーション・ロールを確認、「Create Assignment」をクリックします。

次に示すようにロールおよび割当を表示できます。

アプリケーションのユーザー名とパスワードを指定してアプリケーションを実行します。
この例では、「blake」ユーザーとしてログインしています。

表をクリックします。

ユーザーが表示できる行のみが表示されます。
この例では、アプリケーション・ユーザーblakeは、部門番号10に属する行のみを表示できます。

まとめ:
すべてのユースケースが異なります。Oracle Cloud Infrastructureが適切かどうかを知る唯一の方法は、それを試すことです。Oracle Cloud Free Tierまたは30日間の無料トライアルを選択できます。これには、コンピュート、ストレージ、ネットワーキングなど、幅広いサービスから開始するための300ドルのクレジットが含まれます。
詳細は、次のリソースを参照してください。:
https://docs.oracle.com/cd/E57425_01/121/DBFSG/intro.htm#DBFSG10000
