¿Cómo administro los privilegios y roles de usuario en la instancia de base de datos de Amazon RDS para Oracle?

Última actualización: 03-06-2022

Tengo una instancia de base de datos de Amazon Relational Database Services (Amazon RDS) que ejecuta Oracle. Quiero conocer el procedimiento para administrar los privilegios y roles de usuario para esta instancia de base de datos.

Descripción corta

Al crear una instancia de Amazon RDS for Oracle Database, se crea el usuario maestro predeterminado y se conceden los permisos de usuario máximos en la instancia de base de datos con algunas limitaciones. Utilice esta cuenta para cualquier tarea administrativa, como crear cuentas de usuario adicionales en la base de datos. Como Amazon RDS es un servicio administrado, los usuarios de SYS y SYSTEM no se pueden usar de forma predeterminada.

Para obtener la lista de roles y privilegios concedidos al usuario maestro de Amazon RDS for Oracle, consulte Privilegios de cuentas de usuario maestro.

Como Amazon RDS es un servicio administrado, no se proporcionan los siguientes privilegios para el rol de DBA:

  • ALTERAR BASE DE DATOS
  • ALTERAR SISTEMA
  • CREAR CUALQUIER DIRECTORIO
  • ELIMINAR CUALQUIER DIRECTORIO
  • CONCEDER CUALQUIER PRIVILEGIO
  • CONCEDER CUALQUIER ROL

Para obtener más información, consulte Limitaciones de los privilegios de Oracle DBA.

Resolución

Para conceder privilegios en objetos SYS en Amazon RDS, utilice el procedimiento de Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. El procedimiento solo concede privilegios que ya se le conceden al usuario maestro mediante un rol o una concesión directa.

Ejecute un comando similar al siguiente para conceder privilegios SELECT en el objeto V_$SQLAREA al usuario EXAMPLE-USERNAME:

Inicie sesión como usuario maestro de RDS y ejecute el siguiente procedimiento:

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

Ejecute un comando similar al siguiente para conceder privilegios SELECT en el objeto V_$SQLAREA al usuario EXAMPLE-USERNAME con la opción grant (concesión):

Nota: Use mayúsculas para definir todos los valores de los parámetros, a menos que haya creado el usuario con un identificador que distinga entre mayúsculas y minúsculas.

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

Ejecute las siguientes consultas para conceder los roles SELECT_CATALOG_ROLE y EXECUTE_CATALOG_ROLE al usuario EXAMPLE-USERNAME con la opción admin (administrador). Con estos roles, EXAMPLE-USERNAME puede brindar acceso a los objetos SYS que se hayan concedido a SELECT_CATALOG_ROLE y 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;

Ejecute las siguientes consultas para ver las concesiones asociadas al rol 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;

Para obtener más información, consulte Concesión de privilegios SELECT o EXECUTE a objetos SYS.

Para revocar los privilegios de un solo objeto, utilice el procedimiento RDS rdsadmin.rdsadmin_util.revoke_sys_object.

Ejecute el siguiente comando para revocar los privilegios SELECT en el objeto V_$SQLAREA del usuario EXAMPLE-USERNAME:

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

Para obtener más información, consulte Revocación de privilegios SELECT o EXECUTE en objetos SYS.

Utilice las siguientes opciones de solución de problemas según el problema y el caso de uso.

Restablecimiento de los privilegios del usuario maestro

Concesión de RDS_MASTER_ROLE a usuarios no maestros

El Rol RDS_MASTER_ROLE no puede concederse a usuarios no maestros. SYS crea este rol de forma predeterminada cuando se crea la instancia de base de datos. El RDS_MASTER_ROLE debe concederse solo al usuario maestro. Ejecute la siguiente consulta para enumerar los usuarios a los que se les ha concedido el RDS_MASTER_ROLE:

SQL> SELECT * FROM sys.dba_role_privs WHERE granted_role = 'RDS_MASTER_ROLE';

El resultado es similar al siguiente:

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

Es posible que observe en el resultado de la consulta que el usuario maestro no tiene la opción de administrador. Por lo tanto, el rol RDS_MASTER_ROLE no puede concederse a ningún otro usuario.

Para obtener más información, consulte Concesión de privilegios a usuarios no maestros.

Revocación de los privilegios PUBLIC concedidos

La revocación de los privilegios PUBLIC a los paquetes clave de DBMS_* y UTL_* no es una práctica recomendada porque varias aplicaciones de Oracle están diseñadas para depender de estos privilegios. Para obtener más información, consulte MOSC Doc 247093.1. Los paquetes clave DBMS_* y UTL_* incluyen UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE y DBMS_SYS_SQL.

Solución del error al crear un rol con contraseña

Supongamos que ejecuta la siguiente consulta para crear un rol con contraseña y conceder privilegios mediante 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');

A continuación, aparece el siguiente error:

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

Para resolver este problema, cree un rol sin contraseña.

-- Create a role without a password
ALTER ROLE ROLE_NAME NOT IDENTIFIED;

Solución del error ORA-01031: privilegios insuficientes

Los siguientes son algunos ejemplos de casos de uso en los que puede aparecer este error:

Ha ejecutado la consulta ALTERAR SISTEMA. Por ejemplo, la siguiente consulta falla bajo el error ORA-01031:

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

En su lugar, puede modificar los valores de los parámetros en un grupo de parámetros de base de datos personalizado. Sin embargo, no puede cambiar los valores de los parámetros en un grupo de parámetros de base de datos predeterminado.

Está utilizando un desencadenador de base de datos y los cambios en la estructura de la tabla subyacente han provocado que el estado del desencadenador se volviera INVÁLIDO. La próxima vez que se active el desencadenador, es posible que observe que la compilación implícita de este falla bajo el siguiente error:

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

Para solucionar este problema, conceda el privilegio de administrar desencadenador de base de datos al propietario del desencadenador de forma explícita. Este privilegio es necesario para alterar el desencadenador de la base de datos correctamente:

SQL> GRANT ADMINISTER DATABASE TRIGGER TO example-owner;
SQL> ALTER TRIGGER example-owner.log_errors_trig COMPILE;
Trigger altered.

Ha ejecutado un procedimiento almacenado. Obtiene este error cuando ejecuta un procedimiento almacenado, porque los privilegios adquiridos mediante roles no funcionan en procedimientos almacenados con nombre que se ejecutan con derechos de definidor. Estos privilegios funcionan en SQL Plus y en bloques PL/SQL anónimos.

Ejemplo:

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

Para solucionar este problema, conéctese como usuario maestro y conceda los privilegios requeridos de forma explícita.

Ejemplo:

-- 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.

Al usuario maestro no se le conceden los privilegios con la opción de concesión. Es posible que aparezca este error cuando se cumplan las siguientes condiciones:

  • Al usuario maestro no se le concede un privilegio determinado sobre un objeto con la opción de concesión.
  • El usuario maestro intenta conceder este privilegio a otro usuario.

Para solucionar este problema, conceda los privilegios requeridos de manera explícita al usuario maestro con la opción de concesión.

Ejemplo:

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;

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?