miércoles, 19 de enero de 2011

Implementando Oracle Virtual Private Database

Virtual Private Database (VPD) es una de las funcionalidades que nos brinda Oracle Enterprise Edition  para poder realizar restricciones a nivel de filas esto también se podría realizar con vistas o variables de contexto, pero es mucho más simple con VPD. Aquí va un ejemplo de cómo podemos realizarla





**** Nos conectamos como usuarios Sys
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jan 13 13:04:06 2011
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - Production


*** Creamos el usuario que contendrá las politicas de la VPD ********
SQL> create user us_pol identified by test ;
User created.

*** Usuario que consultara los datos filtrados con VPD ********
SQL> create user us_con identified by test;
User created.

*** Asignamos privilegios de acceso **********
SQL>grant create session to us_pol;
Grant succeeded.
SQL>grant create session to us_con;
Grant succeeded.

***** Asignar permiso sobre el Paquete  dms_rls ***
SQL> GRANT EXECUTE ON dbms_rls TO us_pol;
Grant succeeded.

SQL> Grant create procedure to us_pol;
Grant succeeded.

 *** Privilegios para consultar la tabla empleados y departamentos}
*** Al usuario de consulta
SQL> grant select on scott.emp   to us_con;
Grant succeeded.
SQL> grant select on scott.dept  to us_con;
Grant succeeded.

*** Con el usuario que contendra las politicas
*** Creamos la funcion que realiza el filtrado a nivel de filas

SQL> connect us_pol/test@TEST
Connected.
*** Creamos la funcion con la politica que el usuario solo pueda consultar
*** los datos del departmento 30
SQL> CREATE OR REPLACE FUNCTION F_pol_dept(P_Esquema IN VARCHAR2, P_objeto IN VARCHAR2)
  2  RETURN VARCHAR2 AS
  3    Restriccion VARCHAR2 (200);
  4    Usuario Varchar2(100);
  5  BEGIN
  6    Select user  7    into Usuario from dual;
  8    if Usuario ='US_CON' then
  9       Restriccion:= 'deptno=30';
 10    end if;
 11    RETURN (Restriccion);
 12  END F_pol_dept;
 13  /
Function created.

******* La función debe tener esta estructura
FUNCTION policy_function (object_schema IN VARCHAR2, object_name VARCHAR2)
        RETURN VARCHAR2
    --- object_schema El esquema que es dueño de la tabla o vista
    --- object_name  Es el nombre de la tabla, vista o sinonimo al cual se le aplica la politica.

 ******* Adicionamos la politica con el paquete DBMS_RLS
SQL> BEGIN
  2    DBMS_RLS.ADD_POLICY (object_schema     => 'scott',
  3                         object_name       => 'emp',
  4                         policy_name       => 'Pol_emp',
  5                         function_schema   => 'us_pol',
  6                         policy_function   => ' F_pol_dept',
  7                        sec_relevant_cols => 'deptno');
  8  END;
  9  /
PL/SQL procedure successfully completed.

El paquete DBMS_RLS (Row Level Security) tienes diferentes parametros como son:
DBMS_RLS.ADD_POLICY (
   object_schema           IN VARCHAR2 NULL,
   object_name              IN VARCHAR2,
   policy_name              IN VARCHAR2,
   function_schema        IN VARCHAR2 NULL,
   policy_function          IN VARCHAR2,
   statement_types         IN VARCHAR2 NULL,
   update_check            IN BOOLEAN  FALSE,
   enable                       IN BOOLEAN  TRUE,
   static_policy              IN BOOLEAN  FALSE,
   policy_type                IN BINARY_INTEGER NULL,
   long_predicate           IN BOOLEAN  FALSE,
   sec_relevant_cols      IN VARCHAR2,
   sec_relevant_cols_opt    IN BINARY_INTEGER NULL);

