Sécurité au niveau des colonnes


9

J'ai besoin d'une solution pour masquer des colonnes spécifiques dans une table. Nous avons des personnes qui ont besoin de créer des rapports sur cette base de données et en particulier certaines de ces tables avec des informations confidentielles mais ne sont pas autorisées à voir des éléments comme le salaire ou le SSN. Est-il possible de filtrer des colonnes spécifiques pour les utilisateurs?


1
Quel numéro de version d'Oracle (10.1 / 10.2 / 11.1 / 11.2) et utilisez-vous Enterprise Edition / Standard Edition, plus avez-vous des options sous licence supplémentaires (Oracle Advanced Security, par exemple)?
Philᵀᴹ

10g R2 Enterprise Edition. Pas de fonctionnalités sous licence supplémentaires à ma connaissance.
Robert

Réponses:


13

Vous pouvez le faire avec une vue normale, tant que les utilisateurs impliqués n'ont pas déjà accès à la table de base.

PAR EXEMPLE:

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>

Si vous révoquez les autorisations sur les tables en question et créez les vues, ainsi qu'un synonyme pour chaque vue des utilisateurs portant le même nom que la table d'origine, elle doit être transparente.

PAR EXEMPLE:

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>

Vous pouvez également le faire avec Virtual Private Database , mais je pense que c'est une option sous licence supplémentaire coûteuse. Vous utilisez DBMS_RLS pour configurer les politiques de sécurité pertinentes dont vous avez besoin.


Merci pour la réponse détaillée. Pas question de filtrer sur la table elle-même. Ce serait une solution beaucoup plus propre pour nous car nous allons avoir un certain nombre de tableaux pour cela. Votre solution pourrait cependant fonctionner.
Robert

2
Si vous révoquez les autorisations sur les tables en question et créez les vues, ainsi qu'un synonyme pour chaque utilisateur portant le même nom que la table d'origine, il doit être transparent.
Philᵀᴹ

Ok ... ça a du sens. Je ne pensais pas à créer des synonymes pour l'utilisateur. Je dois donc créer un utilisateur de génération de rapports, leur accorder l'accès à toutes les tables, puis supprimer les tables spécifiques qui m'inquiètent. Après cela, créez les vues pour masquer les colonnes.
Robert

Ouaip! Plus de questions, n'hésitez pas à revenir et à demander. N'oubliez pas de tester :)
Philᵀᴹ
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.