domingo, 15 de março de 2009

Oracle - Protegendo o Dicionário de dados

Usuários que não possuem privilégio de administrador, não precisam ter acesso ao dicionário de dados, mas terão acesso caso for atribuído ao usuário algum privilégio do tipo

  • select any table.....
  • update any table....etc

O dicionário de dados contem informações que podem ser utilizados por usuários mal intencionados para invadir ou danificar o sistema.

Mesmo atribuindo privilégios * any table ao usuário, se você desejar que ele não tenha acesso as tabelas do dicionário, basta alterar o parâmetros do Oracle - 07_DICTIONARY_ACCESSIBILITY como false, segue o exemplo de como alterar o parâmetro:

  1. Conectar com o usuário system
  2. Vamos verificar qual o valor do parâmetro executando a seguinte consulta

select v.value from v$parameter v
where v.name = 'O7_DICTIONARY_ACCESSIBILITY';

parametro1

Podemos observar que o valor em nossa base esta como FALSE, o que significa que mesmo atribuindo privilégios a usuários com * any table os mesmo não terão acesso as tabelas do dicionário de dados, então vamos fazer um teste.

4. Logado ainda como system atribui o privilégio de select any table para um usuário conforme a seguir:

grant select any table to <Nome_Usuario>;

5. Logar com o usuário a quem foi concedido o privilégio de select any table, executar a seguinte consulta

select * from v$parameter v;

parametro2

Perceba que foi retornado um erro dizendo que a tabela ou view não existe, pois mesmo tendo privilégio de select any table como o parâmetro 07_DICTIONARY_ACCESSIBILITY esta com o valor FALSE, não permite que o usuário realize consultas nas tabelas do dicionário de dados

Agora vamos alterar o parâmetro 07_DICTIONARY_ACCESSIBILITY para o valor TRUE para vermos o resultado.

6. Logado como system, executar o seguinte comando:

ALTER SYSTEM SET O7_DICTIONARY_ACCESSIBILITY = true SCOPE=spfile

parametro3

Vejam que o parâmetro foi alterado com sucesso, pra certificarmos vamos executar a consulta novamente na tabela V$PARAMETER, onde o valor do parâmetro dessa vez deve retornar TRUE.

select v.value from v$parameter v
where v.name = 'O7_DICTIONARY_ACCESSIBILITY';

O resultado ainda continua como FALSE, porque?

Isso porque, para que o parâmetro venha a ter o seu novo valor, é necessário reiniciar o banco de dados, então vamos lá, logado como system siga os comandos conforme a figura abaixo:

parametro4

Depois de alterado o valor do parâmetro para TRUE, observamos com a consulta na tabela v$parameter que o valor continuava como FALSE, mas depois de reiniciar o banco de dados (shutdown immediate e startup) ao realizar a consulta novamente o parâmetro foi alterado para TRUE.

Agora, logado com o mesmo usuário que foi concedido permissão de select any table anteriormente vamos fazer a seguinte consulta novamente:

select * from v$parameter v;

Agora não é retornado mais o erros que a tabela ou view não existe e a consulta é realizada.

Para usuários que não terão privilégio de administrador e mesmo assim deverão ter acesso a uma ou mais tabelas do dicionário de dados com o parâmetro O7_DICTIONARY_ACCESSIBILITY' tendo o valor FALSE, como fazer?

FÁCIL, você pode fornecer esse acesso da seguinte maneira:

  • usando GRANT padrão, permitindo acessar determinadas tabelas do dicionário de dados, exemplo:

GRANT SELECT ON DBA_TABLES TO <NOME_USUARIO>;

  • concedendo o privilégio de sistema SELECT ANY DICTIONARY, que irá permitir que o usuário tenha acesso de consulta em todas as tabelas do dicionário de dados, exemplo

GRANT SELECT ANY DICTIONARY TO <NOME_USUARIO>;

A menos que necessário , não é recomendado atribuir a permissão de consulta ao usuário de todas as tabelas o dicionário de dados caso o mesmo não ira fazer uso de todas as tabelas, o mais recomendado é atribuir os grants específicos para cada tabela que será utilizada.

No Oracle10g e 9i, o parâmetros 07_DICTIONARY_ACESSIBILITY, vem como default o valor FALSE, em versões anteriores o valor default é TRUE, portanto para versões anteriores ao 10G e 9i, esse parâmetro deve ser alterado manualmente para que o usuário não venha a ter acesso ao dicionário de dados.

Mas muito cuidado ao definir o parâmetro 07_DICTIONARY_ACESSIBILITY como o valor TRUE, pois qualquer usuário por exemplo com privilégio de DROP ANY TABLE, será capaz de excluir a tabela do dicionário de dados de forma acidental ou intencional.

Até a próxima..

Nenhum comentário: