Sicurezza a livello di colonna


9

Ho bisogno di una soluzione per nascondere colonne specifiche in una tabella. Abbiamo persone che hanno bisogno di creare report su questo database e in particolare su alcune di queste tabelle con informazioni riservate, ma non sono autorizzati a vedere elementi come stipendio o ssn. È possibile filtrare colonne specifiche per gli utenti?


1
Quale numero di versione di Oracle (10.1 / 10.2 / 11.1 / 11.2) e stai utilizzando Enterprise Edition / Standard Edition, oltre a disporre di opzioni con licenza extra (Oracle Advanced Security, ad esempio)?
Philᵀᴹ,

10g R2 Enterprise Edition. Nessuna funzionalità aggiuntiva concessa in licenza di cui sono a conoscenza.
Robert,

Risposte:


13

Puoi farlo con una vista normale, purché gli utenti coinvolti non abbiano già accesso alla tabella di base.

PER ESEMPIO:

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 si revocano le autorizzazioni per le tabelle in questione e si creano le viste, insieme a un sinonimo per ogni vista degli utenti che ha lo stesso nome della tabella originale, dovrebbe essere trasparente.

PER ESEMPIO:

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>

Puoi farlo anche con Virtual Private Database , ma penso che sia un'opzione con licenza extra costosa. Si utilizza DBMS_RLS per configurare i criteri di sicurezza pertinenti richiesti.


Grazie per la risposta dettagliata In nessun modo sei a conoscenza di filtrare sulla tabella stessa. Questa sarebbe una soluzione molto più pulita per noi in quanto avremo un numero di tabelle per cui farlo. La tua soluzione potrebbe funzionare però.
Robert,

2
Se si revocano le autorizzazioni per le tabelle in questione e si creano le viste, insieme a un sinonimo per ogni utente con lo stesso nome della tabella originale, dovrebbe essere trasparente.
Philᵀᴹ,

Ok ... ha senso. Non stavo pensando di creare sinonimi per l'utente. Quindi devo creare un utente di report, concedere loro l'accesso a tutte le tabelle, quindi rimuovere le tabelle specifiche di cui sono preoccupato. Successivamente, inizia a creare le viste per nascondere le colonne.
Robert,

Sì! Altre domande, sono libero di tornare indietro e chiedere. Non dimenticare di provare :)
Philᵀᴹ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.