Essa é o início de uma série de artigos sobre proteção e segurança no banco de dados Oracle. Hoje estaremos falando sobre o controle de acesso ao dicionário de dados através do parâmetro de inicialização O7_DICTIONARY_ACCESSIBILITY.
De acordo com a documentação Oracle, esse parâmetro controla as restrições no privilégio de sistema. Caso esse parâmetro esteja habilitado (true) o acesso aos objetos SYS (consequentemente ao dicionário de dados) é permitida.
Vamos a um exemplo, veja que o parâmetro O7_DICTIONARY_ACCESSIBILITY está definido como false (padrão), assim mesmo que o usuário tenha privilégio de SELECT ANY TABLE ele não consegue acessas as tabelas do SYS. O mesmo vale para o privilégio EXECUTE ANY PROCEDURE, que permite executar qualquer procedure exceto as do usuário SYS, caso o parâmetro O7_DICTIONARY_ACCESSIBILITY esteja como false.
FSOARES@dbtst> create user usr1 identified by oracle; User created. FSOARES@dbtst> grant connect, resource to usr1; Grant succeeded. FSOARES@dbtst> grant select any table to usr1; Grant succeeded. FSOARES@dbtst> show parameter o7 NAME TYPE VALUE ---------------------------------------------- ----------- ------- O7_DICTIONARY_ACCESSIBILITY boolean FALSE
Veja que criamos um usuário chamado usr1 e definimos a ele a permissão de SELECT ANY TABLE, porém o parâmetro O7_DICTIONARY_ACCESSIBILITY está definido como false, veja o que acontece caso o usuário USR1 tente selecionar qualquer tabela do usuário SYS.
USR1@dbtst> select name, password from sys.user$;
select name, password from sys.user$
*
ERROR at line 1:
ORA-00942: table or view does not exist
Mesmo com o privilégio SELECT ANY TABLE o usuário USR1 não consegue acessar as informações do schema SYS.
Vamos agora, inverter os papéis agora. Com o parâmetro O7_DICTIONARY_ACCESSIBILITY como true vamos ver o que acontece com as permissões no dicionário de dados:
SQL> alter system set O7_DICTIONARY_ACCESSIBILITY=TRUE scope=spfile; System altered. SQL> shut immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 845348864 bytes Fixed Size 1348216 bytes Variable Size 465571208 bytes Database Buffers 373293056 bytes Redo Buffers 5136384 bytes Database mounted. Database opened. SQL> show parameter O7_DICTIONARY_ACCESSIBILITY NAME TYPE VALUE ------------------------------------ ----------- ----- O7_DICTIONARY_ACCESSIBILITY boolean TRUE USR1@dbtst> select name, password from sys.user$; NAME PASSWORD ------------------------------ -------------------- SYS 8A8F025737A9097A PUBLIC CONNECT RESOURCE DBA SYSTEM 2D594E86F93B17A1 SELECT_CATALOG_ROLE EXECUTE_CATALOG_ROLE DELETE_CATALOG_ROLE OUTLN 4A3BA55E08595C81 EXP_FULL_DATABASE IMP_FULL_DATABASE LOGSTDBY_ADMINISTRATOR DBFS_ROLE DIP CE4A36B8E06CA59C AQ_ADMINISTRATOR_ROLE AQ_USER_ROLE DATAPUMP_EXP_FULL_DATABASE DATAPUMP_IMP_FULL_DATABASE ADM_PARALLEL_EXECUTE_TASK GATHER_SYSTEM_STATISTICS JAVA_DEPLOY ORACLE_OCM 5A2E026A9157958C .. HR 6399F3B38EDF3288 OE 9C30855E7E0CB02D IX 2BE6F80744E08FEB SH 9793B3777CD3BD1A PM 72E382A52E89575A BI FA1D2B85B70213F3 FSOARES 3B789FED9DDFE9B9 USR1 8FFA74CCAD48CE21 USR2 6102DC4A88E79D5A
Com a conclusão dos testes acima, fica claro a grande necessidade de deixar o parâmetro O7_DICTIONARY_ACCESSIBILITY sempre como false, permitindo que qualquer sessão não pode obter informações sigilosas que são destinadas apenas ao Oracle e do DBA.
