Como gerencio privilégios e funções de usuário em minha instância de banco de dados do Amazon RDS for Oracle?

Última atualização: 08-11-2021

Tenho uma instância de banco de dados Amazon Relational Database Service (Amazon RDS) executando Oracle. Quero saber o procedimento para gerenciar privilégios e funções de usuário para essa instância de banco de dados.

Breve descrição

Quando você cria uma instância de banco de dados do Amazon RDS for Oracle, o usuário primário padrão é criado e recebe o máximo de permissões de usuário na instância de banco de dados com algumas limitações. Use essa conta para qualquer tarefa administrativa, como criar contas de usuário adicionais no banco de dados. Como o Amazon RDS é um serviço gerenciado, os usuários SYS e SYSTEM não podem ser usados por padrão.

Para obter a lista de funções e privilégios concedidos ao usuário primário do Amazon RDS for Oracle, consulte Privilégios da conta de usuário primário.

Como o Amazon RDS é um serviço gerenciado, não são fornecidos os seguintes privilégios para a função de DBA:

  • ALTERAR BANCO DE DADOS
  • ALTERAR SISTEMA
  • CRIAR QUALQUER DIRETÓRIO
  • SOLTAR QUALQUER DIRETÓRIO
  • CONCEDER QUALQUER PRIVILÉGIO
  • CONCEDER QUALQUER FUNÇÃO

Para obter mais informações, consulte Limitações para privilégios do Oracle DBA.

Resolução

Para conceder privilégios a objetos SYS no Amazon RDS, use o procedimento do Amazon RDS rdsadmin.rdsadmin_util.grant_sys_object. O procedimento concede apenas privilégios que o usuário primário já tenha concedido por meio de uma função ou concessão direta.

Execute um comando semelhante ao seguinte para conceder privilégios SELECT no objeto V_$SQLAREA ao usuário MYUSER:

Faça login como o usuário primário do RDS e execute o seguinte procedimento:

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

Execute um comando semelhante ao seguinte para conceder privilégios SELECT no objeto V_$SQLAREA ao usuário MYUSER com opção de concessão:

Observação: use maiúsculas para definir todos os valores de parâmetros a menos que você tenha criado o usuário com um identificador que diferencia maiúsculas de minúsculas.

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

Execute as seguintes consultas para conceder as funções SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE ao usuário MYUSER com a opção admin. Com essas funções, MYUSER pode conceder acesso a objetos SYS que foram concedidos a SELECT_CATALOG_ROLE e EXECUTE_CATALOG_ROLE.

SQL> GRANT SELECT_CATALOG_ROLE TO MYUSER WITH ADMIN OPTION;
SQL> GRANT EXECUTE_CATALOG_ROLE to MYUSER WITH ADMIN OPTION;

Execute as seguintes consultas para exibir as concessões associadas à função 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 obter mais informações, consulte Conceder privilégios SELECT ou EXECUTE para objetos SYS.

Para revogar privilégios em um único objeto, use o procedimento RDS rdsadmin.rdsadmin_util.revoke_sys_object.

Execute o seguinte comando para revogar privilégios SELECT no objeto V_$SQLAREA do usuário MYUSER:

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

Para obter mais informações, consulte Revogar privilégios SELECT ou EXECUTE em objetos SYS.

Use uma ou mais das seguintes opções de solução de problemas com base no seu caso de uso.

Redefinir os privilégios do usuário primário

Se você revogou as funções e os privilégios do usuário primário, poderá redefini-los alterando a senha do usuário primário da sua instância de banco de dados do RDS.

Conceder RDS_MASTER_ROLE a usuários não primários

A função RDS_MASTER_ROLE não pode ser concedida a usuários não primários. Essa função é criada por SYS por padrão quando a instância de banco de dados é criada. O RDS_MASTER_ROLE deve ser concedido somente ao usuário primário. Execute a seguinte consulta para listar os usuários que receberam o RDS_MASTER_ROLE:

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

A saída é semelhante à seguinte:

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

