Grant roles to PL/SQL packages and standalone programs

Ao se trabalhar com packages, functions e/ou procedures temos duas opções com respeito aos privilégios que serão utilizados ao tentar executar algum desses programas. A primeira opção é ser executado com os privilégios de quem é o dono do objeto, owner. Isso seria o AUTHID DEFINER. A outra opção seria criar um programa deste para ser executado com os privilégios de quem executou o programa, INVOKER, neste caso seria o AUTHID CURRENT_USER.

Ambas as opções tem os seus propósitos. Por exemplo, ao se criar com a opção DEFINER, que é o default, podemos sem querer expor indevidamente algumas funcionalidades aos outros usuários com permissão de execução neste programa. E ao se criar com os privilégios do INVOKER, o programa pode não funcionar por falta de privilégios.

A partir da versão 12c do Oracle, foi introduzida uma feature chamada de code based access control (CBAC). Permitindo que seja concedido roles para estes programas, assim, liberando o privilégio para o programa mas não para o usuário que irá executar. Assim o objeto será executado com os privilégios de quem executou mais os privilégios concedidos a role, no caso de um objeto criado com o AUTHID CURRENT_USER.

Para demonstrar como criar um CBAC, vamos criar dois usuários e dar as devidas permissões a cada um.


conn system/oracle

CREATE USER tercio IDENTIFIED BY oraclepress;

CREATE USER user_teste_grant IDENTIFIED BY oraclepress;

GRANT CREATE SESSION TO tercio;

GRANT CREATE SESSION TO user_teste_grant;

GRANT CREATE PROCEDURE TO TERCIO;

GRANT SELECT ON SYS.DBA_TABLES TO TERCIO;

Foi criados dois usuários, usuário tercio e usuário user_teste_grant. Ambos podem se conectar ao banco. E para finalizar o usuário tercio pode criar functions ou procedures e pode consultar a tabela DBA_TABLES.

Para dar início ao nosso teste, vamos criar agora uma function com o usuário tercio.

CREATE OR REPLACE FUNCTION tercio.teste_grant 
RETURN NUMBER 
AUTHID CURRENT_USER
AS
 v_count NUMBER;
BEGIN
 SELECT COUNT(*)
 INTO v_count
 FROM sys.dba_tables;
 RETURN v_count;
END;

Veja que a function foi criada para utilizar os privilégios do invoker, CURRENT_USER. Ou seja, se quem executar essa function não tiver privilégios de SELECT na tabela DBA_TABLES, irá lançar um erro ORA-00940: table or view does not exist! Que seria o nosso caso se fosse executado com o usuário user_teste_grant. Agora, vamos criar um CBAC, e desta maneira o nosso usuário user_teste_grant poderá executar a function mesmo sem privilégios na tabela mencionada.


CREATE ROLE test_grant_programs;
GRANT test_grant_programs TO tercio;
GRANT test_grant_programs to function tercio.teste_grant;
GRANT SELECT ON DBA_TABLES TO test_grant_programs;
GRANT EXECUTE ON tercio.teste_grant TO user_teste_grant;

Primeiramente foi criada uma ROLE, com o nome test_grant_programs. Essa role foi concedida ao usuário tercio, isso é uma obrigatoriedade para CBAC funcionar. A role deve ser criada diretamente pelo owner do objeto ou ser concedida ao owner do objeto. Logo após, na linha 3, foi concedida a role a function anteriormanete. Na linha 4 foi dado o privilégio de ler a tabela DBA_TABLES para a role. E na última linha foi dado o privilégio de executar a function ao usuário user_teste_grant.

Vamos ver o uso realizando alguns testes.


[oracle@localhost db_1]$ sqlplus user_teste_grant/oraclepress

SQL*Plus: Release 12.2.0.1.0 Production on Mon Apr 2 16:47:10 2018

Copyright (c) 1982, 2016, Oracle. All rights reserved.

Last Successful login time: Mon Apr 02 2018 16:46:27 -04:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> SELECT tercio.teste_grant FROM dual;

TESTE_GRANT
-----------
2652

SQL> SELECT COUNT(*) FROM sys.dba_tables;
SELECT COUNT(*) FROM sys.dba_tables
*
ERROR at line 1:
ORA-00942: table or view does not exist

SQL>

Veja que mesmo sem privilégios na tabela DBA_TABLES o usuário conseguiu executar a function. Mas ao tentar executar um SELECT direto na tabela foi exibido um erro, mesmo erro aconteceria ao tentar executar a function caso não fosse feito um CBAC. Isso pode ser feito tanto para Packages, como Procedures e Functions. A Sintaxe pode ser conferida nas imagens abaixo, seguindo a linha de grant_roles_to_programs.

grant::=

grant_roles_to_programs::=

program_unit::=

 

Anúncios

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com: , , , , , ,
Publicado em Sem categoria

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Esse Blog é reconhecido pela
Certificações
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE Associate por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 138.077 Visualizações
%d blogueiros gostam disto: