Sécuriser l’accès aux données avec Oracle Virtual Private Database (VPD)

Virtual Private Database (VPD) d’Oracle est une fonctionnalité puissante qui permet de contrôler finement l’accès aux données. Concrètement, elle ajoute automatiquement une clause WHERE aux requêtes SQL qu’un utilisateur exécute, en fonction de son identité. Cela signifie que chaque utilisateur ne voit que les données auxquelles il est autorisé à accéder.

Grâce à cette approche, vous pouvez restreindre l’accès aux lignes ou aux colonnes d’une table, sans avoir à modifier vos applications. La politique de sécurité s’applique directement au niveau de la table ou de la vue, ce qui simplifie grandement la gestion des droits d’accès.

Dans un environnement multitenant, cette politique VPD est propre à chaque pluggable database (PDB), ce qui garantit un cloisonnement clair entre les différentes bases embarquées.

Dans cet article, nous allons voir comment mettre en œuvre cette fonctionnalité dans une base Oracle . L’objectif : appliquer une politique de sécurité sur la table EMP du schéma SCOTT, afin que chaque utilisateur ne puisse consulter que ses propres données.

Commençons par jeter un œil au contenu de la table EMP.

SQL> select * from scott.emp;

     EMPNO ENAME      JOB               MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- ---------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK            7902 17/12/1980 00:00:00        800                    20
      7499 ALLEN      SALESMAN         7698 20/02/1981 00:00:00       1600        300         30
      7521 WARD       SALESMAN         7698 22/02/1981 00:00:00       1250        500         30
      7566 JONES      MANAGER          7839 02/04/1981 00:00:00       2975                    20
      7654 MARTIN     SALESMAN         7698 28/09/1981 00:00:00       1250       1400         30
      7698 BLAKE      MANAGER          7839 01/05/1981 00:00:00       2850                    30
      7782 CLARK      MANAGER          7839 09/06/1981 00:00:00       2450                    10
      7788 SCOTT      ANALYST          7566 09/12/1982 00:00:00       3000                    20
      7839 KING       PRESIDENT             17/11/1981 00:00:00       5000                    10
      7844 TURNER     SALESMAN         7698 08/09/1981 00:00:00       1500          0         30
      7876 ADAMS      CLERK            7788 12/01/1983 00:00:00       1100                    20
      7900 JAMES      CLERK            7698 03/12/1981 00:00:00        950                    30
      7902 FORD       ANALYST          7566 03/12/1981 00:00:00       3000                    20
      7934 MILLER     CLERK            7782 23/01/1982 00:00:00       1300                    10

14 rows selected.
Langage du code : JavaScript (javascript)

La première étape consiste à créer deux utilisateurs — par exemple jones et miller — puis à leur accorder les privilèges nécessaires.

SQL> create user jones  identified by "****" default tablespace users ;
User created.
SQL>  grant select on emp to jones;
Grant succeeded.
SQL> create user miller identified by "****" default tablespace users ;
User created.
SQL> grant select on emp to miller;
Grant succeeded.
SQL> grant create session to jones;
Grant succeeded.
SQL>  grant create session to miller;
Grant succeeded.Langage du code : JavaScript (javascript)

Une fois les utilisateurs créés, il faut définir la fonction qui sera utilisée pour créer la politique VPD.

CREATE OR REPLACE FUNCTION emp_policy
     (object_schema IN VARCHAR2,object_name in varchar2)
    RETURN VARCHAR2 IS
      BEGIN
       RETURN 'upper(ename) = SYS_CONTEXT(''USERENV'', ''CURRENT_USER'')';
      END;
      /
Function created.Langage du code : PHP (php)

Avec cette fonction, Oracle ajoutera la clause suivante à chaque requête sur la table emp.


Where  upper(ename) = SYS_CONTEXT('USERENV', 'CURRENT_USER')
Langage du code : JavaScript (javascript)


Créons maintenant la politique VPD.

SQL>
BEGIN
      SYS.DBMS_RLS.ADD_POLICY(
        object_schema   => 'scott',
        object_name     => 'emp',
        policy_name     => 'emp_vpd_policy',
        function_schema => 'system',
        policy_function => 'emp_policy',
        statement_types => 'select'
     );
  END;
    /
PL/SQL procedure successfully completed.Langage du code : PHP (php)

Nous pouvons ensuite vérifier que chaque utilisateur ne voit que ses propres données.

--Miller User
sqlplus miller/****@PDB1
SQL> select * from scott.emp;

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------
      7934 MILLER                         CLERK                             7782 23/01/1982 00:00:00       1300                    10


--Jones User
sqlplus jones/****@PDB1
SQL> select * from scott.emp;

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ------------------------------ --------------------------- ---------- ------------------- ---------- ---------- ----------
      7566 JONES                          MANAGER                           7839 02/04/1981 00:00:00       2975                    20
Langage du code : JavaScript (javascript)

Il convient de noter que le privilège système EXEMPT ACCESS POLICY permet à un utilisateur d’être exempté de toutes les politiques de contrôle d’accès (comme celles définies par VPD) lors des opérations DML telles que SELECT, INSERT, UPDATE et DELETE.

Si un utilisateur dispose de ce privilège, alors aucune politique VPD ni Oracle Label Security ne s’applique à ses accès aux données. Autrement dit, les restrictions normalement imposées par ces politiques sont ignorées pour cet utilisateur.

Soyez le premier à commenter

Poster un Commentaire

Votre adresse de messagerie ne sera pas publiée.


*