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 のウェブサイト)

