スキップしてコンテンツを表示

Amazon RDS for Oracle DB インスタンスでユーザー権限とロールを管理する方法を教えてください。

所要時間3分
0

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

コメントはありません