跳至內容

如何管理 Amazon RDS for Oracle 資料庫執行個體中的使用者權限和角色?

4 分的閱讀內容
0

我想管理 Amazon Relational Database Service (Amazon RDS) 上適用於 Oracle 資料庫執行個體的使用者權限和角色。

簡短描述

由於 Amazon RDS 是一項受管服務,因此預設不能使用 SYS 和 SYSTEM 使用者。

如需 Amazon RDS for Oracle 資料庫授予主使用者的角色和權限清單,請參閱主使用者帳戶權限。如需 Amazon RDS for Oracle 資料庫未授予資料庫管理員 (DBA) 角色的權限清單,請參閱 Oracle DBA 權限的限制

解決方法

**注意:**在以下區段中,將 EXAMPLE-USERNAME 替換為您要授予權限或撤銷權限的使用者名稱。

授予權限

若要授予對 SYS 物件的權限,請使用 rdsadmin.rdsadmin_util.grant_sys_object Amazon RDS 程序。此程序只會授予主使用者已擁有的權限。

若要授予使用者對 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);

**注意:**除非您使用區分大小寫的識別碼建立使用者,否則請使用大寫字母定義所有參數值。

若要將 SELECT_CATALOG_ROLEEXECUTE_CATALOG_ROLE 角色授予具有 admin 選項的使用者,請執行下列命令:

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

然後,使用者可以授予與 SELECT_CATALOG_ROLEEXECUTE_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 權限

若要撤銷單一物件的權限,請使用 rdsadmin.rdsadmin_util.revoke_sys_object RDS 程序。

若要撤銷使用者對 V_$SQLAREASELECT 權限,請執行下列命令:

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

如需詳細資訊,請參閱撤銷 SYS 物件的 SELECT 或 EXECUTE 權限

重設主使用者權限

如果您已撤銷主使用者的角色和權限,則可以將其重設。如需詳細資訊,請參閱如何重設 Amazon RDS 資料庫執行個體的管理員使用者密碼?

授予主使用者 RDS_MASTER_ROLE

您無法將 RDS_MASTER_ROLE 角色授予非主使用者。建立資料庫執行個體時,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

由於主使用者沒有管理員選項,因此您無法將 RDS_MASTER_ROLE 授予任何其他使用者。如需詳細資訊,請參閱向非主使用者授予權限

撤銷關鍵 DBMS_* 和 UTL_* 套件的 PUBLIC 角色權限

撤銷關鍵 DBMS_* 和 UTL_* 套件的 PUBLIC 角色權限並不是最佳實務,因為多個 Oracle 應用程式依賴這些權限。關鍵的 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:權限不足) 錯誤

以下是可能導致 ORA-01031 錯誤的範例案例。

您執行 ALTER SYSTEM SET 命令

執行以下命令時出現 ORA-01031 錯誤:

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

您無法變更預設資料庫參數群組中的參數值。改為修改自訂資料庫參數群組中的參數值

您使用資料庫觸發程序,並且對底層資料表結構的變更導致觸發程序狀態變為「無效」

下次事件釋放觸發程序時,觸發程序的隱式編譯將失敗,並出現以下錯誤:

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

若要解決此問題,請執行下列命令,明確授予觸發程序擁有者管理資料庫觸發程序權限,以便擁有者可以修改資料庫觸發程序:

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.

您沒有使用授權選項授予主使用者權限

當您沒有使用物件的授予選項授予主使用者權限時,就會出現 "ORA-04043" 錯誤。

以下範例授權程序會失敗,因為主使用者不具備 DBA_TABLESPACE_USAGE_METRICS 物件上的 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" (ORA-01031:權限不足) 錯誤。

若要解決此問題,請執行下列命令,使用 grant option 明確授予主使用者 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 網站上設定權限和角色授權