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