Segurança no nível da coluna

9

Estou precisando de uma solução para ocultar colunas específicas em uma tabela. Temos pessoas que precisam criar relatórios nesse banco de dados e, especificamente, algumas dessas tabelas com informações confidenciais, mas não têm permissão para ver itens como salário ou ssn. É possível filtrar colunas específicas para usuários?

Robert
fonte
11
Qual número de versão do oracle (10.1 / 10.2 / 11.1 / 11.2) e você está usando o Enterprise Edition / Standard Edition, além de ter alguma opção de licença extra (Oracle Advanced Security, por exemplo)?
Philᵀᴹ
10g R2 Enterprise Edition. Nenhum recurso licenciado adicional que eu conheça.
Robert

Respostas:

13

Você pode fazer isso com uma exibição normal, desde que os usuários envolvidos ainda não tenham acesso à tabela base.

POR EXEMPLO:

SQL> create user reportuser identified by reportuser;

User created.

SQL> grant create session to reportuser;

Grant succeeded.

SQL> grant create synonym to reportuser;

Grant succeeded.

SQL> select user from dual;

USER
------------------------------
PHIL

SQL> create table basetable
(
  id number primary key,
  viewable varchar2(30),
  secret varchar2(30)
);

Table created.

SQL> insert into basetable values ( 1, 'hello world','this is secret' );

1 row created.

SQL> commit;

Commit complete.

SQL> create view reportview
as
select id, viewable
from basetable;

View created.

SQL> grant select on reportview to reportuser;

Grant succeeded.

SQL> conn reportuser/reportuser
Connected.
SQL> select * from phil.basetable;
select * from phil.basetable
                   *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select secret from phil.basetable;
select secret from phil.basetable
                        *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select * from phil.reportview;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL>

Se você revogar as permissões nas tabelas em questão e criar as visualizações, juntamente com um sinônimo para cada visualização de usuários que tenha o mesmo nome da tabela original, ela deverá ser transparente.

POR EXEMPLO:

SQL> select user from dual;

USER
------------------------------
REPORTUSER

SQL> create synonym basetable for phil.reportview;

Synonym created.

SQL> select * from basetable;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL>

Você também pode fazer isso com o banco de dados virtual privado , mas acho que é uma opção extra licenciada cara. Você usa DBMS_RLS para configurar as políticas de segurança relevantes necessárias.

Philᵀᴹ
fonte
Obrigado pela resposta detalhada. De maneira alguma você está ciente de filtrar a própria tabela real. Essa seria uma solução muito mais limpa para nós, pois teremos várias tabelas para fazer isso. Sua solução pode funcionar.
Robert
2
Se você revogar as permissões nas tabelas em questão e criar as visualizações, juntamente com um sinônimo para cada usuário que tenha o mesmo nome que a tabela original, ela deverá ser transparente.
Philᵀᴹ
Ok ... isso faz sentido. Eu não estava pensando em criar sinônimos para o usuário. Por isso, preciso criar um usuário de relatórios, conceder acesso a todas as tabelas e remover as tabelas específicas que me preocupam. Depois disso, comece a criar as visualizações para ocultar as colunas.
Robert
Sim! Mais alguma pergunta, fique à vontade para voltar e perguntar. Não se esqueça de teste :)
Philᵀᴹ