.

141014_데이터베이스보안_VPD(Virtual Private Database)

by 담배맛구마


1. VPD의 정의


1) Virtual Private Database
2) Provides row-level security at the database table or view level.



2. VPD 동작원리


 Virtual Private Database inserts an additional WHERE clause to any SQL statement




3. VPD 적용 전/후


i) VPD 적용 전

select * from customers; -- (O)

모든 고객의 리스트 조회가 가능하다.


ii) VPD 적용 후

select * from customers; -- (X)

모든 고객의 리스트 조회가 불가능하다.

select * from customers where account_mgr_id = 사원번호; -- (O)

자신이 관리하는 고객들만 조회가 가능하다.

즉, 자신이 해당 테이블을 조회할 권한이 있다고 하더라도 




4. VPD를 사용함으로써 얻는 결과


- 테이블에 행 단위 접근 제어를 할 수 있다.(기존의 View 통해서도 가능하다.)

- sys로 접근하면 VPD가 적용이 안된다.





5. VPD예제(교재p22)


1) VPD를 적용해서 아래 Select의 사용을 제어하겠다.


select

first_name,

job_id,

department_id,

salary,

commission_pct

from

employees;



2) VPD 적용를 적용하겠다.


DBMS_RLS(DBMS Row Level Security) 패키지의 ADD_POLICY 프로시저를 사용해서 VPD를 적용할 수 있다.

여기서 자세한 내용을 볼 수 있다.(http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_rls.htm#ARPLS67721)


i) 정책을 진술해줄 함수를 지정해주어야 한다. ADD_POLICY 프로시저의 파라미터에 필요하다.(policy_function)


CREATE OR REPLACE FUNCTION check_dept

(

p_schema    varchar2,

p_objname      varchar2 

)

return varchar2

IS

v_sql    varchar2(100) := 'department_id = 30' -- 조건절(WHERE)에 쓸 문자열

BEGIN

return (v_sql);

END;

/


ii) DBMS_RLS의 ADD_POLICY 함수를 호출한다.


BEGIN
    dbms_rls.add_policy(

object_schema => 'hr', -- 누구스키마

object_name => 'employees', -- 어떤 테이블?

policy_name => 'limit_employees', --정책의 이름

policy_function => 'check_dept', -- 정책을 진술해 줄 함수의 이름

statement_types =>'select' -- 어떤 상황에서 정책을 적용할 것인가

);

END;

/



3) VPD 정책 제거

BEGIN

dbms_rls.drop_policy('hr', 'employees', 'LIMIT_EMPLOYEES');

END;


※) select * from v$vpd_policy; -- 적용된 VPD정책이 다보여





※) Column단위로 정책 추가

BEGIN

    dbms_rls.add_policy

    (

      object_schema => 'hr', -- 누구스키마

      object_name => 'employees', -- 어떤 테이블?

      policy_name => 'limit_employees', --정책의 이름

      policy_function => 'check_dept', -- 정책을 진술해 줄 함수의 이름

      statement_types =>'select', -- 어떤 상황에서 정책을 적용할 것인가

      sec_relevant_cols => 'salary, commission_pct', -- Masking할 Column 명

      sec_relevant_cols_opt => dbms_rls.ALL_ROWS -- 기본 정보들은 다 보여주되 민감한 정보는 Masking

    );

END;

/




※ ADD_POLICY 프로시저에 대한 레퍼런스 캡쳐 뜸

 (http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_rls.htm#ARPLS67721)






반응형

블로그의 정보

정윤상이다.

담배맛구마

활동하기