Bezpieczeństwo na poziomie kolumny

9

Potrzebuję rozwiązania, aby ukryć określone kolumny w tabeli. Mamy ludzi, którzy muszą tworzyć raporty na podstawie tej bazy danych, a szczególnie niektóre z tych tabel z poufnymi informacjami, ale nie mogą widzieć takich elementów, jak wynagrodzenie lub ssn. Czy można filtrować określone kolumny dla użytkowników?

Robert
źródło
1
Jaki numer wersji wyroczni (10.1 / 10.2 / 11.1 / 11.2) i czy korzystasz z wersji Enterprise Edition / Standard Edition, czy masz dodatkowe licencjonowane opcje (na przykład Oracle Advanced Security)?
Philᵀᴹ
10g R2 Enterprise Edition. Żadnych dodatkowych licencjonowanych funkcji, o których wiem.
Robert

Odpowiedzi:

13

Możesz to zrobić w normalnym widoku, o ile zaangażowani użytkownicy nie mają jeszcze dostępu do tabeli podstawowej.

NA PRZYKŁAD:

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>

Jeśli cofniesz uprawnienia do danych tabel i utworzysz widoki wraz z synonimem każdego widoku użytkownika, który ma taką samą nazwę jak oryginalna tabela, powinna być przezroczysta.

NA PRZYKŁAD:

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>

Możesz to również zrobić za pomocą wirtualnej prywatnej bazy danych , ale myślę, że jest to droga, dodatkowa licencjonowana opcja. Korzystasz z DBMS_RLS, aby skonfigurować odpowiednie wymagane zasady bezpieczeństwa.

Philᵀᴹ
źródło
Dziękuję za szczegółową odpowiedź. W żaden sposób nie wiesz, jak filtrować samą tabelę. To byłoby dla nas o wiele czystsze rozwiązanie, ponieważ będziemy mieli do tego kilka tabel. Twoje rozwiązanie może jednak działać.
Robert
2
Jeśli cofniesz uprawnienia do danych tabel i utworzysz widoki wraz z synonimem dla każdego użytkownika o takiej samej nazwie jak oryginalna tabela, powinna ona być przezroczysta.
Philᵀᴹ
Ok ... to ma sens. Nie myślałem o stworzeniu synonimów dla użytkownika. Muszę więc utworzyć użytkownika raportującego, przyznać mu dostęp do wszystkich tabel, a następnie usunąć te, o które się martwię. Następnie zacznij tworzyć widoki, aby ukryć kolumny.
Robert
Tak! W razie jakichkolwiek pytań mogłem odpaść i zapytać. Nie zapomnij przetestować :)
Philᵀᴹ