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.
Poster un Commentaire