跳至内容

如何管理我的 Amazon RDS for Oracle 数据库实例中的用户权限和角色?

4 分钟阅读
0

我想管理我的 Amazon Relational Database Service (Amazon RDS) for 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');

要向用户授予对于 V_$SQLAREA 对象包含 grant 选项的 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_ROLEEXECUTE_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_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 过程。

要撤销用户对 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

由于主用户不具备 admin 选项,因此您无法向任何其他用户授予 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 错误的示例使用案例。

您运行了 ALTER SYSTEM SET 命令

当您运行以下命令时,将会出现 ORA-01031 错误:

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

您无法更改默认数据库参数组中的参数值。相反,请修改自定义数据库参数组中的参数值

您使用了数据库触发器,且您对基础表结构的更改导致触发器状态更改为 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 网站上的配置权限和角色授权