141020_데이터베이스보안_VPD(Virtual Private Database) - Context
by 담배맛구마VPD 시나리오
영업 사원으로 로그인하면 자신이 관리하는 고객의 정보만을 접근할 수 있도록 vpd 정책을 만들어 보자.
영업관리자(SA_MAN)인 사원(JRUSSEL)의 이메일 계정으로 로그인한다.
select * from customers where account_mgr_id = 145; (JRUSSEL의 MANAGER_ID는 145)
- VPD 정책 적용 후 아래와 같이 조회해 보면 SELECT * FROM customers; 전체 고객이 아니라 자신이 관리하는 고객만 조회된다.
1-1. 정책 함수를 생성한다.
create or replace function check_salesmgr
(p_schema varchar2, p_objname varchar2)
return varchar2
is
v_id number;
v_predicate varchar2(100);
begin
select employee_id
into v_id
from hr.employees
where email = SYS_CONTEXT ('USERENV', 'SESSION_USER');
-- 직무가 영업관리자인 메일 계정(예. 'JRUSSEL' ) 으로 로그인 한다.
v_predicate := 'account_mgr_id = ' || v_id;
return v_predicate;
end;
===================================================================================================================
create or replace function check_salesmgr
(p_schema varchar2, p_objname varchar2)
return varchar2
is
v_id number;
v_job varchar2(100);
v_predicate varchar2(100);
begin
select employee_id, job_id
into v_id, v_job
from hr.employees
where email = SYS_CONTEXT ('USERENV', 'SESSION_USER');
-- 직무가 영업관리자인 메일 계정(예. 'JRUSSEL' ) 으로 로그인 한다.
IF v_job LIKE 'MK%' THEN -- 직무가 마케팅 업무인 경우
v_predicate := ' 1=1 ';
ELSIF v_job = 'SA_MAN' THEN -- 직무가 영업 관리자인 경우
v_predicate := 'account_mgr_id = ' || v_id;
END IF;
return v_predicate;
end;
1-2. dbms_rls.add_policy 프로시저를 실행한다.
BEGIN
dbms_rls.add_policy
(
object_schema => 'hr', -- 누구스키마
object_name => 'employees', -- 어떤 테이블?
policy_name => 'limit_employees', --정책의 이름
policy_function => 'check_customer', -- 정책을 진술해 줄 함수의 이름
statement_types =>'select', -- 어떤 상황에서 정책을 적용할 것인가
);
END;
/
1-3. 영업관리자인 사원의 이메일 계정으로 로그인해서 고객 테이블을 조회한다.
블로그의 정보
정윤상이다.
담배맛구마