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

4 分的閱讀內容
0

我有一個執行 Oracle 的 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體。我想知道管理此資料庫執行個體使用者權限和角色的程序。

簡短描述

您建立 Amazon RDS for Oracle Database 執行個體時,會建立預設主要使用者,並授與資料庫執行個體的最大使用者許可,但有一些限制。請使用此帳戶進行任何系統管理任務,例如在資料庫中建立其他使用者帳戶。由於 Amazon RDS 是受管服務,預設無法使用 SYS 和 SYSTEM 使用者。

如需授與 Amazon RDS for Oracle 主要使用者的角色和權限清單,請參閱主要使用者帳戶權限

由於 Amazon RDS 是受管服務,不提供下列資料庫管理員角色的權限:

  • ALTER DATABASE
  • ALTER SYSTEM
  • CREATE ANY DIRECTORY
  • DROP ANY DIRECTORY
  • GRANT ANY PRIVILEGE
  • GRANT ANY ROLE

如需詳細資訊,請參閱 Oracle 資料庫管理員權限的限制

解決方案

如果要在 Amazon RDS 中授與 SYS 物件的權限,請使用 Amazon RDS 程序 rdsadmin.rdsadmin_util.grant_sys_object。程序只會授予已透過角色授予或直接授予給主要使用者的權限。

執行類似以下的指令,將授予使用者 EXAMPLE-USERNAME 對物件 V_$SQLAREA 的 SELECT 權限:

以 RDS 主要使用者身分登入,然後執行以下程序:

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

執行類似以下的指令,使用 grant (授予) 選項將授予使用者 EXAMPLE-USERNAME 對物件 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 授予使用者 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 資料庫執行個體的主要使用者密碼來重設這些角色和權限

授與 RDS_MASTER_ROLE 給非主要使用者

角色 RDS_MASTER_ROLE 無法授與非主要使用者。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 Doc 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;

您可以反過來修改自訂資料庫參數群組中的參數值。但是,您無法變更預設資料庫參數群組中的參數值。

您使用資料庫觸發條件,變更底層資料表結構造成觸發條件狀態變為 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.

主要使用者沒有使用授與選項授與權限。 下列條件成立時,可能會出現此錯誤:

  • 主要使用者並未獲得有授與選項物件的特定權限。
  • 主要使用者嘗試將此權限授與其他使用者。

如果要修正此問題,請使用授與選項,明確授與主要使用者所需的權限。

範例:

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 年前