Amazon RDS for Oracle DB インスタンスでユーザー権限とロールを管理するにはどうすればよいですか?

所要時間4分
0

Oracle を実行している Amazon Relational Database Services (Amazon RDS) DB インスタンスがあります。このデータベースインスタンスのユーザー権限とロールを管理する手順を知りたいです。

簡単な説明

Amazon RDS for Oracle データベースインスタンスを作成すると、デフォルトのマスターユーザーが作成され、DB インスタンスに対する最大ユーザー権限が付与されますが、それにはいくつかの制限があります。このアカウントは、データベースに追加のユーザーアカウントを作成するなど、あらゆる管理タスクに使用します。Amazon RDS はマネージドサービスであるため、SYS および SYSTEM ユーザーはデフォルトでは使用できません。

Amazon RDS for Oracle マスターユーザーに付与されるロールと権限のリストについては、「マスターユーザーアカウントの権限」を参照してください。

Amazon RDS はマネージドサービスであるため、DBA ロールの次の権限は提供されません。

  • データベースを変更する
  • システムを変更する
  • 任意のディレクトリを作成する
  • 任意のディレクトリをドロップする
  • 任意の特権を付与する
  • 任意のロールを付与する

詳細については、Oracle DBA 権限の制限事項を参照してください。

解決方法

Amazon RDS の SYS オブジェクトの権限を付与するには、Amazon RDS プロシージャ rdsadmin.rdsadmin_util.grant_sys_object を使用します。このプロシージャは、マスターユーザーがロールまたは直接付与によってすでに付与されている権限のみを付与します。

次のようなコマンドを実行して、オブジェクト V_$SQLAREA の SELECT 権限をユーザー EXAMPLE-USERNAME に付与します。

RDS マスターユーザーとしてログインし、以下の手順を実行します。

EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name  => 'V_$SQLAREA',p_grantee   => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');

次のようなコマンドを実行して、オブジェクト V_$SQLAREA の SELECT 権限をユーザー EXAMPLE-USERNAME に grant オプション付きで付与します。

**注:**大文字と小文字を区別する識別子を使用してユーザーを作成した場合を除き、すべてのパラメータ値の定義には、大文字を使用してください。

EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name  => 'V_$SQLAREA',p_grantee   => 'EXAMPLE-USERNAME', p_privilege => 'SELECT', p_grant_option => true);

次のクエリを実行して、ユーザー EXAMPLE-USERNAME に SELECT_CATALOG_ROLE および EXECUTE_CATALOG_ROLE のロールを管理者オプションと共に付与します。これらのロールを使用して、EXAMPLE-USERNAME は SELECT_CATALOG_ROLE および EXECUTE_CATALOG_ROLE に付与された SYS オブジェクトへのアクセスを許可することができます。

SQL> GRANT SELECT_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION;
SQL> GRANT EXECUTE_CATALOG_ROLE TO EXAMPLE-USERNAME WITH ADMIN OPTION;

次のクエリを実行して、SELECT_CATALOG_ROLE ロールに関連する権限を確認します。

SELECT type, owner, table_name, privilege, grantor, grantable FROM dba_tab_privs WHERE grantee = upper('SELECT_CATALOG_ROLE') UNION
SELECT 'SYS' AS type, NULL as owner, NULL as table_name, privilege, NULL, admin_option AS grantable FROM dba_sys_privs WHERE grantee = upper('SELECT_CATALOG_ROLE')
UNION
SELECT 'ROLE' AS type, NULL AS owner, NULL AS table_name, granted_role AS privilege, NULL, admin_option AS grantable FROM dba_role_privs WHERE grantee = upper('SELECT_CATALOG_ROLE')
ORDER BY type, owner, table_name, privilege;

詳細については、「SYS オブジェクトへの SELECT または EXECUTE 権限の付与」を参照してください。

単一のオブジェクトに対する権限を取り消すには、RDS プロシージャ rdsadmin.rdsadmin_util.revoke_sys_object を使用します。

次のコマンドを実行して、ユーザー EXAMPLE-USERNAME からオブジェクト V_$SQLAREA の SELECT 権限を取り消します。

