使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何在我的 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 是托管式服务,因此不提供数据管理员角色的以下权限:

  • 更改数据库
  • 更改系统
  • 创建任何目录
  • 删除任何目录
  • 授予任何权限
  • 授予任何角色

有关详细信息,请参阅 Oracle 数据管理员权限限制

解决方法

要授予 Amazon RDS 中 SYS 对象权限,请使用 Amazon RDS 流程 rdsadmin.rdsadmin_util.grant_sys_object。此流程仅可授予已通过角色或直接授予向主用户授予的权限。

运行一条类似于以下内容的命令,将对象 V_$SQLAREA 的 SELECT 权限授予用户 EXAMPLE-USERNAME

以 RDS 主用户身份登录并运行以下流程:

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

运行一条类似于以下内容的命令,使用授权选项向用户 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);

运行以下查询,以使用管理员选项将角色 SELECT_CATALOG_ROLE 和 EXECUTE_CATALOG_ROLE 授予用户 EXAMPLE-USERNAME。借助这些角色,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

从查询的输出中,您可能会发现,主用户没有管理员选项。因此,无法将角色 RDS_MASTER_ROLE 授予任何其他用户。

有关详细信息,请参阅向非主用户授予权限

撤销已授予 PUBLIC 的权限

撤销 PUBLIC 对密钥 DBMS_* 和 UTL_* 程序包的权限并非最佳实践,因为有若干个 Oracle 应用程序已被设计为依赖这些权限。有关更多信息,请参阅 MOSC 文档 247093.1。密钥 DBMS_* 和 UTL_* 程序包包括 UTL_TCP、UTL_HTTP、HTTPURTYPE、UTL_INADDR、UTL_SMTP、DBMS_LDAP、DBMS_LOB、UTL_FILE、DBMS_HTTP、DBMS_ADVISOR、DBMS_OBACKUPION_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 官方已更新 3 年前