Você pode notar na resposta da consulta que o usuário primário não tem a opção admin. Portanto, a função RDS_MASTER_ROLE não pode ser concedida a nenhum outro usuário.

Para obter mais informações, consulte Conceder privilégios a usuários não primários.

Revogar privilégios concedidos a PUBLIC

Revogar privilégios PUBLIC para pacotes DBMS_* e UTL_* principais não é uma prática recomendada porque vários aplicativos Oracle são projetados para confiar nesses privilégios. Para obter mais informações, consulte MOSC Doc 247093.1. Os principais pacotes DBMS_* e UTL_* incluem UTL_TCP, UTL_HTTP, HTTPURITYPE, UTL_INADDR, UTL_SMTP, DBMS_LDAP, DBMS_LOB, UTL_FILE, DBMS_ADVISOR, DBMS_OBFUSCATION_TOOLKIT, DBMS_BACKUP_RESTORE, e DBMS_SYS_SQL.

Solução de problemas de erro ao criar uma função com senha

Suponha que você execute a seguinte consulta para criar uma função com senha e conceder privilégios usando o rdsadmin_util.grant_sys_object:

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

Em seguida, você visualiza o seguinte erro:

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 esse problema, crie uma função sem uma senha.

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

Solução de problemas do erro ORA-01031: privilégios insuficientes

A seguir estão alguns exemplos de casos de uso em que você pode visualizar esse erro:

Você executou a consulta ALTER SYSTEM. Por exemplo, a seguinte consulta falha com o erro ORA-01031:

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

Em vez disso, você pode modificar os valores de parâmetros em um grupo de parâmetros de banco de dados personalizado. No entanto, você não pode alterar os valores dos parâmetros em um grupo de parâmetros do banco de dados padrão.

Você está usando um acionador de banco de dados e suas alterações na estrutura da tabela subjacente fizeram com que o status do acionador se tornasse INVÁLIDO. Na próxima vez que o acionador for disparado, você poderá notar que a compilação implícita do acionador falhará com o seguinte erro:

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

Para corrigir esse problema, conceda o privilégio de administração do acionador do banco de dados ao proprietário do acionador explicitamente. Esse privilégio é necessário para alterar o acionador do banco de dados com êxito:

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

Você executou um procedimento armazenado. Você visualiza esse erro ao executar um procedimento armazenado, porque os privilégios adquiridos com o uso de funções não funcionam em procedimentos armazenados nomeados que são executados com os direitos do definidor. Esses privilégios funcionam no SQL Plus e em blocos PL/SQL anônimos.

Exemplo:

SQL> CREATE USER MYUSER IDENTIFIED BY PASSWORD;
SQL> GRANT connect, resource TO MYUSER

-- Connect as MYUSER
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 corrigir esse problema, conecte-se como usuário primário e conceda os privilégios necessários explicitamente.

Exemplo:

-- Connect as master user and grant the CREATE TABLE privilege.
SQL> GRANT CREATE TABLE TO test_user;
-- Connect as MYUSER
SQL> EXEC TEST_PROC
PL/SQL procedure successfully completed.

O usuário primário não recebe os privilégios com a opção de concessão. Você pode visualizar esse erro quando as seguintes condições forem verdadeiras:

  • O usuário primário não recebe um determinado privilégio em um objeto com a opção de concessão.
  • O usuário primário tenta conceder esse privilégio a outro usuário.

Para corrigir esse problema, conceda os privilégios necessários explicitamente ao usuário primário com a opção de concessão.

Exemplo:

SQL> SHOW USER;
USER is "MYUSER"

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 MYUSER;
GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to MYUSER
                    *
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 MYUSER;

-- After the privileges are granted, connect to MYUSER and then query DBA_TABLESPACE_USAGE_METRICS.
SQL> SELECT * FROM SYS.DBA_TABLESPACE_USAGE_METRICS;

Este artigo foi útil?


Precisa de ajuda com faturamento ou suporte técnico?