Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
Amazon RDS for Oracle DB インスタンスでユーザー権限とロールを管理する方法を教えてください。
Amazon Relational Database Service (Amazon RDS) for Oracle DB インスタンスでのユーザー権限とロールを管理したいです。
簡単な説明
Amazon RDS はマネージドサービスであるため、デフォルトでは、SYS および SYSTEM ユーザーを使用できません。
Amazon RDS for Oracle データベースからマスターユーザーに付与されるロールと権限のリストについては、「マスターユーザーアカウントの権限」を参照してください。Amazon RDS for Oracle データベースにおいて、データベース管理者 (DBA) ロールには付与されない権限のリストについては、「Oracle DBA の権限に関する制限事項」を参照してください。
解決策
注: 次のセクションでは、EXAMPLE-USERNAME を、権限を付与するか取り消す対象のユーザー名に置き換えてください。
権限を付与する
SYS オブジェクトに対する権限を付与するには、Amazon RDS プロシージャ rdsadmin.rdsadmin_util.grant_sys_object を使用します。このプロシージャでは、マスターユーザーに既に付与された権限のみが付与されます。
ユーザーに V_$SQLAREA オブジェクトに対する SELECT 権限を付与するには、RDS マスターユーザーとしてログインします。次のコマンドを実行します。
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT');
grant オプション付きでユーザーに V_$SQLAREA オブジェクトに対する SELECT 権限を付与するには、次のコマンドを実行します。
EXECUTE rdsadmin.rdsadmin_util.grant_sys_object( p_obj_name => 'V_$SQLAREA',p_grantee => 'EXAMPLE-USERNAME', p_privilege => 'SELECT', p_grant_option => true);
注: 大文字と小文字を区別する識別子を持つユーザーを作成した場合を除き、すべてのパラメータ値を大文字で定義してください。
admin オプション付きでユーザーに SELECT_CATALOG_ROLE ロールと EXECUTE_CATALOG_ROLE ロールを付与するには、次のコマンドを実行します。
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 ロールと EXECUTE_CATALOG_ROLE ロールでアクセス付与できるオブジェクトと同じ SYS オブジェクトへのアクセスを付与できます。
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 を使用します。
ユーザーの 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 権限を取り消す」を参照してください。
マスターユーザー権限をリセットする
マスターユーザーのロールと権限を取り消した場合は、そのロールと権限をリセットできます。詳細については、「Amazon RDS DB インスタンスの管理者ユーザーのパスワードをリセットする方法を教えてください」を参照してください。
RDS_MASTER_ROLE をマスターユーザーに付与する
RDS_MASTER_ROLE ロールをマスター以外のユーザーに付与することはできません。DB インスタンスを作成すると、SYS はデフォルトで RDS_MASTER_ROLE を作成します。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 を他のユーザーに付与することはできません。詳細については、「非マスターユーザーに権限を付与する」を参照してください。
主要な DBMS_* パッケージと UTL_*パッケージに対する PUBLIC ロール権限を取り消す
一部の Oracle アプリケーションは PUBLIC ロール権限に依存するため、主要な DBMS_* パッケージと UTL_* パッケージに対し、この権限を取り消すことは推奨されません。主な 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
パスワード付きロールを作成する際に発生する「invalid schema」エラーを解決する
例として、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」
この問題を解決するには、次のコマンドを実行してパスワードのないロールを作成します。
SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;
「ORA-01031: insufficient privileges」エラーを解決する
ORA-01031 エラーが発生する可能性があるユースケース例を次に示します。
ALTER SYSTEM SET コマンドを実行した場合
次のコマンドを実行すると、ORA-01031 エラーが発生します。
SQL> ALTER SYSTEM SET processes=200 scope=spfile;
デフォルトの DB パラメータグループのパラメータ値は変更できません。代わりに、カスタム DB パラメータグループのパラメータ値を変更してください。
データベーストリガーを使用し、基盤テーブルの構造変更により、トリガーのステータスが INVALID に変更された場合
イベントが次回トリガーをリリースする際、トリガーの暗黙的なコンパイルは失敗し、次のエラーが発生します。
「ORA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIGORA-01031: insufficient privileges (権限が不十分です)」
この問題を解決するには、所有者にデータベーストリガーの更新を許可するために次のコマンドを実行し、トリガーの所有者に administer database trigger 権限を明示的に付与します。
SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner; SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE;
想定される出力:
Trigger altered.
ストアドプロシージャを実行した場合
定義者権限で実行される名前付きストアドプロシージャのロールから取得した権限を使用できないことが原因で「ORA-01031」エラーが発生します。代わりに、SQL Plus のロールや匿名の PL/SQL ブロックから取得した権限を使用してください。
次のストアドプロシージャでは、ユーザーは名前付きストアドプロシージャ内のロールの権限を使用してテーブルを作成したことが原因で障害が発生します。その後、ユーザーはテーブルを削除し、そのストアドプロシージャを使用して同じテーブルの作成を試みます。
SQL> CREATE USER EXAMPLE-USERNAME IDENTIFIED BY EXAMPLE-PASSWORD; SQL> GRANT connect, resource TO EXAMPLE-USERNAME SQL> CREATE TABLE dept (deptno NUMBER, deptname VARCHAR2(30)); Table DEPT created.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」
この問題を解決するには、マスターユーザーとして接続し、次のコマンドを実行して CREATE TABLE 権限を付与します。
SQL> GRANT CREATE TABLE TO test_user;
次のコマンドを実行すると、ストアドプロシージャが実行されます。
SQL> EXEC TEST_PROC
想定される出力:
PL/SQL procedure successfully completed.
grant オプションを指定してマスターユーザー権限を付与しなかった場合
オブジェクトに grant オプションを使用してマスターユーザーに権限を付与しなかった場合、「ORA-04043」エラーが発生します。
次の付与プロシージャ例では、マスターユーザーは DBA_TABLESPACE_USAGE_METRICS オブジェクトに対し、grant オプションが指定された SELECT 権限を持たないことが原因で障害が発生します。
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」
マスターユーザーが DBA_TABLESPACE_USAGE_METRICS に対する SELECT 権限を他のユーザーに付与しようとすると、そのマスターユーザーに対し、「ORA-01031: insufficient privileges」エラーが返されます。
この問題を解決するには、次のコマンドを実行し、grant オプション付きの SELECT 権限をマスターユーザーに明示的に付与します。
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;
SELECT 権限を付与すると、マスターユーザーは SELECT コマンドを正常に実行できます。
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;
関連情報
権限とロール認証の設定 (Oracle のウェブサイト)