* Object_schema  = Esquema que contiene la tabla o el synonimo
* Object_name = Nombre de la tabla, vista o sinonimo al cual le añadiremos la politica
* Policy_group = Nombre del grupo de politicas al que pertenece
* Policy_name = Como llamaremos a la politica. Debe ser unico para la misma tabla o vista
* Funcion_schema = Esquema donde se encuentra la funcion con la politica de restriccion
* Policy_funcion = Nombre de la funcion que genera la politica
* Statement_types =  = Tipos de Sentencias en las cuales aplica la politica INDEX,
   SELECT,  INSERT,  UPDATE, or DELETE  por defecto aplica todas exepto index.
* Update_check = Si es verdadero hace que para Insert o Update, se chequee
   la politica contra los valores actualizados o insertados en la sentencia, una vez
   esta se halla realizado.
* Enable = El valor por defecto es verdadero y significa que esta habilitada
* Static_policy = Por defecto es falso, si es verdadera se asume que la funcion
    de restriccion  produce la misma sentencia para cualquiera que esta accesando
    al objecto excepto SYS o un    usuario que este excento del acceso a la politica.
* Policy_type = Por defecto es nulo, significa que la politica esta definida por el parametro
   static_policy ,  los  tipos de politica son STATIC, SHARED STATIC,
   CONTEXT_SENSITIVE  SHARED_CONTEXT_SENSITIVE,DYNAMIC.
* Long_predicate =El valor Por defecto es falso, significa que la funcion que contiene la
   politica puede returna una sentecia con una longitud hasta a 4000 bytes, verdadero
   significa que la longitud de la cadena que retorna puede ser de hasta 32k
* Sec_relevant_cols = Habilita VPD A nivel de columna. esto forza a chequear la politica
   de seguridad cuando una columna que contiene información sensitiva es referenciada
   por un query. aplica a tablas, vitas, se especifica la lista de columnas,separadas por
   coma o espacio.

*** Una vez creamos la función podemos adicionar la politica
****** Adicionamos la politica en la tabla empleados
SQL> BEGIN
  2    DBMS_RLS.ADD_POLICY (object_schema     => 'scott',
  3                         object_name       => 'emp',
  4                         policy_name       => 'Pol_emp',
  5                         function_schema   => 'us_pol',
  6                         policy_function   => ' F_pol_dept',
  7                        sec_relevant_cols => 'deptno');
  8  END;
  9  /
PL/SQL procedure successfully completed.

***Adicionamos la politica en la tabla departamentos
SQL> BEGIN
  2    DBMS_RLS.ADD_POLICY (object_schema     => 'scott',
  3                         object_name       => 'dept',
  4                         policy_name       => 'Pol_dept',
  5                         function_schema   => 'us_pol',
  6                         policy_function   => ' F_pol_dept',
  7                        sec_relevant_cols => 'deptno');
  8  END;
  9  /


 *** Nos conectamos con el usuario de consulta
SQL> connect us_con/test@TEST;
Connected.

*** Generamos la consulta, aunque no filtramos el departamento
*** este se filtra automáticamente por la restricción puesta.en la funcion
SQL> select ename, job, deptno from scott.emp;
ENAME      JOB                     DEPTNO
---------- ---------                ----------
ALLEN      SALESMAN          30
WARD       SALESMAN          30
MARTIN    SALESMAN          30
BLAKE      MANAGER            30
TURNER    SALESMAN          30
JAMES      CLERK                   30
6 rows selected.

SQL> select * from scott.dept;
    DEPTNO DNAME          LOC
---------- -------------- -------------
        30      SALES          CHICAGO

*** Si queremos borrar la politica
SQL> connect us_pol/test@TEST
Connected.
SQL> BEGIN
  2    DBMS_RLS.DROP_POLICY (object_schema     => 'scott',
  3                          object_name       => 'emp',
  4                          policy_name       => 'Pol_emp');
  5  END;
  6  /
PL/SQL procedure successfully completed.

*** Informacion Acerca de las politicas aplicadas en la Base de datos
(Como usuario Sys )
select object_owner,object_name, policy_name, pf_owner,function from dba_policies
where object_owner='SCOTT';

No hay comentarios:

Publicar un comentario