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:
- Conectar com o usuário system
- 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';
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;
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
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:
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:
Postar um comentário