今回はOracle Databaseの特権ユーザに対するアクセス制限など、セキュリティ機能を強化できるオプション機能である、Oracle Database Vaultの構成方法について調べてみました。
1. Oracle Database Vaultとは
Oracle Database Vaultは、セキュリティ機能を強化できるOracle Database Enterprise Editionのオプション機能です。主な強化ポイントは、特権ユーザに対してもテーブル格納データへのアクセス制限ができる点や、データベースに対して操作を行うSQLの制限ができる点などがあります。もう少しDatabase Vaultの概要を知りたい方は、以下の資料をご参照ください。
2. Database Vaultを使用するための初期作業について
まずDatabase Vaultを使用するために必要な初期作業手順について紹介します。今回はOracle AI Database 26ai(23.6.1)を用いた、シングルインスタンスなシングルテナント(CDB+1PDB)構成上で、Database Vaultを使用するための初期作業手順を紹介します。
2.1 管理ユーザの作成
Database Vaultを構成・管理するにあたって、下記2つの共通ユーザをCDBで作成する必要があります。
- Database Vault所有(管理)ユーザ → ここではc##dvownerとします
- アカウント管理ユーザ → ここではc##acctmgrとします
共通ユーザはCDBへSYSDBA権限へ接続した後に、ユーザの作成とそのユーザがCDBおよびPDBへの接続に必要な権限付与を、以下の様に実施します。
-- CDBへSYSDBA権限で接続 oracle$ sqlplus /nolog SQL> conn / as sysdba 接続されました。 -- Database Vault所有ユーザの作成と接続権限の付与 SQL> CREATE USER c##dvowner IDENTIFIED BY password; ユーザーが作成されました。 SQL> GRANT CREATE SESSION, SET CONTAINER TO c##dvowner CONTAINER = ALL; 権限付与が成功しました。 -- アカウント管理ユーザの作成と接続権限の付与 SQL> CREATE USER c##dvacctmgr IDENTIFIED BY password; ユーザーが作成されました。 SQL> GRANT CREATE SESSION, SET CONTAINER TO c##dvacctmgr CONTAINER = ALL; 権限付与が成功しました。
2.2 CDBでのDatabase Vaultの構成
ユーザの作成が終わったら、CDB上でDatabase Vaultを構成するプロシージャを、以下の様に実行します。プロシージャを実行すると、Database Vault用の2つの共通ユーザにそれぞれ権限が付与されます。
SQL> BEGIN
2 CONFIGURE_DV(
3 dvowner_uname => 'c##dvowner',
4 dvacctmgr_uname => 'c##dvacctmgr',
5 force_local_dvowner => FALSE);
6 END;
7 /
PL/SQLプロシージャが正常に完了しました。
-- ユーザに付与された権限の確認
SQL> SELECT grantee, granted_role, admin_option, common
2 FROM dba_role_privs
3 WHERE granted_role IN ('DV_ACCTMGR', 'DV_OWNER')
4 ORDER BY 1, 2, 3;
GRANTEE GRANTED_ROLE ADM COM
------------------------- ------------------------- --- ---
C##DVACCTMGR DV_ACCTMGR YES YES
C##DVOWNER DV_OWNER YES YES
2.3 CDBでのDatabase Vaultの有効化
Database Vaultを構成した後は、Database Vaultを有効にする必要があります。これを実施するためには、以下の様にDatabase Vaultの所有ユーザでCDBへ接続し、有効化するプロシージャを実行する必要があります。
SQL> conn c##dvowner/xxxxxxx 接続されました。 SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> EXEC DBMS_MACADM.ENABLE_DV; PL/SQLプロシージャが正常に完了しました。
プロシージャを実行した後は、データベースの再起動が必要となります。
-- データベースの再起動 SQL> conn / as sysdba 接続されました。 SQL> shutdown immediate SQL> startup
Database Vaultが有効になっているかは、dba_dv_statusディクショナリから確認できます。有効化されていると、以下の様に出力されます。
SQL> SELECT * FROM dba_dv_status; NAME STATUS ------------------- -------------- DV_CONFIGURE_STATUS TRUE DV_ENABLE_STATUS TRUE DV_APP_PROTECTION NOT CONFIGURED
2.4 PDBでのDatabase Vaultの構成
Database Vaultの構成は、PDB(ここではorclpdb)に対しても実施する必要があります。構成する際に実行するプロシージャは、CDBに対して実施したものと同じものを使用します。
-- PDBへの接続 SQL> conn / as sysdba 接続されました。 SQL> ALTER SESSION SET CONTAINER = orclpdb; セッションが変更されました。 SQL> show con_name CON_NAME ------------------------------ ORCLPDB -- Database Vaultの構成 SQL> BEGIN 2 CONFIGURE_DV( 3 dvowner_uname => 'c##dvowner', 4 dvacctmgr_uname => 'c##dvacctmgr'); 5 END; 6 / PL/SQLプロシージャが正常に完了しました。
2.5 PDBでのDatabase Vaultの有効化
Database Vaultの有効化もPDBに対して実行が必要です。CDBのときと同様に、Database Vaultの所有ユーザでPDBへ接続して行います。
SQL> conn c##dvowner/xxxxxxx@orclpdb 接続されました。 SQL> show con_name CON_NAME ------------------------------ ORCLPDB SQL> EXEC DBMS_MACADM.ENABLE_DV; PL/SQLプロシージャが正常に完了しました。
PDBに対してDatabase Vaultの有効化を実行した場合は、データベース全体ではなく、有効化したPDBを再起動する必要があります。cdb_dv_statusディクショナリビューを使用すると、CDBとPDB合わせてDatabase Vaultの有効化状態を確認することができます。
-- PDBの再起動 SQL> conn / as sysdba 接続されました。 SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> ALTER PLUGGABLE DATABASE orclpdb CLOSE IMMEDIATE; プラガブル・データベースが変更されました。 SQL> ALTER PLUGGABLE DATABASE orclpdb OPEN; プラガブル・データベースが変更されました。 -- Database Vaultの有効化状態確認 SQL> SELECT CON_ID_TO_CON_NAME(con_id) con_name, name, status FROM cdb_dv_status; CON_NAME NAME STATUS ---------- ------------------- -------------- CDB$ROOT DV_CONFIGURE_STATUS TRUE CDB$ROOT DV_ENABLE_STATUS TRUE CDB$ROOT DV_APP_PROTECTION NOT CONFIGURED ORCLPDB DV_CONFIGURE_STATUS TRUE ORCLPDB DV_ENABLE_STATUS TRUE ORCLPDB DV_APP_PROTECTION NOT CONFIGURED
なお、Database Vaultを有効化すると、下記の様に新しいデータベースユーザの作成をSYSユーザなどではできなくなり、アカウント管理ユーザ(c##dvacctmgr)で実施する必要がある点にご注意ください。
SQL> show user ユーザーは"SYS"です。 SQL> CREATE USER test2 IDENTIFIED BY xxxxxxxx; CREATE USER test2 IDENTIFIED BY xxxxxxxx * 行1でエラーが発生しました。: ORA-01031: 権限が不足しています ヘルプ: https://docs.oracle.com/error-help/db/ora-01031/
3.Database Vaultによる各種制限の構成
冒頭部で、Database Vaultによる主な強化される部分として、特権ユーザに対してもテーブル格納データへのアクセス制限ができる点や、データベースに対して操作を行うSQLの制限ができる点などがあります。
特権ユーザからのアクセス制限は、Database Vaultのレルムを構成することで、各種操作の制限はDatabase Vaultのコマンドルールを構成することで実現できるため、それぞれの構成方法を紹介していきます。
3.1 レルムの構成
レルムの構成設定は、以下の作業ステップで行うことができます。各作業でレルムを構成するために幾つかのPL/SQLプロシージャを使用しますが、ここでは最小限のオプション指定で作成する例を紹介しますので、各PL/SQLプロシージャはマニュアルをご参照ください。
- レルムの作成
- レルムへの保護対象オブジェクトの登録
- レルムへのアクセス許可ユーザの登録
- (参考)レルムによる制限確認
3.1.1 レルムの作成
レルムの構成作業は、Database Vault所有者で作成対象PDBに接続して行います。レルムの作成には、DBMS_MACADM.CREATE_REALMプロシージャを下記の様に使用します。レルム名は大文字小文字が区別されるので、指定の際はご注意ください。
なお、作成したレルムは、dba_dv_realmディクショナリビューで確認することができます。
-- Database Vault所有者で作成対象PDBに接続 SQL> conn c##dvowner/xxxxxxxx@orclpdb 接続されました。 -- レルムの作成 SQL> BEGIN 2 DBMS_MACADM.CREATE_REALM( 3 realm_name => 'rlm01', 4 description => 'Realm for test', 5 enabled => DBMS_MACUTL.G_YES 6 ); 7 END; 8 / PL/SQLプロシージャが正常に完了しました。 -- レルムの確認 SQL> SELECT name, description, enabled FROM dba_dv_realm WHERE name LIKE 'rlm%' ORDER BY 1; NAME DESCRIPTION E ---------- ------------------------------ - rlm01 Realm for test Y
3.1.2 レルムへの保護対象オブジェクトの登録
レルムで保護したいオブジェクトの登録は、DBMS_MACADM.ADD_OBJECT_TO_REALMプロシージャを使用します。以下はTESTユーザが所有する全オブジェクトをレルムの保護対象とする実行例となります。
登録する際はオブジェクト名(object_name)やテーブルやインデックスといったオブジェクトタイプ(object_type)を指定する必要がありますが、ワイルドカードの指定ができるので、全てを指定したい場合はこれらの引数に「%」を指定します。
レルムに対するオブジェクトの登録状況は、dba_dv_realm_objectディクショナリビューで確認することができます。
-- レルムへのオブジェクト登録 SQL> BEGIN 2 DBMS_MACADM.ADD_OBJECT_TO_REALM( 3 realm_name => 'rlm01', 4 object_owner => 'TEST', 5 object_name => '%', 6 object_type =>'%' 7 ); 8 END; 9 / PL/SQLプロシージャが正常に完了しました。 -- オブジェクトの登録状況の確認 SQL> SELECT realm_name, owner, object_name, object_type 2 FROM dba_dv_realm_object WHERE realm_name LIKE 'rlm%' ORDER BY 1,2; REALM_NAME OWNER OBJECT_NAME OBJECT_TYPE ---------- ---------- ------------------------------ -------------------------------- rlm01 TEST % %
3.1.3 レルムへのアクセス許可ユーザの登録
レルムへのアクセス許可ユーザの登録は、DBMS_MACADM.ADD_AUTH_TO_REALMプロシージャを使用します。ユーザの代わりにロールを追加することも可能です。追加したいユーザをgrantee引数に指定しますが、複数ユーザを追加したい場合は、複数回プロシージャを実行します。以下は2つのユーザ(TESTとTEST2)を追加する実行例となります。
レルムに対するアクセス許可ユーザ(ロール)の登録状況は、dba_dv_realm_authディクショナリビューで確認することができます。
-- レルムへの許可ユーザ登録 SQL> BEGIN 2 DBMS_MACADM.ADD_AUTH_TO_REALM( 3 realm_name => 'rlm01', 4 grantee => 'TEST' 5 ); 6 END; 7 / PL/SQLプロシージャが正常に完了しました。 SQL> BEGIN 2 DBMS_MACADM.ADD_AUTH_TO_REALM( 3 realm_name => 'rlm01', 4 grantee => 'TEST2' 5 ); 6 END; 7 / PL/SQLプロシージャが正常に完了しました。 -- 許可ユーザの登録状況の確認 SQL> SELECT realm_name, grantee FROM dba_dv_realm_auth 2 WHERE realm_name LIKE 'rlm%' ORDER BY 1,2; REALM_NAME GRANTEE ---------- ---------- rlm01 TEST rlm01 TEST2
3.1.4 (参考)レルムによる制限確認
今回作成したレルムによって、特権ユーザからのアクセスを制限できているか確認してみます。レルムで制限されていないときはSYSユーザから他のユーザのテーブルにアクセスできてしまうので、それが制限されることを確認してみます。
-- SYSユーザからのアクセス
SQL> conn /as sysdba
接続されました。
SQL> ALTER SESSION SET CONTAINER = orclpdb;
セッションが変更されました。
SQL> SELECT COUNT(*) FROM test.tab01;
SELECT COUNT(*) FROM test.tab01
*
行1でエラーが発生しました。:
ORA-01031: 権限が不足しています ヘルプ:
https://docs.oracle.com/error-help/db/ora-01031/
SYSユーザからアクセスするとORA-1031エラーが発生し、アクセス制限されたことが確認できました。逆に許可対象のユーザ(TEST2)からのアクセスについて問題ないことも確認してみます。
-- レルム許可ユーザからのアクセス
SQL> conn test2/xxxxxxxx@orclpdb
接続されました。
SQL> SELECT COUNT(*) FROM test.tab01;
COUNT(*)
----------
500000
問題なくアクセスできることが確認できました。
今回はDatabase Vaultの初期設定と、特権ユーザからのオブジェクトアクセスを制限するためのレルムの構成方法について調べてみました。各種操作の制限を行うコマンドルールについては、こちらをご参照ください。
次の記事:Oracle DatabaseにおけるBoolean型について調べてみた