EXECUTE rdsadmin.rdsadmin_util.revoke_sys_object( p_obj_name  => 'V_$SQLAREA', p_revokee   => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');

詳細については、「SYS オブジェクトに対する SELECT または EXECUTE 権限の取り消し」を参照してください

お客様の問題やユースケースに基づいて、次のトラブルシューティングオプションをお使いください。

マスターユーザー権限のリセット

マスターユーザーのロールと権限を取り消した場合は、RDS DB インスタンスのマスターユーザーパスワードを変更することで、ロールと権限をリセットできます

マスター以外のユーザーに RDS_MASTER_ROLE を付与する

ロールの RDS_MASTER_ROLE は、マスター以外のユーザーには付与できません。このロールは、DB インスタンスの作成時に SYS によってデフォルトで作成されます。RDS_MASTER_ROLE はマスターユーザーにのみ付与する必要があります。次のクエリを実行して、RDS_MASTER_ROLE が付与されているユーザーを一覧表示します。

SQL> SELECT * FROM sys.dba_role_privs WHERE granted_role = 'RDS_MASTER_ROLE';

出力は次のようになります。

GRANTEE        GRANTED_ROLE        ADM      DEL     DEF     COM     INH
--------       ---------------     ---      ---     ---     ---     ---
MASTER         RDS_MASTER_ROLE     NO       NO      YES     NO      NO
SYS            RDS_MASTER_ROLE     YES      NO      YES     YES     YES

クエリの出力から、マスターユーザーに admin オプションがないことに気付くかもしれません。したがって、ロールの RDS_MASTER_ROLE を他のユーザーに付与することはできません。

詳細については、「マスター以外のユーザーへの権限の付与」を参照してください。

PUBLIC に付与された権限の取り消し

主要な DBMS_* および UTL_* のパッケージに対する PUBLIC 権限の取り消しは、これらの特権に依存して設計されている Oracle アプリケーションがいくつかあるため、ベストプラクティスではありません。詳細については、MOSC ドキュメント 247093.1 をご参照ください。主要な DBMS_* および UTL_* パッケージには、UTL_TCP、UTL_HTTP、HTTPURITYPE、UTL_INADDR、UTL_SMTP、DBMS_LDAP、DBMS_LOB、UTL_FILE、DBMS_ADVISOR、DBMS_OBFUSCATION_TOOLKIT、DBMS_BACKUP_RESTORE、および DBMS_SYS_SQL が含まれます。

パスワード付きのロール作成時のエラーのトラブルシューティング

次のクエリを実行して、 rdsadmin_util.grant_sys_object を使用してパスワード付きのロールを作成し、権限を付与するとします。

SQL> CREATE ROLE ROLE_NAME IDENTIFIED BY EXAMPLE-PASSWORD;
SQL> EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBMS_JOB', 'ROLE_NAME');

すると、次のエラーが表示されます。

ORA-20199: Error in rdsadmin_util.grant_sys_object. ORA-44001: invalid schema
ORA-06512: at "RDSADMIN.RDSADMIN_UTIL", line 268
ORA-44001: invalid schema

この問題を解決するには、パスワードのないロールを作成します。

-- Create a role without a password
ALTER ROLE ROLE_NAME NOT IDENTIFIED;

エラー ORA-01031: 権限不足のトラブルシューティング

このエラーが発生する場合のユースケースの例をいくつか示します。

ALTER SYSTEM クエリを実行しました。 たとえば、次のクエリは ORA-01031 エラーで失敗します。

SQL> ALTER SYSTEM SET processes=200 scope=spfile;

代わりに、カスタム DB パラメータグループのパラメータ値を変更できます。ただし、デフォルトの DB パラメータグループのパラメータ値を変更することはできません。

データベーストリガーを使用していて、基になるテーブル構造を変更したためにトリガーのステータスが INVALID になりました。 次にトリガーが起動されたときに、トリガーの暗黙的なコンパイルが失敗し、次のエラーが表示されることがあります。

ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIG
ORA-01031: insufficient privileges

この問題を解決するには、データベーストリガーの管理権限をトリガーの所有者に明示的に付与します。この権限は、データベーストリガーを正常に変更するために必要です。

SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner;
SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE;
Trigger altered.

ストアドプロシージャを実行しました。 ロールを使用して取得した権限は、定義者の権限で実行される名前付きストアドプロシージャでは機能しないため、ストアドプロシージャを実行するとこのエラーが発生します。これらの権限は、SQL Plus ブロックおよび匿名の PL/SQL ブロックで機能します。

例:

SQL> CREATE USER EXAMPLE-USERNAME IDENTIFIED BY EXAMPLE-PASSWORD;
SQL> GRANT connect, resource TO EXAMPLE-USERNAME

-- Connect as EXAMPLE-USERNAME
SQL> CREATE TABLE dept (deptno NUMBER, deptname VARCHAR2(30));
Table DEPT created.

-- Drop the table and try to create the same table using the stored procedure. When you run the procedure, you get the error ORA-01031.
SQL> DROP table DEPT;
SQL> CREATE OR REPLACE PROCEDURE test_proc AS
BEGIN
    EXECUTE IMMEDIATE 'CREATE TABLE DEPT (DeptNo number, DeptName varchar2(30))';
END;
/
Procedure TEST_PROC created
SQL> EXEC TEST_PROC
Error report -
ORA-01031: insufficient privileges

この問題を解決するには、マスターユーザーとして接続し、必要な権限を明示的に付与します。

例:

-- Connect as master user and grant the CREATE TABLE privilege.
SQL> GRANT CREATE TABLE TO test_user;
-- Connect as EXAMPLE-USERNAME
SQL> EXEC TEST_PROC
PL/SQL procedure successfully completed.

マスターユーザーには、grant オプションによる権限は付与されません。 このエラーは、次の条件に当てはまる場合に発生することがあります。

  • マスターユーザーには、grant オプションを指定したオブジェクトに対する特定の権限が付与されていません。
  • マスターユーザーは、この権限を別のユーザーに付与しようとしています。

この問題を解決するには、grant オプションを使用して、必要な権限をマスターユーザーに明示的に付与します。

例:

SQL> SHOW USER;
USER is "EXAMPLE-USERNAME"

SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

ERROR:
ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist

-- Grant fails on the object DBA_TABLESPACE_USAGE_METRICS because master user is not granted the SELECT privilege on DBA_TABLESPACE_USAGE_METRICS with the grant option.

SQL> SHOW USER;
USER is "ADMIN"

SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME;
GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME
                    *
ERROR at line 1:
ORA-01031: insufficient privileges

SQL> EXECUTE  rdsadmin.rdsadmin_util.grant_sys_object(  p_obj_name => 'DBA_TABLESPACE_USAGE_METRICS', p_grantee => 'ADMIN', p_privilege => 'SELECT', p_grant_option => true);

SQL> GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to EXAMPLE-USERNAME;

-- After the privileges are granted, connect to EXAMPLE-USERNAME and then query DBA_TABLESPACE_USAGE_METRICS.
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

関連情報

権限とロールの認可の設定に関するOracleのドキュメント

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