4 Oracle Database Vaultレルム
Oracle Database Vaultレルムでは、ユーザーがデータベースに対して実行できるアクションが制限されます。
Oracle Database Vaultは、機密データの保護、ヒューマン・エラーの削減、内部脅威の制限というOracle Database Vaultの目標に加え、Oracle Databaseディクショナリのコンポーネントと独自のディクショナリ・オブジェクトを保護します。
特定のオブジェクトにアクセスしたり、特定の管理タスクを実行したり、特定のOracle Databaseロールを付与したりするために、Database Vaultによって認可されることが必要になる場合があります。
Oracle Database Vaultには、従来型と必須という2つのタイプのレルムがあります:どちらのタイプのレルムでも、スキーマ全体、個々のデータベース・ロール、またはスキーマ内の重要なオブジェクト(表や索引)を選択的に保護できます。
従来のレルムでは、直接のオブジェクト権限を使用したデータベース・ユーザーが尊重されます。
必須レルムには、直接付与された権限とロールを介して付与された権限のいずれかと、Database Vaultレルム認可が必要です。
この例では、C##JSMITH
に、付与されているリソース・ロールを転送して付与します。これを実行するには、C##JSMITH
をDatabase Vaultのデフォルト・レルムに追加する必要があります。
4.1 従来のレルム
従来のレルムの場合、オブジェクト権限を付与されているオブジェクトの所有者またはユーザーはレルム認可なしで問合せやDML操作を実行できますが、DDL操作の実行にはレルム認可が必要です。
4.1.1 レルム違反のデモンストレーション
Oracle Database Vaultレルムではユーザーがデータベースに対して実行できるアクションが制限されるため、一部のアクションは適切な認可がなければ失敗します。この例では、C##JSMITH
ユーザーがOracleシステム権限およびロール管理レルムに存在しないため、RESOURCE
ロールを付与できないことを示しています。
C##CMACK
ユーザーを作成し、RESOURCE
ロールを付与します:C##JSMITH
として接続します:connect c##jsmith
C##CMACK
ロールを作成し、RESOURCE
ロールを付与します:CREATE USER C##CMACK IDENTIFIED BY <password> CONTAINER=ALL; GRANT RESOURCE TO C##CMACK WITH ADMIN OPTION CONTAINER=ALL;
C##JSMITH
として次のエラーが表示されます:ORA-47410: Insufficient realm privileges to GRANT on RESOURCE
RESOURCE
ロールを保護しているレルムを特定します:C##JSMITH
として接続します:connect c##jsmith
- 次を実行します:
SELECT REALM_NAME, OBJECT_NAME FROM DBA_DV_REALM_OBJECT WHERE OBJECT_TYPE = 'ROLE' AND OBJECT_NAME = 'RESOURCE' ORDER BY 1,2;
次の出力が表示されます:REALM_NAME OBJECT_NAME ____________________________________________________ ______________ Oracle System Privilege and Role Management Realm RESOURCE
- レルムで保護されたオブジェクトにアクセスすることを認可されているデータベース・ユーザー、具体的には、
OWNER
レルム認可を持つユーザーを特定します。これにより、WITH ADMIN OPTION
権限を保持するオブジェクトに対する権限を転送して付与できるようになります:SELECT GRANTEE, AUTH_OPTIONS FROM DBA_DV_REALM_AUTH WHERE REALM_NAME = 'Oracle System Privilege and Role Management Realm' ORDER BY 1;
次の出力が表示されます:GRANTEE AUTH_OPTIONS _____________ _______________ SYS Owner
SYS
は、必要でないかぎり使用しないでください。かわりに、C##JSMITH
を所有者としてOracleシステム権限およびロール管理レルムに認可して、C##JSMITH
がリソース・ロールを他のデータベース・ユーザーに付与できるようにする必要があります。
C##JSMITH
をOracleシステム権限およびロール管理レルムに所有者として認可するステップを完了し、C##JSMITH
がリソース・ロールを他のデータベース・ユーザーに付与できるようにします。
4.1.2 レルム認可の付与
名前付きユーザーをOracleシステム権限およびロール管理レルムに所有者として認可し、ユーザーがそのリソース・ロールを他のデータベース・ユーザーに付与できるようにします。すべてのデータベース・コンテナ内のデータベース・ユーザーに権限を付与する場合は、Oracle Database Vaultが有効になっている各プラガブル・データベース(PDB)で名前付きユーザーを認可します。
たとえば、Database VaultレルムにC##JSMITH
を追加します:
C##JSMITH
として接続します:connect c##jsmith
- レルムに
C##JSMITH
を追加します:BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM ( realm_name => 'Oracle System Privilege and Role Management Realm' ,grantee => 'C##JSMITH' ,rule_set_name => null ,auth_options => DBMS_MACUTL.G_REALM_AUTH_OWNER); END; /
C##JSMITH
がレルムに追加されたことを確認します:SELECT GRANTEE, AUTH_OPTIONS FROM DBA_DV_REALM_AUTH WHERE REALM_NAME = 'Oracle System Privilege and Role Management Realm' ORDER BY 1;
次の出力が表示されます:GRANTEE AUTH_OPTIONS _____________ _______________ C##JSMITH Owner SYS Owner
- PDBで
C##JSMITH
として接続します:connect c##jsmith@pdb_name
- レルムに
C##JSMITH
を追加します:BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM ( realm_name => 'Oracle System Privilege and Role Management Realm' ,grantee => 'C##JSMITH' ,rule_set_name => null ,auth_options => DBMS_MACUTL.G_REALM_AUTH_OWNER ,auth_scope => DBMS_MACUTL.G_SCOPE_LOCAL); END; /
C##JSMITH
がレルムに追加されたことを確認します:SELECT GRANTEE, AUTH_OPTIONS FROM DBA_DV_REALM_AUTH WHERE REALM_NAME = 'Oracle System Privilege and Role Management Realm' ORDER BY 1;
次の出力が表示されます:GRANTEE AUTH_OPTIONS _____________ _______________ C##JSMITH Owner SYS Owner
ヒント:
拡張構成では、共通ロールを作成し、そのロールを個々のデータベース・ユーザー名ではなく、レルム認可所有者リストに追加します。たとえば、C##ACME_DBA
ロールを作成し、認可された所有者としてOracleシステム権限およびロール管理レルムに追加します。次に、Database Vaultレルムを作成して、C##ACME_DBA
ロールを付与できるユーザーを保護します。
4.1.3 他のユーザーへのRESOURCE
ロールの付与
名前付きユーザーが権限およびレルム認可を取得すると、そのユーザーはRESOURCE
を他のユーザーに付与できます。
たとえば、C##JSMITH
として、RESOURCE
ロールをC##CMACK
に付与します:
C##JSMITH
として接続します:connect c##jsmith
C##CMACK
ロールを作成し、RESOURCE
ロールを付与します:CREATE USER C##CMACK IDENTIFIED BY <password> CONTAINER=ALL; GRANT RESOURCE TO C##CMACK WITH ADMIN OPTION CONTAINER=ALL;
C##JSMITH
として、プラガブル・データベースにGRKAMER
アカウントを作成します:ALTER SESSION SET CONTAINER=pdb_name; CREATE USER GKRAMER IDENTIFIED BY <password>; GRANT CREATE SESSION TO GKRAMER;
C##JSMITH
データベース・ユーザーを使用して、GRKAMER
に複数のシステム権限を付与します:GRANT SELECT ANY TABLE, UPDATE ANY TABLE, CREATE ANY TABLE, DROP ANY TABLE TO GKRAMER; GRANT CREATE ANY INDEX, DROP ANY INDEX TO GKRAMER; GRANT RESOURCE TO GKRAMER;
デフォルトのレルムおよびコマンド・ルールの詳細は、『Oracle Database Vault管理者ガイド』を参照してください。
4.2 必須レルム
必須レルムの場合、レルム内のオブジェクトに対して、従来のレルムよりも強力な保護が提供されます。必須レルムの場合、オブジェクト権限とシステム権限の両方へのアクセスがブロックされ、オブジェクト権限を持つユーザーが、レルム認可なしで問合せ、DMLまたはDDL操作を実行することは許可されません。つまり、オブジェクトが必須レルムで保護されている場合、オブジェクト所有者であっても、適切なレルム認可を受けないとそのオブジェクトにアクセスできません。
4.2.1 レルムおよびコマンド・ルールを適用する前のアプリケーション・データの問合せ
レルムおよびコマンド・ルールを適用する前に、HR.EMPLOYEES
表を問い合せて、ユーザーが実行できるアクションを確認できます。レルムとコマンド・ルールを適用すると、結果は異なるものになります。
次の各ユーザーとしてHR.EMPLOYEES
表を問い合せ、結果を次の表と比較します:
SYS
SYSTEM
C##DVOWNER
C##DVACCTMGR
C##JSMITH
C##CMACK
GKRAMER
HR
<user>
として接続します:connect <user>
- 次のコマンドを実行します。
SELECT COUNT(*) FROM HR.EMPLOYEES; CREATE TABLE HR.EMP2 AS SELECT * FROM HR.EMPLOYEES; CREATE INDEX HR.TEST_IDX ON HR.EMP2(HIRE_DATE,LAST_NAME); DROP INDEX HR.TEST_IDX; DROP TABLE HR.EMP2;
コマンド | SYS |
SYSTEM |
C##DVOWNER |
C##DVACCTMGR |
C##JSMITH |
C##CMACK |
GKRAMER |
HR |
---|---|---|---|---|---|---|---|---|
SELECT COUNT(*) FROM HR.EMPLOYEES; |
Success |
Success |
ORA-00942: table or view does not exist |
ORA-00942: table or view does not exist |
Success |
ORA-00942: table or view does not exist |
Success |
Success |
CREATE TABLE HR.EMP2 AS SELECT * FROM HR.EMPLOYEES; |
Success |
Success |
ORA-00942: table or view does not exist |
ORA-00942: table or view does not exist |
Success |
ORA-00942: table or view does not exist |
Success |
Success |
CREATE INDEX HR.TEST_IDX ON HR.EMP2(HIRE_DATE,LAST_NAME); |
Success |
Success |
ORA-00942: table or view does not exist |
ORA-00942: table or view does not exist |
Success |
ORA-00942: table or view does not exist |
Success |
Success |
DROP INDEX HR.TEST_IDX; |
Success |
Success |
ORA-01418: specified index does not exist |
ORA-01418: specified index does not exist |
Success |
ORA-01418: specified index does not exist |
Success |
Success |
DROP TABLE HR.EMP2; |
Success |
Success |
ORA-00942: table or view does not exist |
ORA-00942: table or view does not exist |
Success |
ORA-00942: table or view does not exist |
Success |
Success |
結果が表と異なる場合は、コンテナ・データベースでOracle Database Vaultを構成および有効化し、ユーザーを作成して適切な権限を付与したことを確認します。
Database Vault関連のアカウントC##DVOWNER
およびC##DVACCTMGR
には、HR.EMPLOYEES表へのアクセスに必要なシステム権限またはオブジェクト権限がありません。これらのアカウントは、データへのアクセスを意図したものではなく、Database Vault管理アクティビティのみを実行します
4.2.2 表およびビューを保護するための必須レルムの作成
必須レルムには、直接付与された権限とロールを介して付与された権限のいずれかと、Database Vaultレルム認可が必要です。必須レルムを作成すると、適切なシステム権限またはオブジェクト権限およびレルム認可を持つユーザーのみが、指定された表およびビューにアクセスできます。
前提条件
「名前付きデータベース・アカウントの作成」中に作成したC##JSMITH
ユーザーなど、DV_ACCTMGR
またはDV_OWNER
ロールが付与されているアカウントがあること。
- プラガブル・データベースで
C##JSMITH
として接続します:connect c##jsmith@pdb_name
- 必須レルムを作成します:
BEGIN DVSYS.DBMS_MACADM.CREATE_REALM( realm_name => 'Protect HR tables' ,description => 'Mandatory realm to protect HR tables' ,enabled => dbms_macutl.g_yes ,audit_options => null ,realm_type => dbms_macadm.mandatory_realm); END; /
ノート:
Oracle Database 19c以前および従来の監査を使用している場合は、NULLではなくaudit_options
の値を指定できます。詳細は、Oracle Database 19cの『Oracle Database Vault管理者ガイド』を参照してください。 - 新しいレルムで保護するオブジェクトを追加します。
OBJECT_TYPE
パラメータにワイルドカード(%)を指定すると、スキーマ内のすべての既存オブジェクトおよび新規オブジェクトを保護できます。この例では、
TABLES
とVIEWS
を1つのレルムに、INDEXES
を次の例の別のレルムに分けます。BEGIN DVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM( realm_name => 'Protect HR tables' ,object_owner => 'HR' ,object_name => '%' ,object_type => 'TABLE'); END; / BEGIN DVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM( realm_name => 'Protect HR tables' ,object_owner => 'HR' ,object_name => '%' ,object_type => 'VIEW'); END; /
- レルムで保護された表およびビューへのアクセスをユーザーに認可します。必須レルムでは、オブジェクト所有者も認可します。
この例では、
HR
が自身のオブジェクトにアクセスすることを認可します。BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM( realm_name => 'Protect HR tables' ,grantee => 'HR' ,rule_set_name => '' ,auth_options => dbms_macutl.g_realm_auth_owner); END; /
- レルムを強制するかどうかを決定します:
- シミュレーション(非強制)モード: Oracle Database Vaultシミュレーション・モードでは、Oracle Database Vaultレルムで保護するデータにアクセスしているユーザーを特定できます。Database Vaultレルム認可リストの違反のみが記録されます。
ENABLED
パラメータをDBMS_MACUTL.G_SIMULATION
に設定しますBEGIN DVSYS.DBMS_MACADM.UPDATE_REALM( realm_name => 'Protect HR tables' ,description => 'Mandatory realm to protect HR tables' ,enabled => dbms_macutl.g_simulation ,audit_options => null ,realm_type => dbms_macadm.mandatory_realm); END; /
- 強制モード: Oracle Database Vault強制モードは、保護しているオブジェクトに対する制御を必須レルムが強制し、データベース・ユーザーがレルムに対する適切なシステム権限またはオブジェクト権限および認可を維持している場合にそのユーザーがアクセスできるようにすることを意味します。
ENABLED
パラメータをDBMS_MACUTL.G_YES
に設定しますBEGIN DVSYS.DBMS_MACADM.UPDATE_REALM( realm_name => 'Protect HR tables' ,description => 'Mandatory realm to protect HR tables' ,enabled => dbms_macutl.g_yes ,audit_options => null ,realm_type => dbms_macadm.mandatory_realm); END; /
- シミュレーション(非強制)モード: Oracle Database Vaultシミュレーション・モードでは、Oracle Database Vaultレルムで保護するデータにアクセスしているユーザーを特定できます。Database Vaultレルム認可リストの違反のみが記録されます。
Oracle Database Vaultシミュレーション・モードの詳細は、『Oracle Database Vault管理者ガイド』のエラーのトラブルシューティングとトレースの項を参照してください。
4.2.3 索引を保護するための必須レルムの作成
表と索引を別々のレルムに分離することで、表データにアクセスすることなく索引メンテナンスを許可できます。データに間接的にアクセスできるため、依然としてリスクがあります。ただし、索引メンテナンスがDBAのタスクであり、これが想定するリスクである場合、この分離は一般的な方法です。
例:
C##JSMITH
として接続します:connect c##jsmith
- 必須レルムを作成します:
BEGIN DVSYS.DBMS_MACADM.CREATE_REALM( realm_name => 'Protect HR indexes' ,description => 'Mandatory realm to protect HR indexes' ,enabled => dbms_macutl.g_yes ,audit_options => null ,realm_type => dbms_macadm.mandatory_realm); END; /
ノート:
Oracle Database 19c以前および従来の監査を使用している場合は、NULLではなくaudit_options
の値を指定できます。詳細は、『Oracle Database Vault管理者ガイド』を参照してください。 - レルムに索引を追加します:
BEGIN DBMS_MACADM.ADD_OBJECT_TO_REALM( realm_name => 'Protect HR indexes' ,object_owner => 'HR' ,object_name => '%' ,object_type => 'INDEX'); END; /
- レルムに認可を追加します:
BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM( realm_name => 'Protect HR indexes' ,grantee => 'HR' ,rule_set_name => null ,auth_options => dbms_macutl.g_realm_auth_owner); END; /
- 索引の作成、削除および更新を実行できるように、レルム認可の所有者としてDBA (この場合は
GKRAMER
)を追加します:BEGIN DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM( realm_name => 'Protect HR indexes' ,grantee => 'GKRAMER' ,rule_set_name => null ,auth_options => dbms_macutl.g_realm_auth_owner); END; /