Saltar al contenido

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

7 minutos de lectura
0

Quiero administrar los privilegios y roles de usuario en mi instancia de base de datos de Amazon Relational Database Service (Amazon RDS) para Oracle.

Descripción corta

Como Amazon RDS es un servicio administrado, no puedes utilizar usuarios de SYS y SYSTEM de forma predeterminada.

Para ver la lista de roles y privilegios que la base de datos de Amazon RDS para Oracle concede al usuario maestro, consulta Privilegios de la cuenta de usuario maestro. Para obtener una lista de los privilegios que la base de datos de Amazon RDS Oracle no concede al rol de administrador de bases de datos (DBA), consulta Limitaciones de los privilegios de DBA de Oracle.

Resolución

Nota: En las siguientes secciones, sustituye EXAMPLE-USERNAME por el nombre de usuario al que estás concediendo o revocando privilegios.

Concesión de privilegios

Para conceder privilegios a objetos SYS, utiliza el procedimiento rdsadmin.rdsadmin_util.grant_sys_object de Amazon RDS. El procedimiento concede solo los privilegios que el usuario maestro ya tiene.

Para conceder el privilegio SELECT en el objeto V_$SQLAREA a un usuario, inicia sesión como usuario maestro de RDS. A continuación, ejecuta el siguiente comando:

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

Para conceder el privilegio SELECT en el objeto V_$SQLAREA a un usuario con la opción de concesión, ejecuta el siguiente comando:

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

Nota: A menos que hayas creado el usuario con un identificador que distinga mayúsculas y minúsculas, utiliza mayúsculas para definir todos los valores de los parámetros.

Para conceder los roles SELECT_CATALOG_ROLE y EXECUTE_CATALOG_ROLE a un usuario con la opción de administrador, ejecuta los siguientes comandos:

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

A continuación, el usuario puede conceder acceso a los mismos objetos SYS que los roles SELECT_CATALOG_ROLE y EXECUTE_CATALOG_ROLE.

Para ver las concesiones asociadas a SELECT_CATALOG_ROLE, ejecuta los siguientes comandos:

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, consulta Concesión de privilegios SELECT o EXECUTE a objetos SYS.

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

Para revocar los privilegios SELECT del usuario en V_$SQLAREA, ejecuta los siguientes comandos:

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, consulta Revocación de los privilegios SELECT o EXECUTE en objetos SYS.

Restablecimiento de los privilegios de usuario maestro

Si has revocado los roles y los privilegios del usuario maestro, puedes restablecerlos. Para obtener más información, consulta ¿Cómo puedo restablecer la contraseña del usuario administrador de mi instancia de base de datos de Amazon RDS?

Concesión de RDS_MASTER_ROLE al usuario maestro

No puedes conceder el rol RDS_MASTER_ROLE a usuarios que no sean maestros. Al crear la instancia de base de datos, SYS crea RDS_MASTER_ROLE de forma predeterminada. Puedes conceder RDS_MASTER_ROLE únicamente al usuario maestro. Para enumerar los usuarios a los que has concedido RDS_MASTER_ROLE, ejecuta el siguiente comando:

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

Resultado de ejemplo:

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

Como el usuario maestro no tiene la opción de administrador, no puedes conceder RDS_MASTER_ROLE a ningún otro usuario. Para obtener más información, consulta Concesión de privilegios a usuarios que no son maestros.

Revocación de los privilegios de rol PUBLIC para paquetes clave DBMS_* y UTL_*

No se recomienda revocar los privilegios de rol PUBLIC para los paquetes clave DBMS_* y UTL_* porque varias aplicaciones de Oracle dependen de los privilegios. 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.

Resolución del error «invalid schema» al crear un rol con una contraseña

Por ejemplo, usaste rdsadmin_util.grant_sys_object para crear un rol con contraseña y conceder privilegios en los siguientes comandos:

SQL> CREATE ROLE ROLE_NAME IDENTIFIED BY EXAMPLE-PASSWORD;   
SQL> EXEC rdsadmin.rdsadmin_util.grant_sys_object('DBMS_JOB', 'ROLE_NAME');

En el resultado del comando, 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, ejecuta el siguiente comando para crear un rol sin contraseña:

SQL> ALTER ROLE ROLE_NAME NOT IDENTIFIED;

Resolución del error «ORA-01031: insufficient privileges»

Los siguientes son ejemplos de casos prácticos que pueden provocar el error ORA-01031.

Ejecutas el comando ALTER SYSTEM SET

El error ORA-01031 se produce al ejecutar el siguiente comando:

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

No puedes cambiar los valores de los parámetros de un grupo de parámetros de base de datos predeterminado. En su lugar, modifica los valores de los parámetros de un grupo de parámetros de base de datos personalizado.

Utilizas un desencadenador de base de datos y los cambios en la estructura de la tabla subyacente cambian el estado del desencadenador a NO VÁLIDO

La próxima vez que un evento libere el desencadenador, se producirá un error en la compilación implícita del desencadenador y aparecerá el siguiente mensaje:

«RA-04045: errors during recompilation/revalidation of SCOTT.ERROR_LOG_TRIGORA-01031: insufficient privileges»

Para resolver este problema, ejecuta el siguiente comando para conceder explícitamente el privilegio de administración del desencadenador de la base de datos al propietario del desencadenador, de modo que el propietario pueda modificarlo:

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

Resultado esperado:

Trigger altered.

Ejecutas un procedimiento almacenado

Aparece el error «ORA-01031» porque no puedes usar los privilegios que obtienes de los roles en procedimientos almacenados con nombre que se ejecutan con derechos de definición. En su lugar, utiliza los privilegios que obtienes de los roles en SQL Plus y los bloques PL/SQL anónimos.

El siguiente procedimiento almacenado falla porque el usuario usa los privilegios de un rol que está en un procedimiento almacenado con nombre para crear una tabla. A continuación, el usuario descarta la tabla e intenta utilizar el procedimiento almacenado para crear la misma tabla:

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

El resultado muestra el siguiente error:

«Error report -ORA-01031: insufficient privileges»

Para resolver este problema, conéctate como usuario maestro y, a continuación, ejecuta el siguiente comando para conceder el privilegio CREATE TABLE:

SQL> GRANT CREATE TABLE TO test_user;

Usa el siguiente comando para ejecutar el procedimiento almacenado:

SQL> EXEC TEST_PROC

Resultado esperado:

PL/SQL procedure successfully completed.

No concedes privilegios al usuario maestro con la opción de concesión

El error «ORA-04043» se produce cuando no se concede al usuario maestro un privilegio con la opción de concesión en un objeto.

El procedimiento de concesión del siguiente ejemplo falla porque el usuario maestro no tiene el privilegio SELECT con la opción de concesión en el objeto DBA_TABLESPACE_USAGE_METRICS:

SQL> SHOW USER;  
USER is \"EXAMPLE-USERNAME\"  
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

El resultado muestra el mensaje de error «ERROR: ORA-04043: object "SYS"."DBA_TABLESPACE_USAGE_METRICS" does not exist».

Cuando el usuario maestro intenta conceder a otro usuario el privilegio SELECT en el objeto DBA_TABLESPACE_USAGE_METRICS, el usuario maestro recibe el error «ORA-01031: insufficient privileges».

Para resolver este problema, ejecuta los siguientes comandos para conceder explícitamente el privilegio SELECT con la opción de concesión al usuario maestro:

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;

Tras conceder los privilegios SELECT, el usuario maestro puede ejecutar correctamente el comando SELECT:

SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

Información relacionada

Configuración de la autorización de roles y privilegios en el sitio web de Oracle